Merge mozilla-central to UX
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Sat, 01 Jun 2013 02:45:51 -0700
changeset 164411 918e40dc02a287ed8ee4deedbe155aa91d8ceb11
parent 164410 2b3f3611290801a42727fc17f68a3cf3dc4adeb1 (current diff)
parent 140768 b7344a8ee6f29ab953bf8392e931d59cff2cecde (diff)
child 164412 2c6006ba259cc5351e8a19327189830190e91326
push idunknown
push userunknown
push dateunknown
milestone24.0a1
Merge mozilla-central to UX
addon-sdk/test/moz.build
addon-sdk/test/unit/head.js
addon-sdk/test/unit/test_promise.js
addon-sdk/test/unit/xpcshell.ini
b2g/chrome/content/dbg-webapps-actors.js
browser/app/profile/firefox.js
browser/components/nsBrowserGlue.js
browser/locales/en-US/chrome/browser/browser.properties
browser/metro/components/FormAutoComplete.js
browser/themes/osx/jar.mn
dom/apps/tests/unit/data/app.zip
dom/apps/tests/unit/test_webappsActor.js
gfx/2d/Rect.cpp
js/src/jit-test/tests/ion/bug725062.js
js/src/tests/ecma_5/extensions/legacy-JSON.js
layout/base/nsLayoutUtils.cpp
layout/base/nsLayoutUtils.h
layout/build/gbdate.pl
security/manager/pki/resources/content/cacertexists.xul
widget/android/nsFilePicker.cpp
widget/android/nsFilePicker.h
widget/cocoa/nsNativeThemeCocoa.mm
--- a/accessible/src/atk/AccessibleWrap.cpp
+++ b/accessible/src/atk/AccessibleWrap.cpp
@@ -949,16 +949,21 @@ nsresult
 AccessibleWrap::HandleAccEvent(AccEvent* aEvent)
 {
   nsresult rv = Accessible::HandleAccEvent(aEvent);
   NS_ENSURE_SUCCESS(rv, rv);
 
     Accessible* accessible = aEvent->GetAccessible();
     NS_ENSURE_TRUE(accessible, NS_ERROR_FAILURE);
 
+    // The accessible can become defunct if we have an xpcom event listener
+    // which decides it would be fun to change the DOM and flush layout.
+    if (accessible->IsDefunct())
+        return NS_OK;
+
     uint32_t type = aEvent->GetEventType();
 
     AtkObject* atkObj = AccessibleWrap::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_SHOW ||
--- a/accessible/src/base/NotificationController.cpp
+++ b/accessible/src/base/NotificationController.cpp
@@ -146,16 +146,20 @@ NotificationController::WillRefresh(mozi
 
   // If the document accessible that notification collector was created for is
   // now shut down, don't process notifications anymore.
   NS_ASSERTION(mDocument,
                "The document was shut down while refresh observer is attached!");
   if (!mDocument)
     return;
 
+  if (mObservingState == eRefreshProcessing ||
+      mObservingState == eRefreshProcessingForUpdate)
+    return;
+
   // Any generic notifications should be queued if we're processing content
   // insertions or generic notifications.
   mObservingState = eRefreshProcessingForUpdate;
 
   // Initial accessible tree construction.
   if (!mDocument->HasLoadState(DocAccessible::eTreeConstructed)) {
     // If document is not bound to parent at this point then the document is not
     // ready yet (process notifications later).
@@ -260,28 +264,30 @@ NotificationController::WillRefresh(mozi
       return;
   }
 
   // Process invalidation list of the document after all accessible tree
   // modification are done.
   mDocument->ProcessInvalidationList();
 
   // If a generic notification occurs after this point then we may be allowed to
-  // process it synchronously.
-  mObservingState = eRefreshObserving;
+  // process it synchronously.  However we do not want to reenter if fireing
+  // events causes script to run.
+  mObservingState = eRefreshProcessing;
 
   ProcessEventQueue();
+  mObservingState = eRefreshObserving;
   if (!mDocument)
     return;
 
   // Stop further processing if there are no new notifications of any kind or
   // events and document load is processed.
-  if (mContentInsertions.Length() == 0 && mNotifications.Length() == 0 &&
-      mEvents.Length() == 0 && mTextHash.Count() == 0 &&
-      mHangingChildDocuments.Length() == 0 &&
+  if (mContentInsertions.IsEmpty() && mNotifications.IsEmpty() &&
+      mEvents.IsEmpty() && mTextHash.Count() == 0 &&
+      mHangingChildDocuments.IsEmpty() &&
       mDocument->HasLoadState(DocAccessible::eCompletelyLoaded) &&
       mPresShell->RemoveRefreshObserver(this, Flush_Display)) {
     mObservingState = eNotObservingRefresh;
   }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Notification controller: text leaf accessible text update
--- a/accessible/src/base/NotificationController.h
+++ b/accessible/src/base/NotificationController.h
@@ -207,16 +207,17 @@ private:
 private:
   /**
    * Indicates whether we're waiting on an event queue processing from our
    * notification controller to flush events.
    */
   enum eObservingState {
     eNotObservingRefresh,
     eRefreshObserving,
+    eRefreshProcessing,
     eRefreshProcessingForUpdate
   };
   eObservingState mObservingState;
 
   /**
    * The presshell of the document accessible.
    */
   nsIPresShell* mPresShell;
--- a/accessible/src/html/HTMLFormControlAccessible.cpp
+++ b/accessible/src/html/HTMLFormControlAccessible.cpp
@@ -447,23 +447,19 @@ HTMLTextFieldAccessible::GetActionName(u
     return NS_OK;
   }
   return NS_ERROR_INVALID_ARG;
 }
 
 NS_IMETHODIMP
 HTMLTextFieldAccessible::DoAction(uint8_t aIndex)
 {
-  if (aIndex == 0) {
-    HTMLInputElement* element = HTMLInputElement::FromContent(mContent);
-    if (element)
-      return element->Focus();
+  if (aIndex == 0)
+    return TakeFocus();
 
-    return NS_ERROR_FAILURE;
-  }
   return NS_ERROR_INVALID_ARG;
 }
 
 already_AddRefed<nsIEditor>
 HTMLTextFieldAccessible::GetEditor() const
 {
   nsCOMPtr<nsIDOMNSEditableElement> editableElt(do_QueryInterface(mContent));
   if (!editableElt)
--- a/accessible/src/jsat/UtteranceGenerator.jsm
+++ b/accessible/src/jsat/UtteranceGenerator.jsm
@@ -393,16 +393,20 @@ this.UtteranceGenerator = {
     if (aStates.base & Ci.nsIAccessibleStates.STATE_REQUIRED) {
       stateUtterances.push(gStringBundle.GetStringFromName('stateRequired'));
     }
 
     if (aStates.base & Ci.nsIAccessibleStates.STATE_TRAVERSED) {
       stateUtterances.push(gStringBundle.GetStringFromName('stateTraversed'));
     }
 
+    if (aStates.base & Ci.nsIAccessibleStates.STATE_HASPOPUP) {
+      stateUtterances.push(gStringBundle.GetStringFromName('stateHasPopup'));
+    }
+
     return stateUtterances;
   },
 
   _getListUtterance: function _getListUtterance(aAccessible, aRoleStr, aFlags, aItemCount) {
     let desc = [];
     let roleStr = this._getLocalizedRole(aRoleStr);
     if (roleStr)
       desc.push(roleStr);
--- a/accessible/tests/mochitest/actions.js
+++ b/accessible/tests/mochitest/actions.js
@@ -1,18 +1,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Event constants
 
 const MOUSEDOWN_EVENT = 1;
 const MOUSEUP_EVENT = 2;
 const CLICK_EVENT = 4;
 const COMMAND_EVENT = 8;
+const FOCUS_EVENT = 16;
 
 const CLICK_EVENTS = MOUSEDOWN_EVENT | MOUSEUP_EVENT | CLICK_EVENT;
-const ALL_EVENTS = CLICK_EVENTS | COMMAND_EVENT;
+const XUL_EVENTS = CLICK_EVENTS | COMMAND_EVENT;
 
 ////////////////////////////////////////////////////////////////////////////////
 // Public functions
 
 /**
  * Test default accessible actions.
  *
  * Action tester interface is:
@@ -69,16 +70,19 @@ function testActions(aArray)
       if (events & MOUSEUP_EVENT)
         eventSeq.push(new checkerOfActionInvoker("mouseup", elm));
 
       if (events & CLICK_EVENT)
         eventSeq.push(new checkerOfActionInvoker("click", elm, actionObj));
 
       if (events & COMMAND_EVENT)
         eventSeq.push(new checkerOfActionInvoker("command", elm));
+
+      if (events & FOCUS_EVENT)
+        eventSeq.push(new focusChecker(elm));
     }
 
     if (actionObj.eventSeq)
       eventSeq = eventSeq.concat(actionObj.eventSeq);
 
     var invoker = new actionInvoker(accOrElmOrID, actionIndex, actionName,
                                     eventSeq);
     gActionsQueue.push(invoker);
--- a/accessible/tests/mochitest/actions/test_controls.html
+++ b/accessible/tests/mochitest/actions/test_controls.html
@@ -7,16 +7,20 @@
         href="chrome://mochikit/content/tests/SimpleTest/test.css" />
 
   <script type="application/javascript"
           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
 
   <script type="application/javascript"
           src="../common.js"></script>
   <script type="application/javascript"
+          src="../role.js"></script>
+  <script type="application/javascript"
+          src="../states.js"></script>
+  <script type="application/javascript"
           src="../events.js"></script>
   <script type="application/javascript"
           src="../actions.js"></script>
 
   <script type="application/javascript">
     function doTest()
     {
       var actionsArray = [
@@ -44,17 +48,28 @@
           ID: "checkbox_mixed",
           actionName: "cycle",
           events: CLICK_EVENTS
         },
         {
           ID: "radio",
           actionName: "select",
           events: CLICK_EVENTS
+        },
+        {
+          ID: "textarea",
+          actionName: "activate",
+          events: FOCUS_EVENT
+        },
+        {
+          ID: "textinput",
+          actionName: "activate",
+          events: FOCUS_EVENT
         }
+
       ];
       document.getElementById("checkbox_mixed").indeterminate = true;
 
       testActions(actionsArray);
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTest);
@@ -81,10 +96,14 @@
 
   <input id="checkbox_checked" type="checkbox" checked="true">Checkbox</input>
 
   <input id="checkbox_mixed" type="checkbox">Checkbox</input>
 
   <fieldset>
     <input id="radio" type="radio">Radio</input>
   </fieldset>
+
+  <textarea id="textarea" placeholder="What's happening?"></textarea>
+
+  <input id="textinput" type="text">
 </body>
 </html>
--- a/accessible/tests/mochitest/actions/test_general.xul
+++ b/accessible/tests/mochitest/actions/test_general.xul
@@ -43,22 +43,22 @@
         {
           ID: "submenu",
           actionName: "click",
           events: CLICK_EVENTS
         },
         {
           ID: "menuitem",
           actionName: "click",
-          events: ALL_EVENTS
+          events: XUL_EVENTS
         },
         {
           ID: "button",
           actionName: "press",
-          events: ALL_EVENTS
+          events: XUL_EVENTS
         },
         {
           ID: "buttonmenu",
           actionName: "press",
           events: CLICK_EVENTS
         },
         {
           ID: "labelWithPopup",
--- a/accessible/tests/mochitest/actions/test_link.html
+++ b/accessible/tests/mochitest/actions/test_link.html
@@ -12,20 +12,16 @@
   <script type="application/javascript"
           src="../common.js"></script>
   <script type="application/javascript"
           src="../events.js"></script>
   <script type="application/javascript"
           src="../actions.js"></script>
 
   <script type="application/javascript">
-    if (navigator.platform.startsWith("Linux")) {
-      SimpleTest.expectAssertions(2);
-    }
-
     function getAnchorTargetDocumentAcc()
     {
       var thisTabDocAcc = getTabDocAccessible();
       var thisDocTabPanelAcc = thisTabDocAcc.parent.parent;
       var tabPanelsAcc = thisDocTabPanelAcc.parent;
       var newDocTabPanelAcc = tabPanelsAcc.lastChild.firstChild;
       return newDocTabPanelAcc.firstChild;
     }
--- a/accessible/tests/mochitest/attributes/test_obj.html
+++ b/accessible/tests/mochitest/attributes/test_obj.html
@@ -14,20 +14,16 @@ https://bugzilla.mozilla.org/show_bug.cg
           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
 
   <script type="application/javascript"
           src="../common.js"></script>
   <script type="application/javascript"
           src="../attributes.js"></script>
 
   <script type="application/javascript">
-    if (navigator.platform.startsWith("Linux")) {
-      SimpleTest.expectAssertions(0, 1);
-    }
-
     function doTest()
     {
       // aria
       testAttrs("atomic", {"atomic" : "true"}, true);
       testAttrs("autocomplete", {"autocomplete" : "true"}, true);
       testAttrs("checkbox", {"checkable" : "true"}, true); 
       testAttrs("checkedCheckbox", {"checkable" : "true"}, true); 
       testAttrs("checkedMenuitem", {"checkable" : "true"}, true); 
--- a/accessible/tests/mochitest/events/test_focus_dialog.html
+++ b/accessible/tests/mochitest/events/test_focus_dialog.html
@@ -16,20 +16,16 @@
   <script type="application/javascript"
           src="../events.js"></script>
   <script type="application/javascript"
           src="../role.js"></script>
   <script type="application/javascript"
           src="../states.js"></script>
 
   <script type="application/javascript">
-    if (!navigator.platform.startsWith("Linux")) {
-      SimpleTest.expectAssertions(0, 1);
-    }
-
     function openCloseDialog(aID)
     {
       this.eventSeq = [
         new focusChecker(getNode(aID))
       ];
 
       this.invoke = function openCloseDialog_invoke()
       {
--- a/accessible/tests/mochitest/events/test_focus_doc.html
+++ b/accessible/tests/mochitest/events/test_focus_doc.html
@@ -16,20 +16,16 @@
   <script type="application/javascript"
     src="../events.js"></script>
   <script type="application/javascript"
           src="../role.js"></script>
     <script type="application/javascript"
       src="../states.js"></script>
 
   <script type="application/javascript">
-    if (navigator.platform.startsWith("Win")) {
-      SimpleTest.expectAssertions(0, 1);
-    }
-
     var gQueue = null;
 
     //var gA11yEventDumpID = "eventdump";
     //gA11yEventDumpToConsole = true;
 
     function doTests()
     {
       // setup
--- a/addon-sdk/moz.build
+++ b/addon-sdk/moz.build
@@ -1,8 +1,6 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-TEST_DIRS += ['test']
-
deleted file mode 100644
--- a/addon-sdk/test/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-MODULE = 'test_addon_sdk'
-
-XPCSHELL_TESTS_MANIFESTS += ['unit/xpcshell.ini']
deleted file mode 100644
--- a/addon-sdk/test/unit/head.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-
-Components.utils.import("resource://gre/modules/commonjs/sdk/core/promise.js");
-
-let run_promise_tests = function run_promise_tests(tests, cb) {
-  let timer = Components.classes["@mozilla.org/timer;1"]
-     .createInstance(Components.interfaces.nsITimer);
-  let loop = function loop(index) {
-    if (index >= tests.length) {
-      if (cb) {
-        cb.call();
-      }
-      return;
-    }
-    do_print("Launching test " + (index + 1) + "/" + tests.length);
-    let test = tests[index];
-    // Execute from an empty stack
-    let next = function next() {
-      do_print("Test " + (index + 1) + "/" + tests.length + " complete");
-      do_execute_soon(function() {
-        loop(index + 1);
-      });
-    };
-    let result = test();
-    result.then(next, next);
-  };
-  return loop(0);
-};
-
-let make_promise_test = function(test) {
-  return function runtest() {
-    do_print("Test starting: " + test);
-    try {
-      let result = test();
-      if (result && "promise" in result) {
-        result = result.promise;
-      }
-      if (!result || !("then" in result)) {
-        let exn;
-        try {
-          do_throw("Test " + test + " did not return a promise: " + result);
-        } catch (x) {
-          exn = x;
-        }
-        return Promise.reject(exn);
-      }
-      // The test returns a promise
-      result = result.then(
-        // Test complete
-        function onResolve() {
-          do_print("Test complete: " + test);
-        },
-        // The test failed with an unexpected error
-        function onReject(err) {
-          let detail;
-          if (err && typeof err == "object" && "stack" in err) {
-            detail = err.stack;
-          } else {
-            detail = "(no stack)";
-          }
-          do_throw("Test " + test + " rejected with the following reason: "
-              + err + detail);
-      });
-      return result;
-    } catch (x) {
-      // The test failed because of an error outside of a promise
-      do_throw("Error in body of test " + test + ": " + x + " at " + x.stack);
-      return Promise.reject();
-    }
-  };
-};
-
deleted file mode 100644
--- a/addon-sdk/test/unit/xpcshell.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[DEFAULT]
-head = head.js
-tail = 
-
-[test_promise.js]
--- a/b2g/app/Makefile.in
+++ b/b2g/app/Makefile.in
@@ -134,16 +134,17 @@ libs repackage:: $(libs-preqs)
 	$(RM) $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/mangle $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/shlibsign
 ifdef LIBXUL_SDK
 	cp $(LIBXUL_DIST)/bin/xulrunner$(BIN_SUFFIX) $(DIST)/$(APP_NAME).app/Contents/MacOS/$(APP_BINARY)
 	rsync -a --exclude nsinstall --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(DIST)/$(APP_NAME).app/Contents/Frameworks
 else
 	$(RM) $(DIST)/$(APP_NAME).app/Contents/MacOS/$(PROGRAM)
 	rsync -aL $(PROGRAM) $(DIST)/$(APP_NAME).app/Contents/MacOS
 endif
+	cp -RL $(srcdir)/b2g.icns $(DIST)/$(APP_NAME).app/Contents/Resources/$(MOZ_APP_NAME).icns
 	printf "APPLMOZB" > $(DIST)/$(APP_NAME).app/Contents/PkgInfo
 
 else # MOZ_WIDGET_TOOLKIT != cocoa
 
 libs::
 ifdef LIBXUL_SDK
 	cp $(LIBXUL_DIST)/bin/xulrunner-stub$(BIN_SUFFIX) $(DIST)/bin/$(APP_BINARY)
 endif
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..eba850aaee10662fa3bc796ac97ec59e4c3b5df8
GIT binary patch
literal 11953
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
--- a/b2g/chrome/content/shell.js
+++ b/b2g/chrome/content/shell.js
@@ -1004,17 +1004,17 @@ let RemoteDebugger = {
       DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/webconsole.js");
       DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/gcli.js");
 #endif
       if ("nsIProfiler" in Ci) {
         DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/profiler.js");
       }
       DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/styleeditor.js");
       DebuggerServer.addActors('chrome://browser/content/dbg-browser-actors.js');
-      DebuggerServer.addActors('chrome://browser/content/dbg-webapps-actors.js');
+      DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/webapps.js");
     }
 
     let port = Services.prefs.getIntPref('devtools.debugger.remote-port') || 6000;
     try {
       DebuggerServer.openListener(port);
     } catch (e) {
       dump('Unable to start debugger server: ' + e + '\n');
     }
--- a/b2g/chrome/jar.mn
+++ b/b2g/chrome/jar.mn
@@ -5,17 +5,16 @@
 
 
 chrome.jar:
 % content branding %content/branding/
 % content browser %content/
 
   content/arrow.svg                     (content/arrow.svg)
 * content/dbg-browser-actors.js         (content/dbg-browser-actors.js)
-* content/dbg-webapps-actors.js         (content/dbg-webapps-actors.js)
   content/forms.js                      (content/forms.js)
 * content/settings.js                   (content/settings.js)
 * content/shell.xul                     (content/shell.xul)
 * content/shell.js                      (content/shell.js)
 #ifndef ANDROID
   content/screen.js                     (content/screen.js)
   content/runapp.js                     (content/runapp.js)
 #endif
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -46,17 +46,17 @@ pref("extensions.getAddons.recommended.u
 
 // Blocklist preferences
 pref("extensions.blocklist.enabled", true);
 pref("extensions.blocklist.interval", 86400);
 // Controls what level the blocklist switches from warning about items to forcibly
 // blocking them.
 pref("extensions.blocklist.level", 2);
 pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/3/%APP_ID%/%APP_VERSION%/%PRODUCT%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/%PING_COUNT%/%TOTAL_PING_COUNT%/%DAYS_SINCE_LAST_PING%/");
-pref("extensions.blocklist.detailsURL", "https://www.mozilla.com/%LOCALE%/blocklist/");
+pref("extensions.blocklist.detailsURL", "https://www.mozilla.org/%LOCALE%/blocklist/");
 pref("extensions.blocklist.itemURL", "https://addons.mozilla.org/%LOCALE%/%APP%/blocked/%blockID%");
 
 pref("extensions.update.autoUpdateDefault", true);
 
 pref("extensions.hotfix.id", "firefox-hotfix@mozilla.org");
 pref("extensions.hotfix.cert.checkAttributes", true);
 pref("extensions.hotfix.certs.1.sha1Fingerprint", "CA:C4:7D:BF:63:4D:24:E9:DC:93:07:2F:E3:C8:EA:6D:C3:94:6E:89");
 
@@ -222,16 +222,17 @@ pref("general.autoScroll", false);
 #else
 pref("general.autoScroll", true);
 #endif
 
 pref("general.useragent.complexOverride.moodle", false); // bug 797703
 
 // At startup, check if we're the default browser and prompt user if not.
 pref("browser.shell.checkDefaultBrowser", true);
+pref("browser.shell.shortcutFavicons",true);
 
 // 0 = blank, 1 = home (browser.startup.homepage), 2 = last visited page, 3 = resume previous browser session
 // The behavior of option 3 is detailed at: http://wiki.mozilla.org/Session_Restore
 pref("browser.startup.page",                1);
 pref("browser.startup.homepage",            "chrome://branding/locale/browserconfig.properties");
 
 pref("browser.slowStartup.notificationDisabled", false);
 pref("browser.slowStartup.timeThreshold", 60000);
@@ -747,17 +748,17 @@ pref("browser.safebrowsing.keyURL", "htt
 pref("browser.safebrowsing.gethashURL", "http://safebrowsing.clients.google.com/safebrowsing/gethash?client=SAFEBROWSING_ID&appver=%VERSION%&pver=2.2");
 pref("browser.safebrowsing.reportURL", "http://safebrowsing.clients.google.com/safebrowsing/report?");
 pref("browser.safebrowsing.reportGenericURL", "http://%LOCALE%.phish-generic.mozilla.com/?hl=%LOCALE%");
 pref("browser.safebrowsing.reportErrorURL", "http://%LOCALE%.phish-error.mozilla.com/?hl=%LOCALE%");
 pref("browser.safebrowsing.reportPhishURL", "http://%LOCALE%.phish-report.mozilla.com/?hl=%LOCALE%");
 pref("browser.safebrowsing.reportMalwareURL", "http://%LOCALE%.malware-report.mozilla.com/?hl=%LOCALE%");
 pref("browser.safebrowsing.reportMalwareErrorURL", "http://%LOCALE%.malware-error.mozilla.com/?hl=%LOCALE%");
 
-pref("browser.safebrowsing.warning.infoURL", "http://www.mozilla.com/%LOCALE%/firefox/phishing-protection/");
+pref("browser.safebrowsing.warning.infoURL", "https://www.mozilla.org/%LOCALE%/firefox/phishing-protection/");
 pref("browser.safebrowsing.malware.reportURL", "http://safebrowsing.clients.google.com/safebrowsing/diagnostic?client=%NAME%&hl=%LOCALE%&site=");
 
 #ifdef MOZILLA_OFFICIAL
 // Normally the "client ID" sent in updates is appinfo.name, but for
 // official Firefox releases from Mozilla we use a special identifier.
 pref("browser.safebrowsing.id", "navclient-auto-ffox");
 #endif
 
@@ -890,17 +891,17 @@ pref("toolkit.crashreporter.pluginHangSu
      "https://hang-reports.mozilla.org/submit");
 #endif
 
 // URL for "Learn More" for Crash Reporter
 pref("toolkit.crashreporter.infoURL",
      "https://www.mozilla.org/legal/privacy/firefox.html#crash-reporter");
 
 // base URL for web-based support pages
-pref("app.support.baseURL", "http://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/");
+pref("app.support.baseURL", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/");
 
 // Name of alternate about: page for certificate errors (when undefined, defaults to about:neterror)
 pref("security.alternate_certificate_error_page", "certerror");
 
 // Whether to start the private browsing mode at application startup
 pref("browser.privatebrowsing.autostart", false);
 
 // Don't try to alter this pref, it'll be reset the next time you use the
--- a/browser/base/content/aboutDialog.xul
+++ b/browser/base/content/aboutDialog.xul
@@ -112,17 +112,17 @@
           </description>
         </vbox>
       </vbox>
     </hbox>
     <vbox id="bottomBox">
       <hbox pack="center">
         <label class="text-link bottom-link" href="about:license">&bottomLinks.license;</label>
         <label class="text-link bottom-link" href="about:rights">&bottomLinks.rights;</label>
-        <label class="text-link bottom-link" href="http://www.mozilla.com/legal/privacy/">&bottomLinks.privacy;</label>
+        <label class="text-link bottom-link" href="https://www.mozilla.org/legal/privacy/">&bottomLinks.privacy;</label>
       </hbox>
       <description id="trademark">&trademarkInfo.part1;</description>
     </vbox>
   </vbox>
   
   <keyset>
     <key keycode="VK_ESCAPE" oncommand="window.close();"/>
   </keyset>
--- a/browser/base/content/browser-social.js
+++ b/browser/base/content/browser-social.js
@@ -402,17 +402,21 @@ function sizeSocialPanelToContent(panel,
     body = doc.getElementById(bodyId) || doc.body;
   }
   // offsetHeight/Width don't include margins, so account for that.
   let cs = doc.defaultView.getComputedStyle(body);
   let computedHeight = parseInt(cs.marginTop) + body.offsetHeight + parseInt(cs.marginBottom);
   let height = Math.max(computedHeight, PANEL_MIN_HEIGHT);
   let computedWidth = parseInt(cs.marginLeft) + body.offsetWidth + parseInt(cs.marginRight);
   let width = Math.max(computedWidth, PANEL_MIN_WIDTH);
-  panel.sizeTo(width, height);
+  iframe.style.width = width + "px";
+  iframe.style.height = height + "px";
+  // since we do not use panel.sizeTo, we need to adjust the arrow ourselves
+  if (panel.state == "open")
+    panel.adjustArrowPosition();
 }
 
 function DynamicResizeWatcher() {
   this._mutationObserver = null;
 }
 
 DynamicResizeWatcher.prototype = {
   start: function DynamicResizeWatcher_start(panel, iframe) {
--- a/browser/base/content/test/social/browser_social_flyout.js
+++ b/browser/base/content/test/social/browser_social_flyout.js
@@ -53,24 +53,36 @@ var tests = {
     ok(port, "provider has a port");
     port.onmessage = function (e) {
       let topic = e.data.topic;
       switch (topic) {
         case "test-init-done":
           port.postMessage({topic: "test-flyout-open"});
           break;
         case "got-flyout-visibility":
-          // The width of the flyout should be 250px
+          if (e.data.result != "shown")
+            return;
+          // The width of the flyout should be 400px initially
           let iframe = panel.firstChild;
-          let cs = iframe.contentWindow.getComputedStyle(iframe.contentDocument.body);
-          is(cs.width, "250px", "should be 250px wide");
-          iframe.contentDocument.addEventListener("SocialTest-DoneMakeWider", function _doneHandler() {
-            iframe.contentDocument.removeEventListener("SocialTest-DoneMakeWider", _doneHandler, false);
-            cs = iframe.contentWindow.getComputedStyle(iframe.contentDocument.body);
+          let body = iframe.contentDocument.body;
+          let cs = iframe.contentWindow.getComputedStyle(body);
+
+          is(cs.width, "400px", "should be 400px wide");
+          is(iframe.boxObject.width, 400, "iframe should now be 400px wide");
+          is(cs.height, "400px", "should be 400px high");
+          is(iframe.boxObject.height, 400, "iframe should now be 400px high");
+
+          iframe.contentWindow.addEventListener("resize", function _doneHandler() {
+            iframe.contentWindow.removeEventListener("resize", _doneHandler, false);
+            cs = iframe.contentWindow.getComputedStyle(body);
+
             is(cs.width, "500px", "should now be 500px wide");
+            is(iframe.boxObject.width, 500, "iframe should now be 500px wide");
+            is(cs.height, "500px", "should now be 500px high");
+            is(iframe.boxObject.height, 500, "iframe should now be 500px high");
             panel.hidePopup();
             port.close();
             next();
           }, false);
           SocialFlyout.dispatchPanelEvent("socialTest-MakeWider");
           break;
       }
     }
--- a/browser/base/content/test/social/social_flyout.html
+++ b/browser/base/content/test/social/social_flyout.html
@@ -10,28 +10,28 @@
         var port = navigator.mozSocial.getWorker().port;
         port.postMessage({topic: "flyout-visibility", result: "shown"});
       }, false);
       window.addEventListener("socialFrameHide", function(e) {
         var port = navigator.mozSocial.getWorker().port;
         port.postMessage({topic: "flyout-visibility", result: "hidden"});
       }, false);
       window.addEventListener("socialTest-MakeWider", function(e) {
-        document.body.setAttribute("style", "width: 500px;");
+        document.body.setAttribute("style", "width: 500px; height: 500px; margin: 0; overflow: hidden;");
         document.body.offsetWidth; // force a layout flush
         var evt = document.createEvent("CustomEvent");
         evt.initCustomEvent("SocialTest-DoneMakeWider", true, true, {});
         document.documentElement.dispatchEvent(evt);
       }, false);
       window.addEventListener("socialTest-CloseSelf", function(e) {
         window.close();
         var evt = document.createEvent("CustomEvent");
         evt.initCustomEvent("SocialTest-DoneCloseSelf", true, true, {});
         document.documentElement.dispatchEvent(evt);
       }, false);
     </script>
   </head>
-  <body style="max-width: 250px;" onload="pingWorker();">
+  <body style="width: 400px; height: 400px; margin: 0; overflow: hidden;" onload="pingWorker();">
     <p>This is a test social flyout panel.</p>
     <a id="traversal" href="http://mochi.test">test link</a>
   </body>
 </html>
 
--- a/browser/branding/aurora/pref/firefox-branding.js
+++ b/browser/branding/aurora/pref/firefox-branding.js
@@ -11,22 +11,18 @@ pref("startup.homepage_welcome_url","");
 pref("app.update.interval", 28800); // 8 hours
 // The time interval between the downloading of mar file chunks in the
 // background (in seconds)
 pref("app.update.download.backgroundInterval", 60);
 // Give the user x seconds to react before showing the big UI. default=24 hours
 pref("app.update.promptWaitTime", 86400);
 // URL user can browse to manually if for some reason all update installation
 // attempts fail.
-pref("app.update.url.manual", "http://www.mozilla.com/firefox/channel/");
+pref("app.update.url.manual", "https://www.mozilla.org/firefox/aurora/");
 // A default value for the "More information about this update" link
 // supplied in the "An update is available" page of the update wizard. 
-pref("app.update.url.details", "http://www.mozilla.org/projects/firefox/");
-
-// Release notes and vendor URLs
-pref("app.releaseNotesURL", "http://www.mozilla.org/projects/firefox/%VERSION%/releasenotes/");
-pref("app.vendorURL", "http://www.mozilla.org/projects/firefox/");
+pref("app.update.url.details", "https://www.mozilla.org/firefox/aurora/");
 
 // Search codes belong only in builds with official branding
 pref("browser.search.param.yahoo-fr", "");
 pref("browser.search.param.yahoo-fr-cjkt", ""); // now unused
 pref("browser.search.param.yahoo-fr-ja", "");
 pref("browser.search.param.yahoo-f-CN", "");
--- a/browser/branding/nightly/pref/firefox-branding.js
+++ b/browser/branding/nightly/pref/firefox-branding.js
@@ -1,29 +1,25 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-pref("startup.homepage_override_url","http://www.mozilla.org/projects/firefox/%VERSION%/whatsnew/?oldversion=%OLD_VERSION%");
-pref("startup.homepage_welcome_url","http://www.mozilla.org/projects/firefox/%VERSION%/firstrun/");
+pref("startup.homepage_override_url","");
+pref("startup.homepage_welcome_url","");
 // The time interval between checks for a new version (in seconds)
 pref("app.update.interval", 7200); // 2 hours
 // The time interval between the downloading of mar file chunks in the
 // background (in seconds)
 pref("app.update.download.backgroundInterval", 60);
 // Give the user x seconds to react before showing the big UI. default=12 hours
 pref("app.update.promptWaitTime", 43200);
 // URL user can browse to manually if for some reason all update installation
 // attempts fail.
-pref("app.update.url.manual", "http://nightly.mozilla.org/");
+pref("app.update.url.manual", "https://nightly.mozilla.org");
 // A default value for the "More information about this update" link
 // supplied in the "An update is available" page of the update wizard. 
-pref("app.update.url.details", "http://www.mozilla.org/projects/firefox/");
-
-// Release notes and vendor URLs
-pref("app.releaseNotesURL", "http://www.mozilla.org/projects/firefox/%VERSION%/releasenotes/");
-pref("app.vendorURL", "http://www.mozilla.org/projects/firefox/");
+pref("app.update.url.details", "https://nightly.mozilla.org");
 
 // Search codes belong only in builds with official branding
 pref("browser.search.param.yahoo-fr", "");
 pref("browser.search.param.yahoo-fr-cjkt", ""); // now unused
 pref("browser.search.param.yahoo-fr-ja", "");
 pref("browser.search.param.yahoo-f-CN", "");
--- a/browser/branding/official/branding.nsi
+++ b/browser/branding/official/branding.nsi
@@ -5,18 +5,18 @@
 # NSIS branding defines for official release builds.
 # The nightly build branding.nsi is located in browser/installer/windows/nsis/
 # The unofficial build branding.nsi is located in browser/branding/unofficial/
 
 # BrandFullNameInternal is used for some registry and file system values
 # instead of BrandFullName and typically should not be modified.
 !define BrandFullNameInternal "Mozilla Firefox"
 !define CompanyName           "Mozilla Corporation"
-!define URLInfoAbout          "http://www.mozilla.com/${AB_CD}/"
-!define URLUpdateInfo         "http://www.mozilla.com/${AB_CD}/firefox/"
+!define URLInfoAbout          "https://www.mozilla.org/${AB_CD}/"
+!define URLUpdateInfo         "https://www.mozilla.org/${AB_CD}/firefox/"
 
 ; The OFFICIAL define is a workaround to support different urls for Release and
 ; Beta since they share the same branding when building with other branches that
 ; set the update channel to beta.
 !define OFFICIAL
 !define URLStubDownload "http://download.mozilla.org/?product=firefox-latest&os=win&lang=${AB_CD}"
 !define URLManualDownload "https://www.mozilla.org/${AB_CD}/firefox/installer-help/?channel=release&installer_lang=${AB_CD}"
 !define Channel "release"
--- a/browser/branding/official/pref/firefox-branding.js
+++ b/browser/branding/official/pref/firefox-branding.js
@@ -1,28 +1,24 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-pref("startup.homepage_override_url","http://www.mozilla.com/%LOCALE%/firefox/%VERSION%/whatsnew/?oldversion=%OLD_VERSION%");
-pref("startup.homepage_welcome_url","http://www.mozilla.com/%LOCALE%/firefox/%VERSION%/firstrun/");
+pref("startup.homepage_override_url","https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/whatsnew/?oldversion=%OLD_VERSION%");
+pref("startup.homepage_welcome_url","https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/firstrun/");
 // Interval: Time between checks for a new version (in seconds)
 pref("app.update.interval", 43200); // 12 hours
 // The time interval between the downloading of mar file chunks in the
 // background (in seconds)
 pref("app.update.download.backgroundInterval", 60);
 // Give the user x seconds to react before showing the big UI. default=24 hours
 pref("app.update.promptWaitTime", 86400);
 // URL user can browse to manually if for some reason all update installation
 // attempts fail.
-pref("app.update.url.manual", "http://www.firefox.com");
+pref("app.update.url.manual", "https://www.mozilla.org/firefox/");
 // A default value for the "More information about this update" link
 // supplied in the "An update is available" page of the update wizard. 
-pref("app.update.url.details", "http://www.mozilla.com/%LOCALE%/firefox/releases/");
-
-// Release notes and vendor URLs
-pref("app.releaseNotesURL", "http://www.mozilla.com/%LOCALE%/firefox/%VERSION%/releasenotes/");
-pref("app.vendorURL", "http://www.mozilla.com/%LOCALE%/firefox/");
+pref("app.update.url.details", "https://www.mozilla.org/%LOCALE%/firefox/notes");
 
 pref("browser.search.param.ms-pc", "MOZI");
 pref("browser.search.param.yahoo-fr", "moz35");
 pref("browser.search.param.yahoo-fr-cjkt", "moz35"); // now unused
 pref("browser.search.param.yahoo-fr-ja", "mozff");
--- a/browser/branding/unofficial/pref/firefox-branding.js
+++ b/browser/branding/unofficial/pref/firefox-branding.js
@@ -1,29 +1,25 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-pref("startup.homepage_override_url","http://www.mozilla.org/projects/firefox/%VERSION%/whatsnew/");
-pref("startup.homepage_welcome_url","http://www.mozilla.org/projects/firefox/%VERSION%/firstrun/");
+pref("startup.homepage_override_url","");
+pref("startup.homepage_welcome_url","");
 // The time interval between checks for a new version (in seconds)
 pref("app.update.interval", 86400); // 24 hours
 // The time interval between the downloading of mar file chunks in the
 // background (in seconds)
 pref("app.update.download.backgroundInterval", 60);
 // Give the user x seconds to react before showing the big UI. default=24 hours
 pref("app.update.promptWaitTime", 86400);
 // URL user can browse to manually if for some reason all update installation
 // attempts fail.
-pref("app.update.url.manual", "http://www.mozilla.org/products/firefox/");
+pref("app.update.url.manual", "https://nightly.mozilla.org");
 // A default value for the "More information about this update" link
 // supplied in the "An update is available" page of the update wizard. 
-pref("app.update.url.details", "http://www.mozilla.org/projects/firefox/");
-
-// Release notes and vendor URLs
-pref("app.releaseNotesURL", "http://www.mozilla.org/projects/firefox/%VERSION%/releasenotes/");
-pref("app.vendorURL", "http://www.mozilla.org/projects/firefox/");
+pref("app.update.url.details", "https://nightly.mozilla.org");
 
 // Search codes belong only in builds with official branding
 pref("browser.search.param.yahoo-fr", "");
 pref("browser.search.param.yahoo-fr-cjkt", ""); // now unused
 pref("browser.search.param.yahoo-fr-ja", "");
 pref("browser.search.param.yahoo-f-CN", "");
--- a/browser/components/downloads/content/allDownloadsViewOverlay.js
+++ b/browser/components/downloads/content/allDownloadsViewOverlay.js
@@ -987,27 +987,29 @@ DownloadsPlacesView.prototype = {
     if (!aDocumentFragment) {
       this._ensureVisibleElementsAreActive();
       goUpdateCommand("downloadsCmd_clearDownloads");
     }
   },
 
   _removeElement: function DPV__removeElement(aElement) {
     // If the element was selected exclusively, select its next
-    // sibling first, if any.
-    if (aElement.nextSibling &&
+    // sibling first, if not, try for previous sibling, if any.
+    if ((aElement.nextSibling || aElement.previousSibling) &&
         this._richlistbox.selectedItems &&
-        this._richlistbox.selectedItems.length > 0 &&
+        this._richlistbox.selectedItems.length == 1 &&
         this._richlistbox.selectedItems[0] == aElement) {
-      this._richlistbox.selectItem(aElement.nextSibling);
+      this._richlistbox.selectItem(aElement.nextSibling ||
+                                   aElement.previousSibling);
     }
 
     if (this._lastSessionDownloadElement == aElement)
       this._lastSessionDownloadElement = aElement.previousSibling;
 
+    this._richlistbox.removeItemFromSelection(aElement);
     this._richlistbox.removeChild(aElement);
     this._ensureVisibleElementsAreActive();
     goUpdateCommand("downloadsCmd_clearDownloads");
   },
 
   _removeHistoryDownloadFromView:
   function DPV__removeHistoryDownloadFromView(aPlacesNode) {
     let downloadURI = aPlacesNode.uri;
@@ -1456,17 +1458,21 @@ DownloadsPlacesView.prototype = {
             .getService(Ci.nsIDownloadHistory)
             .removeAllDownloads();
         }
         // There may be no selection or focus change as a result
         // of these change, and we want the command updated immediately.
         goUpdateCommand("downloadsCmd_clearDownloads");
         break;
       default: {
-        let selectedElements = this._richlistbox.selectedItems;
+        // Slicing the array to get a freezed list of selected items. Otherwise,
+        // the selectedItems array is live and doCommand may alter the selection
+        // while we are trying to do one particular action, like removing items
+        // from history.
+        let selectedElements = this._richlistbox.selectedItems.slice();
         for (let element of selectedElements) {
           element._shell.doCommand(aCommand);
         }
       }
     }
   },
 
   onEvent: function() { },
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -500,17 +500,17 @@ BrowserGlue.prototype = {
   // the first browser window has finished initializing
   _onFirstWindowLoaded: function BG__onFirstWindowLoaded() {
 #ifdef XP_WIN
     // For windows seven, initialize the jump list module.
     const WINTASKBAR_CONTRACTID = "@mozilla.org/windows-taskbar;1";
     if (WINTASKBAR_CONTRACTID in Cc &&
         Cc[WINTASKBAR_CONTRACTID].getService(Ci.nsIWinTaskbar).available) {
       let temp = {};
-      Cu.import("resource://gre/modules/WindowsJumpLists.jsm", temp);
+      Cu.import("resource:///modules/WindowsJumpLists.jsm", temp);
       temp.WinTaskbarJumpList.startup();
     }
 #endif
 
     this._trackSlowStartup();
   },
 
   /**
@@ -575,19 +575,27 @@ BrowserGlue.prototype = {
       let willRecoverSession = false;
       try {
         let ss = Cc["@mozilla.org/browser/sessionstartup;1"].
                  getService(Ci.nsISessionStartup);
         willRecoverSession =
           (ss.sessionType == Ci.nsISessionStartup.RECOVER_SESSION);
       }
       catch (ex) { /* never mind; suppose SessionStore is broken */ }
-      if (shouldCheck &&
-          !shell.isDefaultBrowser(true, false) &&
-          !willRecoverSession) {
+
+      let isDefault = shell.isDefaultBrowser(true, false); // startup check, check all assoc
+      try {
+        // Report default browser status on startup to telemetry
+        // so we can track whether we are the default.
+        Services.telemetry.getHistogramById("BROWSER_IS_USER_DEFAULT")
+                          .add(isDefault);
+      }
+      catch (ex) { /* Don't break the default prompt if telemetry is broken. */ }
+
+      if (shouldCheck && !isDefault && !willRecoverSession) {
         Services.tm.mainThread.dispatch(function() {
           var win = this.getMostRecentBrowserWindow();
           var brandBundle = win.document.getElementById("bundle_brand");
           var shellBundle = win.document.getElementById("bundle_shell");
 
           var brandShortName = brandBundle.getString("brandShortName");
           var promptTitle = shellBundle.getString("setDefaultBrowserTitle");
           var promptMessage = shellBundle.getFormattedString("setDefaultBrowserMessage",
--- a/browser/components/places/tests/unit/bookmarks.glue.json
+++ b/browser/components/places/tests/unit/bookmarks.glue.json
@@ -1,1 +1,1 @@
-{"title":"","id":1,"dateAdded":1233157910552624,"lastModified":1233157955206833,"type":"text/x-moz-place-container","root":"placesRoot","children":[{"title":"Bookmarks Menu","id":2,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157993171424,"type":"text/x-moz-place-container","root":"bookmarksMenuFolder","children":[{"title":"examplejson","id":27,"parent":2,"dateAdded":1233157972101126,"lastModified":1233157984999673,"type":"text/x-moz-place","uri":"http://example.com/"}]},{"index":1,"title":"Bookmarks Toolbar","id":3,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157972101126,"annos":[{"name":"bookmarkProperties/description","flags":0,"expires":4,"mimeType":null,"type":3,"value":"Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar"}],"type":"text/x-moz-place-container","root":"toolbarFolder","children":[{"title":"examplejson","id":26,"parent":3,"dateAdded":1233157972101126,"lastModified":1233157984999673,"type":"text/x-moz-place","uri":"http://example.com/"}]},{"index":2,"title":"Tags","id":4,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157910582667,"type":"text/x-moz-place-container","root":"tagsFolder","children":[]},{"index":3,"title":"Unsorted Bookmarks","id":5,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157911033315,"type":"text/x-moz-place-container","root":"unfiledBookmarksFolder","children":[]},]}
+{"title":"","id":1,"dateAdded":1233157910552624,"lastModified":1233157955206833,"type":"text/x-moz-place-container","root":"placesRoot","children":[{"title":"Bookmarks Menu","id":2,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157993171424,"type":"text/x-moz-place-container","root":"bookmarksMenuFolder","children":[{"title":"examplejson","id":27,"parent":2,"dateAdded":1233157972101126,"lastModified":1233157984999673,"type":"text/x-moz-place","uri":"http://example.com/"}]},{"index":1,"title":"Bookmarks Toolbar","id":3,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157972101126,"annos":[{"name":"bookmarkProperties/description","flags":0,"expires":4,"mimeType":null,"type":3,"value":"Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar"}],"type":"text/x-moz-place-container","root":"toolbarFolder","children":[{"title":"examplejson","id":26,"parent":3,"dateAdded":1233157972101126,"lastModified":1233157984999673,"type":"text/x-moz-place","uri":"http://example.com/"}]},{"index":2,"title":"Tags","id":4,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157910582667,"type":"text/x-moz-place-container","root":"tagsFolder","children":[]},{"index":3,"title":"Unsorted Bookmarks","id":5,"parent":1,"dateAdded":1233157910552624,"lastModified":1233157911033315,"type":"text/x-moz-place-container","root":"unfiledBookmarksFolder","children":[]}]}
--- a/browser/components/places/tests/unit/test_browserGlue_shutdown.js
+++ b/browser/components/places/tests/unit/test_browserGlue_shutdown.js
@@ -74,18 +74,25 @@ tests.push({
     // Force nsBrowserGlue::_shutdownPlaces().
     bg.QueryInterface(Ci.nsIObserver).observe(null,
                                               PlacesUtils.TOPIC_SHUTDOWN,
                                               null);
 
     // Check a new bookmarks.html has been created.
     let profileBookmarksHTMLFile = check_bookmarks_html();
     //XXX not working on Linux unit boxes. Could be filestats caching issue.
-    //do_check_true(profileBookmarksHTMLFile.lastModifiedTime > lastMod);
-    do_check_neq(profileBookmarksHTMLFile.fileSize, fileSize);
+    let isLinux = ("@mozilla.org/gnome-gconf-service;1" in Cc);
+    if (!isLinux) {
+      //XXX this test does not working on Mac boxes as well.
+      let isOSX = ("nsILocalFileMac" in Ci);
+      if (!isOSX) {
+        do_check_true(profileBookmarksHTMLFile.lastModifiedTime > lastMod);
+      }
+      do_check_neq(profileBookmarksHTMLFile.fileSize, fileSize);
+    }
 
     // Check preferences have not been reverted.
     do_check_true(ps.getBoolPref(PREF_AUTO_EXPORT_HTML));
     // Reset preferences.
     ps.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
 
     next_test();
   }
--- a/browser/devtools/netmonitor/netmonitor-controller.js
+++ b/browser/devtools/netmonitor/netmonitor-controller.js
@@ -11,16 +11,19 @@ Cu.import("resource://gre/modules/Servic
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js");
 Cu.import("resource:///modules/source-editor.jsm");
 Cu.import("resource:///modules/devtools/shared/event-emitter.js");
 Cu.import("resource:///modules/devtools/SideMenuWidget.jsm");
 Cu.import("resource:///modules/devtools/VariablesView.jsm");
 Cu.import("resource:///modules/devtools/ViewHelpers.jsm");
 
+XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
+  "resource://gre/modules/PluralForm.jsm");
+
 XPCOMUtils.defineLazyModuleGetter(this, "NetworkHelper",
   "resource://gre/modules/devtools/NetworkHelper.jsm");
 
 const NET_STRINGS_URI = "chrome://browser/locale/devtools/netmonitor.properties";
 const LISTENERS = [ "NetworkActivity" ];
 const NET_PREFS = { "NetworkMonitor.saveRequestAndResponseBodies": true };
 
 /**
--- a/browser/devtools/netmonitor/netmonitor-view.js
+++ b/browser/devtools/netmonitor/netmonitor-view.js
@@ -273,16 +273,18 @@ function RequestsMenuView() {
 create({ constructor: RequestsMenuView, proto: MenuContainer.prototype }, {
   /**
    * Initialization function, called when the network monitor is started.
    */
   initialize: function() {
     dumpn("Initializing the RequestsMenuView");
 
     this.node = new SideMenuWidget($("#requests-menu-contents"), false);
+    this._summary = $("#request-menu-network-summary");
+
     this.node.maintainSelectionVisible = false;
     this.node.autoscrollWithAppendedItems = true;
 
     this.node.addEventListener("select", this._onSelect, false);
     window.addEventListener("resize", this._onResize, false);
   },
 
   /**
@@ -346,16 +348,17 @@ create({ constructor: RequestsMenuView, 
         isXHR: aIsXHR
       },
       finalize: this._onRequestItemRemoved
     });
 
     $("#details-pane-toggle").disabled = false;
     $("#requests-menu-empty-notice").hidden = true;
 
+    this.refreshSummary();
     this._cache.set(aId, requestItem);
   },
 
   /**
    * Filters all network requests in this container by a specified type.
    *
    * @param string aType
    *        Either null, "html", "css", "js", "xhr", "fonts", "images", "media"
@@ -399,16 +402,18 @@ create({ constructor: RequestsMenuView, 
         break;
       case "media":
         this.filterContents(this._onMedia);
         break;
       case "flash":
         this.filterContents(this._onFlash);
         break;
     }
+
+    this.refreshSummary();
   },
 
   /**
    * Sorts all network requests in this container by a specified detail.
    *
    * @param string aType
    *        Either null, "status", "method", "file", "domain", "type" or "size".
    */
@@ -568,16 +573,42 @@ create({ constructor: RequestsMenuView, 
   _byType: function({ attachment: first }, { attachment: second })
     this._getAbbreviatedMimeType(first.mimeType).toLowerCase() >
     this._getAbbreviatedMimeType(second.mimeType).toLowerCase(),
 
   _bySize: function({ attachment: first }, { attachment: second })
     first.contentSize > second.contentSize,
 
   /**
+   * Refreshes the status displayed in this container's footer, providing
+   * concise information about all requests.
+   */
+  refreshSummary: function() {
+    let visibleItems = this.visibleItems;
+    let visibleRequestsCount = visibleItems.length;
+    if (!visibleRequestsCount) {
+      this._summary.setAttribute("value", L10N.getStr("networkMenu.empty"));
+      return;
+    }
+
+    let totalBytes = this._getTotalBytesOfRequests(visibleItems);
+    let totalMillis =
+      this._getNewestRequest(visibleItems).attachment.endedMillis -
+      this._getOldestRequest(visibleItems).attachment.startedMillis;
+
+    // https://developer.mozilla.org/en-US/docs/Localization_and_Plurals
+    let str = PluralForm.get(visibleRequestsCount, L10N.getStr("networkMenu.summary"));
+    this._summary.setAttribute("value", str
+      .replace("#1", visibleRequestsCount)
+      .replace("#2", L10N.numberWithDecimals((totalBytes || 0) / 1024, 2))
+      .replace("#3", L10N.numberWithDecimals((totalMillis || 0) / 1000, 2))
+    );
+  },
+
+  /**
    * Schedules adding additional information to a network request.
    *
    * @param string aId
    *        An identifier coming from the network monitor controller.
    * @param object aData
    *        An object containing several { key: value } tuples of network info.
    *        Supported keys are "httpVersion", "status", "statusText" etc.
    */
@@ -686,16 +717,17 @@ create({ constructor: RequestsMenuView, 
 
     // Make sure all the requests are sorted and filtered.
     // Freshly added requests may not yet contain all the information required
     // for sorting and filtering predicates, so this is done each time the
     // network requests table is flushed (don't worry, events are drained first
     // so this doesn't happen once per network event update).
     this.sortContents();
     this.filterContents();
+    this.refreshSummary();
   },
 
   /**
    * Customization function for creating an item's UI.
    *
    * @param string aMethod
    *        Specifies the request method (e.g. "GET", "POST", etc.)
    * @param string aUrl
@@ -1112,31 +1144,76 @@ create({ constructor: RequestsMenuView, 
   _getAbbreviatedMimeType: function(aMimeType) {
     if (!aMimeType) {
       return "";
     }
     return (aMimeType.split(";")[0].split("/")[1] || "").split("+")[0];
   },
 
   /**
+   * Gets the total number of bytes representing the cumulated content size of
+   * a set of requests. Returns 0 for an empty set.
+   *
+   * @param array aItemsArray
+   * @return number
+   */
+  _getTotalBytesOfRequests: function(aItemsArray) {
+    if (!aItemsArray.length) {
+      return 0;
+    }
+    return aItemsArray.reduce((prev, curr) => prev + curr.attachment.contentSize || 0, 0);
+  },
+
+  /**
+   * Gets the oldest (first performed) request in a set. Returns null for an
+   * empty set.
+   *
+   * @param array aItemsArray
+   * @return MenuItem
+   */
+  _getOldestRequest: function(aItemsArray) {
+    if (!aItemsArray.length) {
+      return null;
+    }
+    return aItemsArray.reduce((prev, curr) =>
+      prev.attachment.startedMillis < curr.attachment.startedMillis ? prev : curr);
+  },
+
+  /**
+   * Gets the newest (latest performed) request in a set. Returns null for an
+   * empty set.
+   *
+   * @param array aItemsArray
+   * @return MenuItem
+   */
+  _getNewestRequest: function(aItemsArray) {
+    if (!aItemsArray.length) {
+      return null;
+    }
+    return aItemsArray.reduce((prev, curr) =>
+      prev.attachment.startedMillis > curr.attachment.startedMillis ? prev : curr);
+  },
+
+  /**
    * Gets the available waterfall width in this container.
    * @return number
    */
   get _waterfallWidth() {
     if (this._cachedWaterfallWidth == 0) {
       let container = $("#requests-menu-toolbar");
       let waterfall = $("#requests-menu-waterfall-header-box");
       let containerBounds = container.getBoundingClientRect();
       let waterfallBounds = waterfall.getBoundingClientRect();
       this._cachedWaterfallWidth = containerBounds.width - waterfallBounds.left;
     }
     return this._cachedWaterfallWidth;
   },
 
   _cache: null,
+  _summary: null,
   _canvas: null,
   _ctx: null,
   _cachedWaterfallWidth: 0,
   _cachedWaterfallBackground: "",
   _firstRequestStartedMillis: -1,
   _lastRequestEndedMillis: -1,
   _updateQueue: [],
   _updateTimeout: null,
--- a/browser/devtools/netmonitor/netmonitor.css
+++ b/browser/devtools/netmonitor/netmonitor.css
@@ -22,17 +22,18 @@
   #details-pane[pane-collapsed],
   .requests-menu-waterfall,
   .requests-menu-footer-label {
     display: none;
   }
 }
 
 @media (min-width: 701px) and (max-width: 1024px) {
-  #body:not([pane-collapsed]) #requests-menu-footer {
+  #body:not([pane-collapsed]) .requests-menu-footer-button,
+  #body:not([pane-collapsed]) .requests-menu-footer-spacer {
     display: none;
   }
 }
 
 @media (min-width: 701px) {
   #requests-menu-spacer-start {
     display: none;
   }
--- a/browser/devtools/netmonitor/netmonitor.xul
+++ b/browser/devtools/netmonitor/netmonitor.xul
@@ -173,16 +173,20 @@
         <button id="requests-menu-filter-flash-button"
                 class="requests-menu-footer-button"
                 onclick="NetMonitorView.RequestsMenu.filterOn('flash')"
                 label="&netmonitorUI.footer.filterFlash;">
         </button>
         <spacer id="requests-menu-spacer-end"
                 class="requests-menu-footer-spacer"
                 flex="100"/>
+        <label id="request-menu-network-summary"
+               class="plain requests-menu-footer-label"
+               flex="1"
+               crop="end"/>
       </hbox>
     </vbox>
 
     <splitter class="devtools-side-splitter"/>
 
     <tabbox id="details-pane"
             class="devtools-sidebar-tabs"
             hidden="true">
--- a/browser/devtools/netmonitor/test/Makefile.in
+++ b/browser/devtools/netmonitor/test/Makefile.in
@@ -34,16 +34,17 @@ MOCHITEST_BROWSER_TESTS = \
 	browser_net_sort-01.js \
 	browser_net_sort-02.js \
 	browser_net_sort-03.js \
 	browser_net_filter-01.js \
 	browser_net_filter-02.js \
 	browser_net_filter-03.js \
 	browser_net_accessibility-01.js \
 	browser_net_accessibility-02.js \
+	browser_net_footer-summary.js \
 	head.js \
 	$(NULL)
 
 MOCHITEST_BROWSER_PAGES = \
 	test-image.png \
 	html_simple-test-page.html \
 	html_navigate-test-page.html \
 	html_content-type-test-page.html \
new file mode 100644
--- /dev/null
+++ b/browser/devtools/netmonitor/test/browser_net_footer-summary.js
@@ -0,0 +1,121 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Test if the summary text displayed in the network requests menu footer
+ * is correct.
+ */
+
+function test() {
+  let { PluralForm } = Cu.import("resource://gre/modules/PluralForm.jsm", {});
+
+  initNetMonitor(FILTERING_URL).then(([aTab, aDebuggee, aMonitor]) => {
+    info("Starting test... ");
+
+    let { $, L10N, NetMonitorView } = aMonitor.panelWin;
+    let { RequestsMenu } = NetMonitorView;
+
+    RequestsMenu.lazyUpdate = false;
+    testStatus();
+
+    waitForNetworkEvents(aMonitor, 8).then(() => {
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-html-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-css-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-js-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-xhr-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-fonts-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-images-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-media-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-flash-button"));
+      testStatus();
+
+      info("Performing more requests.");
+      aDebuggee.performRequests('{ "getMedia": true, "getFlash": true }');
+      return waitForNetworkEvents(aMonitor, 8);
+    })
+    .then(() => {
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-html-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-css-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-js-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-xhr-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-fonts-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-images-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-media-button"));
+      testStatus();
+
+      EventUtils.sendMouseEvent({ type: "click" }, $("#requests-menu-filter-flash-button"));
+      testStatus();
+
+      teardown(aMonitor).then(finish);
+    })
+
+    function testStatus() {
+      let summary = $("#request-menu-network-summary");
+      let value = summary.getAttribute("value");
+      info("Current summary: " + value);
+
+      let visibleItems = RequestsMenu.visibleItems;
+      let visibleRequestsCount = visibleItems.length;
+      let totalRequestsCount = RequestsMenu.itemCount;
+      info("Current requests: " + visibleRequestsCount + " of " + totalRequestsCount + ".");
+
+      if (!totalRequestsCount) {
+        is(value, "",
+          "The current summary text is incorrect, expected an empty string.");
+        return;
+      }
+
+      if (!visibleRequestsCount) {
+        is(value, L10N.getStr("networkMenu.empty"),
+          "The current summary text is incorrect, expected an 'empty' label.");
+        return;
+      }
+
+      let totalBytes = RequestsMenu._getTotalBytesOfRequests(visibleItems);
+      let totalMillis =
+        RequestsMenu._getNewestRequest(visibleItems).attachment.endedMillis -
+        RequestsMenu._getOldestRequest(visibleItems).attachment.startedMillis;
+
+      info("Computed total bytes: " + totalBytes);
+      info("Computed total millis: " + totalMillis);
+
+      is(value, PluralForm.get(visibleRequestsCount, L10N.getStr("networkMenu.summary"))
+        .replace("#1", visibleRequestsCount)
+        .replace("#2", L10N.numberWithDecimals((totalBytes || 0) / 1024, 2))
+        .replace("#3", L10N.numberWithDecimals((totalMillis || 0) / 1000, 2))
+      , "The current summary text is incorrect.")
+    }
+
+    aDebuggee.performRequests('{ "getMedia": true, "getFlash": true }');
+  });
+}
--- a/browser/devtools/shared/widgets/ViewHelpers.jsm
+++ b/browser/devtools/shared/widgets/ViewHelpers.jsm
@@ -1211,16 +1211,22 @@ MenuContainer.prototype = {
 
   /**
    * Gets the total number of items in this container.
    * @return number
    */
   get itemCount() this._itemsByElement.size,
 
   /**
+   * Gets the total number of visible (non-hidden) items in this container.
+   * @return number
+   */
+  get visibleItemsCount() this.visibleItems.length,
+
+  /**
    * Returns a list of all items in this container, in the displayed order.
    * @return array
    */
   get orderedItems() {
     let items = [];
     let itemCount = this.itemCount;
     for (let i = 0; i < itemCount; i++) {
       items.push(this.getItemAtIndex(i));
--- a/browser/devtools/webconsole/HUDService.jsm
+++ b/browser/devtools/webconsole/HUDService.jsm
@@ -535,33 +535,31 @@ ViewHelpers.create({ constructor: Browse
    */
   init: function BC_init()
   {
     if (this._bc_init) {
       return this._bc_init;
     }
 
     let window = this.iframeWindow;
+
+    // Make sure that the closing of the Browser Console window destroys this
+    // instance.
     let onClose = () => {
       window.removeEventListener("unload", onClose);
       this.destroy();
     };
     window.addEventListener("unload", onClose);
 
-    this._bc_init = this.$init().then((aReason) => {
-      this._telemetry.toolOpened("browserconsole");
-      let title = this.ui.rootElement.getAttribute("browserConsoleTitle");
-      this.ui.rootElement.setAttribute("title", title);
+    // Make sure Ctrl-W closes the Browser Console window.
+    window.document.getElementById("cmd_close").removeAttribute("disabled");
 
-      let cmd_close = this.ui.document.getElementById("cmd_close");
-      cmd_close.removeAttribute("disabled");
+    this._telemetry.toolOpened("browserconsole");
 
-      return aReason;
-    });
-
+    this._bc_init = this.$init();
     return this._bc_init;
   },
 
   $destroy: WebConsole.prototype.destroy,
 
   /**
    * Destroy the object.
    *
@@ -695,18 +693,23 @@ var HeadsUpDisplayUICommands = {
     function openWindow(aTarget)
     {
       target = aTarget;
 
       let deferred = Promise.defer();
 
       let win = Services.ww.openWindow(null, devtools.Tools.webConsole.url, "_blank",
                                        BROWSER_CONSOLE_WINDOW_FEATURES, null);
-      win.addEventListener("load", function onLoad() {
-        win.removeEventListener("load", onLoad);
+      win.addEventListener("DOMContentLoaded", function onLoad() {
+        win.removeEventListener("DOMContentLoaded", onLoad);
+
+        // Set the correct Browser Console title.
+        let root = win.document.documentElement;
+        root.setAttribute("title", root.getAttribute("browserConsoleTitle"));
+
         deferred.resolve(win);
       });
 
       return deferred.promise;
     }
 
     connect().then(getTarget).then(openWindow).then((aWindow) =>
       HUDService.openBrowserConsole(target, aWindow, aWindow)
--- a/browser/devtools/webconsole/test/browser_bug_638949_copy_link_location.js
+++ b/browser/devtools/webconsole/test/browser_bug_638949_copy_link_location.js
@@ -8,146 +8,100 @@ const TEST_URI = "http://example.com/bro
 const COMMAND_NAME = "consoleCmd_copyURL";
 const CONTEXT_MENU_ID = "#menu_copyURL";
 
 let HUD = null;
 let output = null;
 let menu = null;
 
 function test() {
+  registerCleanupFunction(() => {
+    HUD = output = menu = null;
+  });
+
   addTab(TEST_URI);
-
   browser.addEventListener("load", function onLoad() {
     browser.removeEventListener("load", onLoad, true);
 
     openConsole(null, function (aHud) {
       HUD = aHud;
       output = aHud.outputNode;
       menu = HUD.iframeWindow.document.getElementById("output-contextmenu");
 
       executeSoon(testWithoutNetActivity);
     });
   }, true);
 }
 
 // Return whether "Copy Link Location" command is enabled or not.
 function isEnabled() {
-  let controller = top.document.commandDispatcher.
-    getControllerForCommand(COMMAND_NAME);
-
+  let controller = top.document.commandDispatcher
+                   .getControllerForCommand(COMMAND_NAME);
   return controller && controller.isCommandEnabled(COMMAND_NAME);
 }
 
-function select(query) {
-  let target = output.querySelector(query);
-
-  output.focus();
-  output.selectedItem = target;
-
-  return target;
-}
-
 function testWithoutNetActivity() {
   HUD.jsterm.clearOutput();
-  output = HUD.outputNode;
-  content.wrappedJSObject.console.log("bug 638949");
-
-  // Test that "Copy Link Location" command is disabled if there
-  // were no network-related messages.
-  waitForSuccess({
-    name: "no net activity in console",
+  content.console.log("bug 638949");
 
-    validatorFn: function () {
-      return output.textContent.indexOf("bug 638949") > -1;
-    },
-
-    successFn: function () {
-      select(".webconsole-msg-log");
-      goUpdateCommand(COMMAND_NAME);
-      ok(!isEnabled(), COMMAND_NAME + "is disabled");
-      executeSoon(testMenuWithoutNetActivity);
-    }
-  });
+  // Test that the "Copy Link Location" command is disabled for non-network
+  // messages.
+  waitForMessages({
+    webconsole: HUD,
+    messages: [{
+      text: "bug 638949",
+      category: CATEGORY_WEBDEV,
+      severity: SEVERITY_LOG,
+    }],
+  }).then(onConsoleMessage);
 }
 
-function testMenuWithoutNetActivity() {
-  // Test that "Copy Link Location" menu item is hidden if there
-  // were no network-related messages.
-  let target = select(".webconsole-msg-log");
+function onConsoleMessage(aResults) {
+  output.focus();
+  output.selectedItem = [...aResults[0].matched][0];
 
-  function next() {
-    menu.hidePopup();
-    executeSoon(testWithNetActivity);
-  }
+  goUpdateCommand(COMMAND_NAME);
+  ok(!isEnabled(), COMMAND_NAME + "is disabled");
 
-  waitForOpenContextMenu(menu, {
-    target: target,
-
-    successFn: function () {
-      let isHidden = menu.querySelector(CONTEXT_MENU_ID).hidden;
-      ok(isHidden, CONTEXT_MENU_ID + " is hidden");
-      next();
-    },
-
-    failureFn: next
-  });
+  // Test that the "Copy Link Location" menu item is hidden for non-network
+  // messages.
+  waitForContextMenu(menu, output.selectedItem, () => {
+    let isHidden = menu.querySelector(CONTEXT_MENU_ID).hidden;
+    ok(isHidden, CONTEXT_MENU_ID + " is hidden");
+  }, testWithNetActivity);
 }
 
 function testWithNetActivity() {
   HUD.jsterm.clearOutput();
   content.location.reload(); // Reloading will produce network logging
 
-  // Test that "Copy Link Location" command is enabled and works
-  // as expected if there were any network-related messages.
-  //
-  // This command should copy only the URL without timestamp and other
-  // stuff.
-  waitForSuccess({
-    name: "net activity in console",
-
-    validatorFn: function () {
-      let item = select(".webconsole-msg-network");
-      return item && item.url;
-    },
+  // Test that the "Copy Link Location" command is enabled and works
+  // as expected for any network-related message.
+  // This command should copy only the URL.
+  waitForMessages({
+    webconsole: HUD,
+    messages: [{
+      text: "test-console.html",
+      category: CATEGORY_NETWORK,
+      severity: SEVERITY_LOG,
+    }],
+  }).then(onNetworkMessage);
+}
 
-    successFn: function () {
-      output.focus();
-      goUpdateCommand(COMMAND_NAME);
-      ok(isEnabled(), COMMAND_NAME + " is enabled");
+function onNetworkMessage(aResults) {
+  output.focus();
+  output.selectedItem = [...aResults[0].matched][0];
 
-      waitForClipboard(output.selectedItem.url, function clipboardSetup() {
-        goDoCommand(COMMAND_NAME);
-      }, testMenuWithNetActivity, testMenuWithNetActivity);
-    },
+  goUpdateCommand(COMMAND_NAME);
+  ok(isEnabled(), COMMAND_NAME + " is enabled");
 
-    failureFn: testMenuWithNetActivity
-  });
+  waitForClipboard(output.selectedItem.url, () => goDoCommand(COMMAND_NAME),
+                   testMenuWithNetActivity, testMenuWithNetActivity);
 }
 
 function testMenuWithNetActivity() {
-  // Test that "Copy Link Location" menu item is visible if there
-  // were any network-related messages.
-  let target = select(".webconsole-msg-network");
-
-  function next() {
-    menu.hidePopup();
-    executeSoon(finalize);
-  }
-
-  waitForOpenContextMenu(menu, {
-    target: target,
-
-    successFn: function () {
-      let isVisible = !menu.querySelector(CONTEXT_MENU_ID).hidden;
-      ok(isVisible, CONTEXT_MENU_ID + " is visible");
-      next();
-    },
-
-    failureFn: next
-  });
+  // Test that the "Copy Link Location" menu item is visible for network-related
+  // messages.
+  waitForContextMenu(menu, output.selectedItem, () => {
+    let isVisible = !menu.querySelector(CONTEXT_MENU_ID).hidden;
+    ok(isVisible, CONTEXT_MENU_ID + " is visible");
+  }, finishTest);
 }
-
-function finalize() {
-  HUD = null;
-  output = null;
-  menu = null;
-  finishTest();
-}
--- a/browser/devtools/webconsole/test/browser_console_variables_view.js
+++ b/browser/devtools/webconsole/test/browser_console_variables_view.js
@@ -65,17 +65,17 @@ function onTestPropFound(aResults)
     webconsole: gWebConsole,
     callback: onFooObjFetchAfterUpdate,
   });
 }
 
 function onFooObjFetchAfterUpdate(aEvent, aVar)
 {
   info("onFooObjFetchAfterUpdate");
-  let para = content.document.querySelector("p");
+  let para = content.wrappedJSObject.document.querySelector("p");
   let expectedValue = content.document.title + content.location + para;
 
   findVariableViewProperties(aVar, [
     { name: "testProp", value: expectedValue },
   ], { webconsole: gWebConsole }).then(onUpdatedTestPropFound);
 }
 
 function onUpdatedTestPropFound(aResults)
@@ -95,17 +95,17 @@ function onUpdatedTestPropFound(aResults
     callback: onFooObjFetchAfterPropRename,
   });
 }
 
 function onFooObjFetchAfterPropRename(aEvent, aVar)
 {
   info("onFooObjFetchAfterPropRename");
 
-  let para = content.document.querySelector("p");
+  let para = content.wrappedJSObject.document.querySelector("p");
   let expectedValue = content.document.title + content.location + para;
 
   // Check that the new value is in the variables view.
   findVariableViewProperties(aVar, [
     { name: "testUpdatedProp", value: expectedValue },
   ], { webconsole: gWebConsole }).then(onRenamedTestPropFound);
 }
 
@@ -129,17 +129,17 @@ function onRenamedTestPropFound(aResults
     callback: onPropUpdateError,
   });
 }
 
 function onPropUpdateError(aEvent, aVar)
 {
   info("onPropUpdateError");
 
-  let para = content.document.querySelector("p");
+  let para = content.wrappedJSObject.document.querySelector("p");
   let expectedValue = content.document.title + content.location + para;
 
   // Make sure the property did not change.
   findVariableViewProperties(aVar, [
     { name: "testUpdatedProp", value: expectedValue },
   ], { webconsole: gWebConsole }).then(onRenamedTestPropFoundAgain);
 }
 
--- a/browser/devtools/webconsole/test/browser_console_variables_view_while_debugging.js
+++ b/browser/devtools/webconsole/test/browser_console_variables_view_while_debugging.js
@@ -96,17 +96,17 @@ function onTestPropFound(aResults)
     webconsole: gWebConsole,
     callback: onFooObjFetchAfterUpdate,
   });
 }
 
 function onFooObjFetchAfterUpdate(aEvent, aVar)
 {
   info("onFooObjFetchAfterUpdate");
-  let para = content.document.querySelector("p");
+  let para = content.wrappedJSObject.document.querySelector("p");
   let expectedValue = content.document.title + "foo2SecondCall" + para;
 
   findVariableViewProperties(aVar, [
     { name: "testProp2", value: expectedValue },
   ], { webconsole: gWebConsole }).then(onUpdatedTestPropFound);
 }
 
 function onUpdatedTestPropFound(aResults)
@@ -115,17 +115,17 @@ function onUpdatedTestPropFound(aResults
   ok(prop, "matched the updated |testProp2| property value");
 
   // Check that testProp2 was updated.
   executeSoon(() => gJSTerm.execute("fooObj.testProp2", onExecuteFooObjTestProp2));
 }
 
 function onExecuteFooObjTestProp2()
 {
-  let para = content.document.querySelector("p");
+  let para = content.wrappedJSObject.document.querySelector("p");
   let expected = content.document.title + "foo2SecondCall" + para;
 
   isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
         "fooObj.testProp2 is correct");
 
   gWebConsole = gJSTerm = gDebuggerWin = gThread = gDebuggerController =
     gStackframes = gVariablesView = null;
   executeSoon(finishTest);
--- a/browser/devtools/webconsole/test/browser_webconsole_bug_764572_output_open_url.js
+++ b/browser/devtools/webconsole/test/browser_webconsole_bug_764572_output_open_url.js
@@ -18,163 +18,102 @@ function test() {
   }, true);
 }
 
 function consoleOpened(aHud) {
   HUD = aHud;
   outputNode = aHud.outputNode;
   contextMenu = HUD.iframeWindow.document.getElementById("output-contextmenu");
 
-  executeSoon(testOnNotNetActivity);
-}
+  registerCleanupFunction(() => {
+    HUD = outputNode = contextMenu = null;
+  });
 
-function testOnNotNetActivity() {
   HUD.jsterm.clearOutput();
 
-  outputNode = HUD.outputNode;
-  let console = content.wrappedJSObject.console;
-  console.log("bug 764572");
+  content.console.log("bug 764572");
 
-  testOnNotNetActivity_command();
+  waitForMessages({
+    webconsole: HUD,
+    messages: [{
+      text: "bug 764572",
+      category: CATEGORY_WEBDEV,
+      severity: SEVERITY_LOG,
+    }],
+  }).then(onConsoleMessage);
 }
-function testOnNotNetActivity_command () {
-  waitForSuccess({
-    name: "show no net activity in console",
-    validatorFn: function () {
-      return outputNode.textContent.indexOf("bug 764572") > -1;
-    },
-    successFn: function () {
-      outputNode.focus();
-      outputNode.selectedItem = outputNode.querySelector(".webconsole-msg-log");
-
-      // check whether the command is disable
-      goUpdateCommand(COMMAND_NAME);
-      let controller = top.document.commandDispatcher.
-        getControllerForCommand(COMMAND_NAME);
 
-      let isDisabled = !controller || !controller.isCommandEnabled("consoleCmd_openURL");
-      ok(isDisabled, COMMAND_NAME + " should be disabled.");
-      executeSoon(testOnNotNetActivity_contextmenu);
-    },
-    failureFn: testOnNotNetActivity_contextmenu,
-  });
-}
-function testOnNotNetActivity_contextmenu() {
-  let target = outputNode.querySelector(".webconsole-msg-log");
-
+function onConsoleMessage(aResults) {
   outputNode.focus();
-  outputNode.selectedItem = target;
+  outputNode.selectedItem = [...aResults[0].matched][0];
 
-  waitForOpenContextMenu(contextMenu, {
-    target: target,
-    successFn: function () {
-      let isHidden = contextMenu.querySelector(CONTEXT_MENU_ID).hidden;
-      ok(isHidden, CONTEXT_MENU_ID + "should be hidden.");
+  // Check if the command is disabled non-network messages.
+  goUpdateCommand(COMMAND_NAME);
+  let controller = top.document.commandDispatcher
+                   .getControllerForCommand(COMMAND_NAME);
 
-      closeContextMenu(contextMenu);
-      executeSoon(testOnNetActivity);
-    },
-    failureFn: function(){
-      closeContextMenu(contextMenu);
-      executeSoon(testOnNetActivity);
-    },
-  });
+  let isDisabled = !controller || !controller.isCommandEnabled(COMMAND_NAME);
+  ok(isDisabled, COMMAND_NAME + " should be disabled.");
+
+  waitForContextMenu(contextMenu, outputNode.selectedItem, () => {
+    let isHidden = contextMenu.querySelector(CONTEXT_MENU_ID).hidden;
+    ok(isHidden, CONTEXT_MENU_ID + " should be hidden.");
+  }, testOnNetActivity);
 }
 
 function testOnNetActivity() {
   HUD.jsterm.clearOutput();
 
-  // reload the url to show net activity in console.
+  // Reload the url to show net activity in console.
   content.location.reload();
 
-  testOnNetActivity_command();
+  waitForMessages({
+    webconsole: HUD,
+    messages: [{
+      text: "test-console.html",
+      category: CATEGORY_NETWORK,
+      severity: SEVERITY_LOG,
+    }],
+  }).then(onNetworkMessage);
 }
 
-function testOnNetActivity_command() {
-  waitForSuccess({
-    name: "show TEST_URI's net activity in console",
-    validatorFn: function () {
-      outputNode.focus();
-      outputNode.selectedItem = outputNode.querySelector(".webconsole-msg-network");
-
-      let item = outputNode.selectedItem;
-      return item && item.url;
-    },
-    successFn: function () {
-      outputNode.focus();
+function onNetworkMessage(aResults) {
+  outputNode.focus();
+  outputNode.selectedItem = [...aResults[0].matched][0];
 
-      // set up the event handler for TabOpen
-      gBrowser.tabContainer.addEventListener("TabOpen", function onOpen(aEvent) {
-        gBrowser.tabContainer.removeEventListener("TabOpen", onOpen, true);
+  let currentTab = gBrowser.selectedTab;
+  let newTab = null;
 
-        let tab = aEvent.target;
-        onTabOpen(tab);
-      }, true);
-
-      // check whether the command is enable
-      goUpdateCommand(COMMAND_NAME);
-      let controller = top.document.commandDispatcher.
-        getControllerForCommand(COMMAND_NAME);
-      ok(controller.isCommandEnabled("consoleCmd_openURL"), COMMAND_NAME + " should be enabled.");
+  gBrowser.tabContainer.addEventListener("TabOpen", function onOpen(aEvent) {
+    gBrowser.tabContainer.removeEventListener("TabOpen", onOpen, true);
+    newTab = aEvent.target;
+    newTab.linkedBrowser.addEventListener("load", onTabLoaded, true);
+  }, true);
 
-      // try to open url.
-      goDoCommand(COMMAND_NAME);
-    },
-    failureFn: testOnNetActivity_contextmenu,
-  });
-}
+  function onTabLoaded() {
+    newTab.linkedBrowser.removeEventListener("load", onTabLoaded, true);
+    gBrowser.removeTab(newTab);
+    gBrowser.selectedTab = currentTab;
+    executeSoon(testOnNetActivity_contextmenu);
+  }
 
-// check TabOpen event
-function onTabOpen(aTab) {
-  waitForSuccess({
-    timeout: 10000,
-    name: "complete to initialize the opening tab",
-    validatorFn: function()
-    {
-      // wait to complete initialization for the new tab.
-      let url = aTab.linkedBrowser.currentURI.spec;
-      return url === TEST_URI;
-    },
-    successFn: function()
-    {
-      gBrowser.removeTab(aTab);
-      executeSoon(testOnNetActivity_contextmenu);
-    },
-    failureFn: function()
-    {
-      info("new tab currentURI " + aTab.linkedBrowser.currentURI.spec);
-      testOnNetActivity_contextmenu();
-    },
-  });
+  // Check if the command is enabled for a network message.
+  goUpdateCommand(COMMAND_NAME);
+  let controller = top.document.commandDispatcher
+                   .getControllerForCommand(COMMAND_NAME);
+  ok(controller.isCommandEnabled(COMMAND_NAME),
+     COMMAND_NAME + " should be enabled.");
+
+  // Try to open the URL.
+  goDoCommand(COMMAND_NAME);
 }
 
 function testOnNetActivity_contextmenu() {
   let target = outputNode.querySelector(".webconsole-msg-network");
 
   outputNode.focus();
   outputNode.selectedItem = target;
 
-  waitForOpenContextMenu(contextMenu, {
-    target: target,
-    successFn: function () {
-      let isShown = !contextMenu.querySelector(CONTEXT_MENU_ID).hidden;
-      ok(isShown, CONTEXT_MENU_ID + "should be shown.");
-
-      closeContextMenu(contextMenu);
-      executeSoon(finalizeTest);
-    },
-    failureFn: function(){
-      closeContextMenu(contextMenu);
-      executeSoon(finalizeTest);
-    },
-  });
+  waitForContextMenu(contextMenu, target, () => {
+    let isShown = !contextMenu.querySelector(CONTEXT_MENU_ID).hidden;
+    ok(isShown, CONTEXT_MENU_ID + " should be shown.");
+  }, finishTest);
 }
-
-function finalizeTest() {
-  HUD = null;
-  outputNode = null;
-  contextMenu = null
-  finishTest();
-}
-
-function closeContextMenu (aContextMenu) {
-  aContextMenu.hidePopup();
-}
--- a/browser/devtools/webconsole/test/head.js
+++ b/browser/devtools/webconsole/test/head.js
@@ -192,64 +192,52 @@ function closeConsole(aTab, aCallback = 
     }
   }
   else {
     aCallback();
   }
 }
 
 /**
- * Polls a given function waiting for opening context menu.
+ * Wait for a context menu popup to open.
  *
- * @Param {nsIDOMElement} aContextMenu
- * @param object aOptions
- *        Options object with the following properties:
- *        - successFn
- *        A function called if opening the given context menu - success to return.
- *        - failureFn
- *        A function called if not opening the given context menu - fails to return.
- *        - target
- *        The target element for showing a context menu.
- *        - timeout
- *        Timeout for popup shown, in milliseconds. Default is 5000.
+ * @param nsIDOMElement aPopup
+ *        The XUL popup you expect to open.
+ * @param nsIDOMElement aButton
+ *        The button/element that receives the contextmenu event. This is
+ *        expected to open the popup.
+ * @param function aOnShown
+ *        Function to invoke on popupshown event.
+ * @param function aOnHidden
+ *        Function to invoke on popuphidden event.
  */
-function waitForOpenContextMenu(aContextMenu, aOptions) {
-  let start = Date.now();
-  let timeout = aOptions.timeout || 5000;
-  let targetElement = aOptions.target;
+function waitForContextMenu(aPopup, aButton, aOnShown, aOnHidden)
+{
+  function onPopupShown() {
+    info("onPopupShown");
+    aPopup.removeEventListener("popupshown", onPopupShown);
+
+    aOnShown();
 
-  if (!aContextMenu) {
-    ok(false, "Can't get a context menu.");
-    aOptions.failureFn();
-    return;
+    // Use executeSoon() to get out of the popupshown event.
+    aPopup.addEventListener("popuphidden", onPopupHidden);
+    executeSoon(() => aPopup.hidePopup());
   }
-  if (!targetElement) {
-    ok(false, "Can't get a target element.");
-    aOptions.failureFn();
-    return;
+  function onPopupHidden() {
+    info("onPopupHidden");
+    aPopup.removeEventListener("popuphidden", onPopupHidden);
+    aOnHidden();
   }
 
-  function onPopupShown() {
-    aContextMenu.removeEventListener("popupshown", onPopupShown);
-    clearTimeout(onTimeout);
-    aOptions.successFn();
-  }
-
-
-  aContextMenu.addEventListener("popupshown", onPopupShown);
+  aPopup.addEventListener("popupshown", onPopupShown);
 
-  let onTimeout = setTimeout(function(){
-    aContextMenu.removeEventListener("popupshown", onPopupShown);
-    aOptions.failureFn();
-  }, timeout);
-
-  // open a context menu.
-  let eventDetails = { type : "contextmenu", button : 2};
-  EventUtils.synthesizeMouse(targetElement, 2, 2,
-                             eventDetails, targetElement.ownerDocument.defaultView);
+  info("wait for the context menu to open");
+  let eventDetails = { type: "contextmenu", button: 2};
+  EventUtils.synthesizeMouse(aButton, 2, 2, eventDetails,
+                             aButton.ownerDocument.defaultView);
 }
 
 /**
  * Dump the output of all open Web Consoles - used only for debugging purposes.
  */
 function dumpConsoles()
 {
   if (gPendingOutputTest) {
--- a/browser/extensions/pdfjs/test/Makefile.in
+++ b/browser/extensions/pdfjs/test/Makefile.in
@@ -8,12 +8,13 @@ srcdir    = @srcdir@
 VPATH     = @srcdir@
 relativesrcdir  = @relativesrcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MOCHITEST_BROWSER_FILES = \
   browser_pdfjs_main.js \
   browser_pdfjs_savedialog.js \
+  browser_pdfjs_views.js \
   file_pdfjs_test.pdf \
   $(NULL)
 
 include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_views.js
@@ -0,0 +1,74 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const RELATIVE_DIR = "browser/extensions/pdfjs/test/";
+const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;
+
+function test() {
+  var tab;
+
+  let handlerService = Cc["@mozilla.org/uriloader/handler-service;1"].getService(Ci.nsIHandlerService);
+  let mimeService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
+  let handlerInfo = mimeService.getFromTypeAndExtension('application/pdf', 'pdf');
+
+  // Make sure pdf.js is the default handler.
+  is(handlerInfo.alwaysAskBeforeHandling, false, 'pdf handler defaults to always-ask is false');
+  is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally, 'pdf handler defaults to internal');
+
+  info('Pref action: ' + handlerInfo.preferredAction);
+
+  waitForExplicitFinish();
+  registerCleanupFunction(function() {
+    gBrowser.removeTab(tab);
+  });
+
+  tab = gBrowser.addTab(TESTROOT + "file_pdfjs_test.pdf");
+  var newTabBrowser = gBrowser.getBrowserForTab(tab);
+  newTabBrowser.addEventListener("load", function eventHandler() {
+    newTabBrowser.removeEventListener("load", eventHandler, true);
+
+    var document = newTabBrowser.contentDocument,
+        window = newTabBrowser.contentWindow;
+
+    // Runs tests after all 'load' event handlers have fired off
+    window.addEventListener("documentload", function() {runTests(document, window, finish);}, false, true);
+  }, true);
+}
+
+function runTests(document, window, callback) {
+  // check that PDF is opened with internal viewer
+  ok(document.querySelector('div#viewer'), "document content has viewer UI");
+  ok('PDFJS' in window.wrappedJSObject, "window content has PDFJS object");
+
+  //open sidebar
+  var sidebar = document.querySelector('button#sidebarToggle');
+  var outerContainer = document.querySelector('div#outerContainer');
+
+  sidebar.click();
+  ok(outerContainer.classList.contains('sidebarOpen'), 'sidebar opens on click');
+
+  // check that thumbnail view is open
+  var thumbnailView = document.querySelector('div#thumbnailView');
+  var outlineView = document.querySelector('div#outlineView');
+
+  is(thumbnailView.getAttribute('class'), null, 'Initial view is thumbnail view');
+  is(outlineView.getAttribute('class'), 'hidden', 'Outline view is hidden initially');
+
+  //switch to outline view
+  var viewOutlineButton = document.querySelector('button#viewOutline');
+  viewOutlineButton.click();
+
+  is(outlineView.getAttribute('class'), '', 'Outline view is visible when selected');
+  is(thumbnailView.getAttribute('class'), 'hidden', 'Thumbnail view is hidden when outline is selected');
+
+  //switch back to thumbnail view
+  var viewThumbnailButton = document.querySelector('button#viewThumbnail');
+  viewThumbnailButton.click();
+
+  is(thumbnailView.getAttribute('class'), '', 'Thumbnail view is visible when selected');
+  is(outlineView.getAttribute('class'), 'hidden', 'Outline view is hidden when thumbnail is selected');
+
+  sidebar.click();
+
+  callback();
+}
index ea5ebe39538ca03715041d802ad769005141f200..7ad87e3c2e328e5e25902f1e83fbe9d7d10695b7
GIT binary patch
literal 150611
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%0DpHk4{sTNc|H^o3RZ^rdH1v=AK+USf~!2A((VO-
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
--- a/browser/fuel/test/browser_Bookmarks.js
+++ b/browser/fuel/test/browser_Bookmarks.js
@@ -73,23 +73,23 @@ function test() {
   testFolder.annotations.remove("testing/folder");
   ok(!testFolder.annotations.has("testing/folder"), "Checking existence of removed annotation");
   is(gLastFolderAction, "testing/folder", "Check event handler for removing annotation");
 
   testFolder.events.addListener("addchild", onFolderAddChild);
   testFolder.events.addListener("removechild", onFolderRemoveChild);
 
   // test adding a bookmark
-  var testBookmark = testFolder.addBookmark("Mozilla", url("http://www.mozilla.com/"));
+  var testBookmark = testFolder.addBookmark("Mozilla", url("https://www.mozilla.org/"));
   ok(testBookmark, "Check bookmark creation");
   ok(testBookmark.parent, "Check parent after bookmark creation");
   is(gLastFolderAction, "addchild", "Check event handler for adding a child to a folder");
   is(testBookmark.type, "bookmark", "Check 'bookmark.type' after creation");
   is(testBookmark.title, "Mozilla", "Check 'bookmark.title' after creation");
-  is(testBookmark.uri.spec, "http://www.mozilla.com/", "Check 'bookmark.uri' after creation");
+  is(testBookmark.uri.spec, "https://www.mozilla.org/", "Check 'bookmark.uri' after creation");
 
   is(testFolder.children.length, 1, "Check test folder child count after adding a child bookmark");
 
   // test modifying a bookmark
   testBookmark.events.addListener("change", onBookmarkChange);
   testBookmark.description = "mozcorp";
   is(testBookmark.description, "mozcorp", "Check setting 'bookmark.description'");
   is(gLastBookmarkAction, "bookmarkProperties/description", "Check event handler for setting 'bookmark.description'");
@@ -170,17 +170,17 @@ function test() {
   is(gLastFolderAction, "remove", "Check event handler for removing child folder");
   rootKidCount--;
   is(root.children.length, rootKidCount, "Check root folder child count after removing a child folder");
 
   // test moving between folders
   var testFolderA = root.addFolder("folder-a");
   var testFolderB = root.addFolder("folder-b");
 
-  var testMove = testFolderA.addBookmark("Mozilla", url("http://www.mozilla.com/"));
+  var testMove = testFolderA.addBookmark("Mozilla", url("https://www.mozilla.org/"));
   testMove.events.addListener("move", onBookmarkMove);
   is(testMove.parent.title, "folder-a", "Checking for new parent before moving bookmark");
 
   testMove.parent = testFolderB;
   is(testMove.parent.title, "folder-b", "Checking for new parent after moving bookmark");
   is(gLastBookmarkAction, "move", "Checking for event handler after moving bookmark");
 
   // test moving a folder
--- a/browser/locales/en-US/chrome/browser-region/region.properties
+++ b/browser/locales/en-US/chrome/browser-region/region.properties
@@ -23,17 +23,17 @@ browser.contentHandlers.types.0.uri=http
 gecko.handlerService.defaultHandlersVersion=3
 
 # The default set of protocol handlers for webcal:
 gecko.handlerService.schemes.webcal.0.name=30 Boxes
 gecko.handlerService.schemes.webcal.0.uriTemplate=http://30boxes.com/external/widget?refer=ff&url=%s
 
 # The default set of protocol handlers for mailto:
 gecko.handlerService.schemes.mailto.0.name=Yahoo! Mail
-gecko.handlerService.schemes.mailto.0.uriTemplate=http://compose.mail.yahoo.com/?To=%s 
+gecko.handlerService.schemes.mailto.0.uriTemplate=https://compose.mail.yahoo.com/?To=%s
 gecko.handlerService.schemes.mailto.1.name=Gmail
 gecko.handlerService.schemes.mailto.1.uriTemplate=https://mail.google.com/mail/?extsrc=mailto&url=%s
 
 # The default set of protocol handlers for irc:
 gecko.handlerService.schemes.irc.0.name=Mibbit
 gecko.handlerService.schemes.irc.0.uriTemplate=https://www.mibbit.com/?url=%s
 
 # The default set of protocol handlers for ircs:
--- a/browser/locales/en-US/chrome/browser/aboutDialog.dtd
+++ b/browser/locales/en-US/chrome/browser/aboutDialog.dtd
@@ -31,17 +31,17 @@
 <!ENTITY contribute.end             "">
 
 <!-- LOCALIZATION NOTE (bottomLinks.license): This is a link title that links to about:license. -->
 <!ENTITY bottomLinks.license        "Licensing Information">
 
 <!-- LOCALIZATION NOTE (bottomLinks.rights): This is a link title that links to about:rights. -->
 <!ENTITY bottomLinks.rights         "End-User Rights">
 
-<!-- LOCALIZATION NOTE (bottomLinks.privacy): This is a link title that links to http://www.mozilla.com/legal/privacy/. -->
+<!-- LOCALIZATION NOTE (bottomLinks.privacy): This is a link title that links to https://www.mozilla.org/legal/privacy/. -->
 <!ENTITY bottomLinks.privacy        "Privacy Policy">
 
 <!-- LOCALIZATION NOTE (update.checkingForUpdates): try to make the localized text short (see bug 596813 for screenshots). -->
 <!ENTITY update.checkingForUpdates  "Checking for updates…">
 <!-- LOCALIZATION NOTE (update.checkingAddonCompat): try to make the localized text short (see bug 596813 for screenshots). -->
 <!ENTITY update.checkingAddonCompat "Checking Add-on compatibility…">
 <!-- LOCALIZATION NOTE (update.noUpdatesFound): try to make the localized text short (see bug 596813 for screenshots). -->
 <!ENTITY update.noUpdatesFound      "&brandShortName; is up to date">
--- a/browser/locales/en-US/chrome/browser/aboutRobots.dtd
+++ b/browser/locales/en-US/chrome/browser/aboutRobots.dtd
@@ -1,16 +1,14 @@
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!-- These strings are used in the about:robots page, which ties in with the
-     robots theme used in the Firefox 3 Beta 2/3 first run pages...
-         https://www.mozilla.com/en-US/firefox/3.0b2/firstrun/
-         https://www.mozilla.com/en-US/firefox/3.0b3/firstrun/
+     robots theme used in the Firefox 3 Beta 2/3 first run pages.
      They're just meant to be fun and whimsical, with references to some geeky
      but well-known robots in movies and books. Be creative with translations! -->
 
 <!-- Nonsense line from the movie "The Day The Earth Stood Still". No translation needed. -->
 <!ENTITY robots.pagetitle  "Gort! Klaatu barada nikto!">
 <!-- Movie: Logan's Run... Box (cybog): "Welcome Humans! I am ready for you." -->
 <!ENTITY robots.errorTitleText "Welcome Humans!">
 <!-- Movie: The Day The Earth Stood Still. Spoken by Klaatu. -->
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -428,33 +428,33 @@ identity.newIdentity.description = Enter
 identity.next.label = Next
 identity.next.accessKey = n
 # LOCALIZATION NOTE: shown in the popup notification when a user successfully logs into a website
 # LOCALIZATION NOTE (identity.loggedIn.description): %S is the user's identity (e.g. user@example.com)
 identity.loggedIn.description = Signed in as: %S
 identity.loggedIn.signOut.label = Sign Out
 identity.loggedIn.signOut.accessKey = O
 
-# LOCALIZATION NOTE (getUserMedia.shareCamera.message, getUserMedia.shareMicrophone.message, getUserMedia.shareCameraAndMicrophone.message, getUserMedia.sharingCamera.message, getUserMedia.sharingMicrophone.message, getUserMedia.sharingCameraAndMicrophone.message): %S is the website origin (e.g. www.mozilla.org)
+# LOCALIZATION NOTE (getUserMedia.shareCamera.message, getUserMedia.shareMicrophone.message, getUserMedia.shareCameraAndMicrophone.message): %S is the website origin (e.g. www.mozilla.org)
 # LOCALIZATION NOTE (getUserMedia.shareSelectedDevices.label):
 # Semicolon-separated list of plural forms. See:
 # http://developer.mozilla.org/en/docs/Localization_and_Plurals
 # The number of devices can be either one or two.
 getUserMedia.shareCamera.message = Would you like to share your camera with %S?
 getUserMedia.shareMicrophone.message = Would you like to share your microphone with %S?
 getUserMedia.shareCameraAndMicrophone.message = Would you like to share your camera and microphone with %S?
 getUserMedia.noVideo.label = No Video
 getUserMedia.noAudio.label = No Audio
 getUserMedia.shareSelectedDevices.label = Share Selected Device;Share Selected Devices
 getUserMedia.shareSelectedDevices.accesskey = S
 getUserMedia.denyRequest.label = Don't Share
 getUserMedia.denyRequest.accesskey = D
-getUserMedia.sharingCamera.message = You are currently sharing your camera with %S.
-getUserMedia.sharingMicrophone.message = You are currently sharing your microphone with %S.
-getUserMedia.sharingCameraAndMicrophone.message = You are currently sharing your camera and microphone with %S.
+getUserMedia.sharingCamera.message2 = You are currently sharing your camera with this page.
+getUserMedia.sharingMicrophone.message2 = You are currently sharing your microphone with this page.
+getUserMedia.sharingCameraAndMicrophone.message2 = You are currently sharing your camera and microphone with this page.
 
 # Mixed Content Blocker Doorhanger Notification
 # LOCALIZATION NOTE - %S is brandShortName
 mixedContentBlocked.message = %S has blocked content that isn't secure.
 mixedContentBlocked.keepBlockingButton.label = Keep Blocking
 mixedContentBlocked.keepBlockingButton.accesskey = B
 mixedContentBlocked.unblock.label = Disable Protection on This Page
 mixedContentBlocked.unblock.accesskey = D
--- a/browser/locales/en-US/chrome/browser/devtools/netmonitor.properties
+++ b/browser/locales/en-US/chrome/browser/devtools/netmonitor.properties
@@ -100,16 +100,24 @@ jsonpScopeName=JSONP → callback %S()
 # LOCALIZATION NOTE (networkMenu.sortedAsc): This is the tooltip displayed
 # in the network table toolbar, for any column that is sorted ascending.
 networkMenu.sortedAsc=Sorted ascending
 
 # LOCALIZATION NOTE (networkMenu.sortedDesc): This is the tooltip displayed
 # in the network table toolbar, for any column that is sorted descending.
 networkMenu.sortedDesc=Sorted descending
 
+# LOCALIZATION NOTE (networkMenu.empty): This is the label displayed
+# in the network table footer when there are no requests available.
+networkMenu.empty=No requests
+
+# LOCALIZATION NOTE (networkMenu.summary): This is the label displayed
+# in the network table footer providing concise information about all requests.
+networkMenu.summary=One request, #2 KB, #3 s;#1 requests, #2 KB, #3 s
+
 # LOCALIZATION NOTE (networkMenu.sizeKB): This is the label displayed
 # in the network menu specifying the size of a request (in kilobytes).
 networkMenu.sizeKB=%S KB
 
 # LOCALIZATION NOTE (networkMenu.totalMS): This is the label displayed
 # in the network menu specifying the time for a request to finish (in milliseconds).
 networkMenu.totalMS=→ %S ms
 
--- a/browser/locales/en-US/profile/bookmarks.inc
+++ b/browser/locales/en-US/profile/bookmarks.inc
@@ -9,32 +9,32 @@
 
 #define bookmarks_title Bookmarks
 #define bookmarks_heading Bookmarks
 
 #define bookmarks_toolbarfolder Bookmarks Toolbar Folder
 #define bookmarks_toolbarfolder_description Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
 
 # LOCALIZATION NOTE (getting_started):
-# link title for http://en-US.www.mozilla.com/en-US/firefox/central/
+# link title for https://www.mozilla.org/en-US/firefox/central/
 #define getting_started Getting Started
 
 # LOCALIZATION NOTE (firefox_heading):
 # Firefox links folder name
 #define firefox_heading Mozilla Firefox
 
 # LOCALIZATION NOTE (firefox_help):
-# link title for http://en-US.www.mozilla.com/en-US/firefox/help/
+# link title for https://www.mozilla.org/en-US/firefox/help/
 #define firefox_help Help and Tutorials
 
 # LOCALIZATION NOTE (firefox_customize):
-# link title for http://en-US.www.mozilla.com/en-US/firefox/customize/
+# link title for https://www.mozilla.org/en-US/firefox/customize/
 #define firefox_customize Customize Firefox
 
 # LOCALIZATION NOTE (firefox_community):
-# link title for http://en-US.www.mozilla.com/en-US/firefox/community/
+# link title for https://www.mozilla.org/en-US/contribute/
 #define firefox_community Get Involved
 
 # LOCALIZATION NOTE (firefox_about):
-# link title for http://en-US.www.mozilla.com/en-US/about/
+# link title for https://www.mozilla.org/en-US/about/
 #define firefox_about About Us
 
 #unfilter emptyLines
--- a/browser/locales/generic/extract-bookmarks.py
+++ b/browser/locales/generic/extract-bookmarks.py
@@ -27,36 +27,36 @@ template = '''#filter emptyLines
 
 #define bookmarks_title %s
 #define bookmarks_heading %s
 
 #define bookmarks_toolbarfolder %s
 #define bookmarks_toolbarfolder_description %s
 
 # LOCALIZATION NOTE (getting_started):
-# link title for http://www.mozilla.com/en-US/firefox/central/
+# link title for https://www.mozilla.org/en-US/firefox/central/
 #define getting_started %s
 
 # LOCALIZATION NOTE (firefox_heading):
 # Firefox links folder name
 #define firefox_heading %s
 
 # LOCALIZATION NOTE (firefox_help):
-# link title for http://www.mozilla.com/en-US/firefox/help/
+# link title for https://www.mozilla.org/en-US/firefox/help/
 #define firefox_help %s
 
 # LOCALIZATION NOTE (firefox_customize):
-# link title for http://www.mozilla.com/en-US/firefox/customize/
+# link title for https://www.mozilla.org/en-US/firefox/customize/
 #define firefox_customize %s
 
 # LOCALIZATION NOTE (firefox_community):
-# link title for http://www.mozilla.com/en-US/firefox/community/
+# link title for https://www.mozilla.org/en-US/contribute/
 #define firefox_community %s
 
 # LOCALIZATION NOTE (firefox_about):
-# link title for http://www.mozilla.com/en-US/about/
+# link title for https://www.mozilla.org/en-US/about/
 #define firefox_about %s
 
 #unfilter emptyLines'''
 
 strings = tuple(e.val for e in p if ll.search(e.key))
 
 print codecs.utf_8_encode(template % strings)[0]
--- a/browser/locales/generic/profile/bookmarks.html.in
+++ b/browser/locales/generic/profile/bookmarks.html.in
@@ -10,18 +10,18 @@
 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
 <TITLE>@bookmarks_title@</TITLE>
 <H1>@bookmarks_heading@</H1>
 
 <DL><p>
     <DT><H3 PERSONAL_TOOLBAR_FOLDER="true" ID="rdf:#$FvPhC3">@bookmarks_toolbarfolder@</H3>
 <DD>@bookmarks_toolbarfolder_description@
     <DL><p>
-        <DT><A HREF="http://www.mozilla.com/@AB_CD@/firefox/central/" ID="rdf:#$GvPhC3">@getting_started@</A>
+        <DT><A HREF="https://www.mozilla.org/@AB_CD@/firefox/central/" ID="rdf:#$GvPhC3">@getting_started@</A>
     </DL><p>
     <DT><H3 ID="rdf:#$ZvPhC3">@firefox_heading@</H3>
     <DL><p>
-        <DT><A HREF="http://www.mozilla.com/@AB_CD@/firefox/help/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$22iCK1">@firefox_help@</A>
-        <DT><A HREF="http://www.mozilla.com/@AB_CD@/firefox/customize/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$32iCK1">@firefox_customize@</A>
-        <DT><A HREF="http://www.mozilla.com/@AB_CD@/firefox/community/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$42iCK1">@firefox_community@</A>
-        <DT><A HREF="http://www.mozilla.com/@AB_CD@/about/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$52iCK1">@firefox_about@</A>
+        <DT><A HREF="https://www.mozilla.org/@AB_CD@/firefox/help/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$22iCK1">@firefox_help@</A>
+        <DT><A HREF="https://www.mozilla.org/@AB_CD@/firefox/customize/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$32iCK1">@firefox_customize@</A>
+        <DT><A HREF="https://www.mozilla.org/@AB_CD@/contribute/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$42iCK1">@firefox_community@</A>
+        <DT><A HREF="https://www.mozilla.org/@AB_CD@/about/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$52iCK1">@firefox_about@</A>
     </DL><p>
 </DL><p>
--- a/browser/metro/base/content/ContentAreaObserver.js
+++ b/browser/metro/base/content/ContentAreaObserver.js
@@ -155,29 +155,48 @@ var ContentAreaObserver = {
     if (newHeight == oldHeight && newWidth == oldWidth)
       return;
 
     this.styles["viewable-height"].height = newHeight + "px";
     this.styles["viewable-height"].maxHeight = newHeight + "px";
     this.styles["viewable-width"].width = newWidth + "px";
     this.styles["viewable-width"].maxWidth = newWidth + "px";
 
+    // Adjust the app and find bar position above the soft keyboard
+    let navBar = document.getElementById("navbar");
+    let contextAppBar = document.getElementById("contextappbar");
+    let findBar = document.getElementById("content-navigator");
+    let keyboardHeight = MetroUtils.keyboardHeight;
+    navBar.style.bottom = keyboardHeight + "px";
+    contextAppBar.style.bottom = keyboardHeight + "px";
+    findBar.style.bottom = keyboardHeight + "px";
+
+    // Update the back/tab button states. If the keyboard is up
+    // these are hidden.
+    BrowserUI._updateButtons();
+
     this._disatchBrowserEvent("ViewableSizeChanged");
   },
 
   onBrowserCreated: function onBrowserCreated(aBrowser) {
     aBrowser.classList.add("content-width");
     aBrowser.classList.add("content-height");
   },
 
   /*
    * Event handling
    */
 
   _onKeyboardDisplayChanging: function _onKeyboardDisplayChanging(aNewState) {
+    if (aNewState) {
+      Elements.stack.setAttribute("keyboardVisible", true);
+    } else {
+      Elements.stack.removeAttribute("keyboardVisible");
+    }
+
     this.updateViewableArea();
 
     if (!aNewState) {
       this._shiftBrowserDeck(0);
       return;
     }
 
     // Request info about the target form element to see if we
--- a/browser/metro/base/content/WebProgress.js
+++ b/browser/metro/base/content/WebProgress.js
@@ -59,25 +59,29 @@ const WebProgress = {
         this._progressStep();
         break;
       }
     }
   },
 
   _securityChange: function _securityChange(aJson, aTab) {
     let state = aJson.state;
-    let identityBox = document.getElementById("identity-box-inner");
     let nsIWebProgressListener = Ci.nsIWebProgressListener;
 
     if (state & nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL) {
-      aTab._identityState = identityBox.className = "verifiedIdentity";
+      aTab._identityState = "verifiedIdentity";
     } else if (state & nsIWebProgressListener.STATE_IS_SECURE) {
-      aTab._identityState = identityBox.className = "verifiedDomain";
+      aTab._identityState = "verifiedDomain";
     } else {
-      aTab._identityState = identityBox.className = "";
+      aTab._identityState = "";
+    }
+
+    if (aTab == Browser.selectedTab) {
+      let identityBox = document.getElementById("identity-box-inner");
+      identityBox.className = aTab._identityState;
     }
   },
 
   _locationChange: function _locationChange(aJson, aTab) {
     let spec = aJson.location;
     let location = spec.split("#")[0]; // Ignore fragment identifier changes.
 
     if (aTab == Browser.selectedTab)
--- a/browser/metro/base/content/appbar.js
+++ b/browser/metro/base/content/appbar.js
@@ -34,25 +34,26 @@ var Appbar = {
 
     // tilegroup selection events for all modules get bubbled up
     window.addEventListener("selectionchange", this, false);
   },
 
   handleEvent: function Appbar_handleEvent(aEvent) {
     switch (aEvent.type) {
       case 'MozContextUIShow':
-        Elements.appbar.show();
+        Elements.navbar.show();
         break;
       case 'MozAppbarDismiss':
       case 'MozContextUIDismiss':
       case 'URLChanged':
       case 'TabSelect':
       case 'ToolPanelShown':
       case 'ToolPanelHidden':
-        Elements.appbar.dismiss();
+        Elements.navbar.dismiss();
+        Elements.contextappbar.dismiss();
         break;
       case 'MozAppbarShowing':
         this._updatePinButton();
         this._updateStarButton();
         break;
       case 'MozAppbarDismissing':
         if (this.activeTileset) {
           this.activeTileset.clearSelection();
@@ -124,17 +125,17 @@ var Appbar = {
                                      null, null);
         if (uri.schemeIs('http') || uri.schemeIs('https')) {
           typesArray.push("view-on-desktop");
         }
       } catch(ex) {
       }
 
       var x = this.moreButton.getBoundingClientRect().left;
-      var y = Elements.appbar.getBoundingClientRect().top;
+      var y = Elements.navbar.getBoundingClientRect().top;
       ContextMenuUI.showContextMenu({
         json: {
           types: typesArray,
           string: '',
           xPos: x,
           yPos: y,
           leftAligned: true,
           bottomAligned: true
--- a/browser/metro/base/content/bindings/autocomplete.xml
+++ b/browser/metro/base/content/bindings/autocomplete.xml
@@ -49,17 +49,17 @@
       </handler>
 
       <handler event="contextmenu" phase="capturing">
         <![CDATA[
           let box = this.inputField.parentNode;
           box.showContextMenu(this, event, true);
         ]]>
       </handler>
-      
+
       <handler event="keypress" phase="capturing" keycode="VK_RETURN">
         <![CDATA[
           event.preventDefault();
           event.stopPropagation();
 
           this.popup.handleCompletion();
         ]]>
       </handler>
@@ -263,27 +263,27 @@
             let controller = this.input.controller;
             let lastMatch = this._matchCount - 1;
             let iterCount = Math.max(this._results.itemCount, this._matchCount);
 
             // Swap out existing items for new search hit results
             for (let i = 0; i < iterCount; i++) {
               if (i > lastMatch) {
                 let lastItem = this._results.itemCount - 1;
-                this._results.removeItemAt(lastItem);
+                this._results.removeItemAt(lastItem, true);
                 continue;
               }
 
               let value = controller.getValueAt(i);
               let label = controller.getCommentAt(i) || value;
               let iconURI = controller.getImageAt(i);
 
               let item = this._results.getItemAtIndex(i);
               if (item == null) {
-                item = this._results.appendItem(label, value);
+                item = this._results.appendItem(label, value, true);
                 item.setAttribute("autocomplete", "true");
               } else {
                 item.setAttribute("label", label);
                 item.setAttribute("value", value);
               }
 
               item.setAttribute("iconURI", iconURI);
             }
@@ -303,20 +303,20 @@
         <body>
           <![CDATA[
             if (!this._isGridBound(this._searches))
               return;
 
             this._engines = Services.search.getVisibleEngines();
 
             while (this._searches.itemCount > 0)
-              this._searches.removeItemAt(0);
+              this._searches.removeItemAt(0, true);
 
             this._engines.forEach(function (anEngine) {
-              let item = this._searches.appendItem(anEngine.name, anEngine.name);
+              let item = this._searches.appendItem(anEngine.name, anEngine.name, true);
               item.setAttribute("autocomplete", "true");
               item.setAttribute("search", "true");
 
               let iconURI = anEngine.iconURI ? anEngine.iconURI.spec : "";
               item.setAttribute("iconURI", iconURI);
             }.bind(this));
 
             this._searches.arrangeItems();
@@ -331,19 +331,18 @@
               return;
 
             let searchString = this.input.controller.searchString;
             let label = Strings.browser.formatStringFromName("opensearch.search", [searchString], 1);
 
             for (let i = 0, len = this._searches.itemCount; i < len; i++) {
               let item = this._searches.getItemAtIndex(i);
               item.setAttribute("label", label);
+              item.refresh && item.refresh();
             }
-
-            this._searches.arrangeItems();
           ]]>
         </body>
       </method>
 
     <!-- Interface for handling actions across grids -->
 
       <method name="handleCompletion">
         <body>
--- a/browser/metro/base/content/bindings/bindings.xml
+++ b/browser/metro/base/content/bindings/bindings.xml
@@ -124,16 +124,17 @@
           let domUtils = Components.classes["@mozilla.org/inspector/dom-utils;1"].
                                            getService(Ci.inIDOMUtils);
           domUtils.setContentState(this, 0x00000001);
         ]]>
       </handler>
     </handlers>
   </binding>
 
+  <!-- remnants of the old fennec content navigation system, now just the find bar. this can be stripped down further. -->
   <binding id="content-navigator">
     <content class="window-width content-navigator-box" orient="horizontal" pack="start">
       <children includes="textbox"/>
       <xul:button anonid="previous-button" class="content-navigator-item previous-button" xbl:inherits="command=previous"/>
       <xul:button anonid="next-button" class="content-navigator-item next-button" xbl:inherits="command=next"/>
       <xul:spacer flex="1"/>
       <xul:button anonid="close-button" class="content-navigator-item close-button" xbl:inherits="command=close"/>
     </content>
@@ -152,20 +153,16 @@
       </field>
 
       <property name="isActive" onget="return !!this.model;"/>
 
       <field name="model">null</field>
       <method name="show">
         <parameter name="aModel" />
         <body><![CDATA[
-          // call the hide callback of the current object if any
-          if (this.model && this.model.type != aModel.type)
-            this.model.hide();
-
           this.setAttribute("type", aModel.type);
           this.setAttribute("next", aModel.commands.next);
           this.setAttribute("previous", aModel.commands.previous);
           this.setAttribute("close", aModel.commands.close);
 
           // buttons attributes sync with commands doesn not look updated when
           // we dynamically switch the "command" attribute so we need to ensure
           // the disabled state of the buttons is right when switching commands
@@ -178,17 +175,16 @@
 
       <method name="hide">
         <parameter name="aModel" />
         <body><![CDATA[
           this.removeAttribute("next");
           this.removeAttribute("previous");
           this.removeAttribute("close");
           this.removeAttribute("type");
-
           this.model = null;
         ]]></body>
       </method>
     </implementation>
   </binding>
 
   <binding id="menulist" display="xul:box" extends="chrome://global/content/bindings/menulist.xml#menulist">
     <handlers>
--- a/browser/metro/base/content/bindings/grid.xml
+++ b/browser/metro/base/content/bindings/grid.xml
@@ -707,16 +707,19 @@
       </property>
     </implementation>
 
     <handlers>
       <handler event="click" button="0">
         <![CDATA[
           // left-click/touch handler
           this.control.handleItemClick(this, event);
+          // Stop this from bubbling, when the richgrid container
+          // receives click events, we blur the nav bar.
+          event.stopPropagation();
         ]]>
       </handler>
       <handler event="contextmenu">
         <![CDATA[
           // fires for right-click, long-click and (keyboard) contextmenu input
           // TODO: handle cross-slide event when it becomes available,
           // .. using contextmenu is a stop-gap measure to allow us to
           // toggle the selected state of tiles in a grid
--- a/browser/metro/base/content/bookmarks.js
+++ b/browser/metro/base/content/bookmarks.js
@@ -25,17 +25,17 @@ var Bookmarks = {
         return;
 
       let bookmarkTitle = aTitle || aURI.spec;
       let bookmarkService = PlacesUtils.bookmarks;
       let bookmarkId = bookmarkService.insertBookmark(Bookmarks.metroRoot,
                                                       aURI,
                                                       bookmarkService.DEFAULT_INDEX,
                                                       bookmarkTitle);
-  
+
       // XXX Used for browser-chrome tests
       let event = document.createEvent("Events");
       event.initEvent("BookmarkCreated", true, false);
       window.dispatchEvent(event);
 
       if (callback)
         callback(bookmarkId);
     });
@@ -64,24 +64,25 @@ var Bookmarks = {
       window.dispatchEvent(event);
     });
   }
 };
 
 /**
  * Wraps a list/grid control implementing nsIDOMXULSelectControlElement and
  * fills it with the user's bookmarks.
- * 
+ *
  * @param           aSet    Control implementing nsIDOMXULSelectControlElement.
  * @param {Number}  aLimit  Maximum number of items to show in the view.
  * @param           aRoot   Bookmark root to show in the view.
  */
 function BookmarksView(aSet, aLimit, aRoot, aFilterUnpinned) {
   this._set = aSet;
   this._set.controller = this;
+  this._inBatch = false; // batch up grid updates to avoid redundant arrangeItems calls
 
   this._limit = aLimit;
   this._filterUnpinned = aFilterUnpinned;
   this._bookmarkService = PlacesUtils.bookmarks;
   this._navHistoryService = gHistSvc;
 
   this._changes = new BookmarkChangeListener(this);
   this._pinHelper = new ItemPinHelper("metro.bookmarks.unpinned");
@@ -147,16 +148,18 @@ BookmarksView.prototype = {
     let query = this._navHistoryService.getNewQuery();
     query.setFolders([Bookmarks.metroRoot], 1);
 
     let result = this._navHistoryService.executeQuery(query, options);
     let rootNode = result.root;
     rootNode.containerOpen = true;
     let childCount = rootNode.childCount;
 
+    this._inBatch = true; // batch up grid updates to avoid redundant arrangeItems calls
+
     for (let i = 0, addedCount = 0; i < childCount && addedCount < limit; i++) {
       let node = rootNode.getChild(i);
 
       // Ignore folders, separators, undefined item types, etc.
       if (node.type != node.RESULT_TYPE_URI)
         continue;
 
       // If item is marked for deletion, skip it.
@@ -183,39 +186,41 @@ BookmarksView.prototype = {
 
       addedCount++;
     }
 
     // Remove extra items in case a refresh added more than the limit.
     // This can happen when undoing a delete.
     if (aRefresh) {
       while (this._set.itemCount > limit)
-        this._set.removeItemAt(this._set.itemCount - 1);
+        this._set.removeItemAt(this._set.itemCount - 1, true);
     }
-
+    this._set.arrangeItems();
+    this._inBatch = false;
     rootNode.containerOpen = false;
   },
 
   inCurrentView: function bv_inCurrentView(aParentId, aItemId) {
     if (this._root && aParentId != this._root)
       return false;
 
     return !!this._getItemForBookmarkId(aItemId);
   },
 
   clearBookmarks: function bv_clearBookmarks() {
     while (this._set.itemCount > 0)
-      this._set.removeItemAt(0);
+      this._set.removeItemAt(0, true);
+    this._set.arrangeItems();
   },
 
   addBookmark: function bv_addBookmark(aBookmarkId, aPos) {
     let index = this._bookmarkService.getItemIndex(aBookmarkId);
     let uri = this._bookmarkService.getBookmarkURI(aBookmarkId);
     let title = this._bookmarkService.getItemTitle(aBookmarkId) || uri.spec;
-    let item = this._set.insertItemAt(aPos || index, title, uri.spec);
+    let item = this._set.insertItemAt(aPos || index, title, uri.spec, this._inBatch);
     item.setAttribute("bookmarkId", aBookmarkId);
     this._setContextActions(item);
     this._updateFavicon(aBookmarkId, item, uri);
   },
 
   _setContextActions: function bv__setContextActions(aItem) {
     let itemId = this._getBookmarkIdForItem(aItem);
     aItem.setAttribute("data-contextactions", "delete," + (this._pinHelper.isPinned(itemId) ? "unpin" : "pin"));
@@ -247,17 +252,17 @@ BookmarksView.prototype = {
     window.dispatchEvent(event);
   },
 
   updateBookmark: function bv_updateBookmark(aBookmarkId) {
     let item = this._getItemForBookmarkId(aBookmarkId);
 
     if (!item)
       return;
-    
+
     let oldIndex = this._set.getIndexOfItem(item);
     let index = this._bookmarkService.getItemIndex(aBookmarkId);
 
     if (oldIndex != index) {
       this.removeBookmark(aBookmarkId);
       this.addBookmark(aBookmarkId);
       return;
     }
@@ -269,17 +274,17 @@ BookmarksView.prototype = {
     item.setAttribute("label", title);
 
     this._updateFavicon(aBookmarkId, item, uri);
   },
 
   removeBookmark: function bv_removeBookmark(aBookmarkId) {
     let item = this._getItemForBookmarkId(aBookmarkId);
     let index = this._set.getIndexOfItem(item);
-    this._set.removeItemAt(index);
+    this._set.removeItemAt(index, this._inBatch);
   },
 
   destruct: function bv_destruct() {
     this._bookmarkService.removeObserver(this._changes);
     window.removeEventListener('MozAppbarDismissing', this, false);
     window.removeEventListener('BookmarksNeedsRefresh', this, false);
   },
 
@@ -421,17 +426,17 @@ BookmarkChangeListener.prototype = {
   onItemAdded: function bCL_onItemAdded(aItemId, aParentId, aIndex, aItemType, aURI, aTitle, aDateAdded, aGUID, aParentGUID) {
     this._view.getBookmarks(true);
   },
 
   onItemChanged: function bCL_onItemChanged(aItemId, aProperty, aIsAnnotationProperty, aNewValue, aLastModified, aItemType, aParentId, aGUID, aParentGUID) {
     let itemIndex = PlacesUtils.bookmarks.getItemIndex(aItemId);
     if (!this._view.inCurrentView(aParentId, aItemId))
       return;
-    
+
     this._view.updateBookmark(aItemId);
   },
 
   onItemMoved: function bCL_onItemMoved(aItemId, aOldParentId, aOldIndex, aNewParentId, aNewIndex, aItemType, aGUID, aOldParentGUID, aNewParentGUID) {
     let wasInView = this._view.inCurrentView(aOldParentId, aItemId);
     let nowInView = this._view.inCurrentView(aNewParentId, aItemId);
 
     if (!wasInView && nowInView)
--- a/browser/metro/base/content/browser-ui.js
+++ b/browser/metro/base/content/browser-ui.js
@@ -38,17 +38,17 @@ let Elements = {};
   ["tabList",            "tabs"],
   ["tabs",               "tabs-container"],
   ["controls",           "browser-controls"],
   ["panelUI",            "panel-container"],
   ["startUI",            "start-container"],
   ["tray",               "tray"],
   ["toolbar",            "toolbar"],
   ["browsers",           "browsers"],
-  ["appbar",             "appbar"],
+  ["navbar",             "navbar"],
   ["contextappbar",      "contextappbar"],
   ["contentViewport",    "content-viewport"],
   ["progress",           "progress-control"],
   ["progressContainer",  "progress-container"],
   ["contentNavigator",   "content-navigator"],
   ["aboutFlyout",        "about-flyoutpanel"],
   ["prefsFlyout",        "prefs-flyoutpanel"],
   ["syncFlyout",         "sync-flyoutpanel"]
@@ -534,16 +534,20 @@ var BrowserUI = {
   },
 
   blurFocusedElement: function blurFocusedElement() {
     let focusedElement = document.commandDispatcher.focusedElement;
     if (focusedElement)
       focusedElement.blur();
   },
 
+  blurNavBar: function blurNavBar() {
+    this._edit.blur();
+  },
+
   // If the user types in the address bar, cancel pending
   // navbar autohide if set.
   navEditKeyPress: function navEditKeyPress() {
     ContextUI.cancelDismiss();
   },
 
   observe: function BrowserUI_observe(aSubject, aTopic, aData) {
     switch (aTopic) {
@@ -612,16 +616,19 @@ var BrowserUI = {
 
     let tab = Browser.getTabForBrowser(aBrowser);
     if (tab)
       tab.chromeTab.updateTitle(tabCaption);
   },
 
   _updateButtons: function _updateButtons() {
     let browser = Browser.selectedBrowser;
+    if (!browser) {
+      return;
+    }
     if (browser.canGoBack) {
       this._back.removeAttribute("disabled");
     } else {
       this._back.setAttribute("disabled", true);
     }
     if (browser.canGoForward) {
       this._forward.removeAttribute("disabled");
     } else {
@@ -1027,17 +1034,17 @@ var BrowserUI = {
       case "cmd_home":
         this.goToURI(Browser.getHomePage());
         break;
       case "cmd_openLocation":
         ContextUI.displayNavbar();
         this._editURI(true);
         break;
       case "cmd_addBookmark":
-        Elements.appbar.show();
+        Elements.navbar.show();
         Appbar.onStarButton(true);
         break;
       case "cmd_bookmarks":
         PanelUI.show("bookmarks-container");
         break;
       case "cmd_history":
         PanelUI.show("history-container");
         break;
@@ -1091,16 +1098,20 @@ var BrowserUI = {
         break;
       case "cmd_openFile":
         this.openFile();
         break;
       case "cmd_savePage":
         this.savePage();
         break;
     }
+  },
+
+  crashReportingPrefChanged: function crashReportingPrefChanged(aState) {
+    CrashReporter.submitReports = aState;
   }
 };
 
 /**
  * Tracks whether context UI (app bar, tab bar, url bar) is shown or hidden.
  * Manages events to summon and hide the context UI.
  */
 var ContextUI = {
@@ -1166,19 +1177,19 @@ var ContextUI = {
       this._setIsExpanded(true);
       shown = true;
     }
     if (!this.isVisible) {
       // show the navbar
       this._setIsVisible(true);
       shown = true;
     }
-    if (!Elements.appbar.isShowing) {
-      // show the appbar
-      Elements.appbar.show();
+    if (!Elements.navbar.isShowing) {
+      // show the navbar
+      Elements.navbar.show();
       shown = true;
     }
 
     this._clearDelayedTimeout();
     if (shown) {
       ContentAreaObserver.update(window.innerWidth, window.innerHeight);
     }
     return shown;
@@ -1219,17 +1230,17 @@ var ContextUI = {
     if (this.isExpanded) {
       this._setIsExpanded(false);
       dismissed = true;
     }
     if (this.isVisible && !StartUI.isStartURI()) {
       this._setIsVisible(false);
       dismissed = true;
     }
-    if (Elements.appbar.isShowing) {
+    if (Elements.navbar.isShowing) {
       this.dismissAppbar();
       dismissed = true;
     }
     this._clearDelayedTimeout();
     if (dismissed) {
       ContentAreaObserver.update(window.innerWidth, window.innerHeight);
     }
     return dismissed;
@@ -1400,16 +1411,17 @@ var StartUI = {
     "HistoryStartView",
     "RemoteTabsStartView"
   ],
 
   init: function init() {
     Elements.startUI.addEventListener("autocompletestart", this, false);
     Elements.startUI.addEventListener("autocompleteend", this, false);
     Elements.startUI.addEventListener("contextmenu", this, false);
+    Elements.startUI.addEventListener("click", this, false);
 
     this.sections.forEach(function (sectionName) {
       let section = window[sectionName];
       if (section.init)
         section.init();
     });
   },
 
@@ -1481,29 +1493,38 @@ var StartUI = {
     aURI = aURI || Browser.selectedBrowser.currentURI.spec;
     if (this.isStartURI(aURI)) {
       this.show();
     } else if (aURI != "about:blank") { // about:blank is loaded briefly for new tabs; ignore it
       this.hide(aURI);
     }
   },
 
+  onClick: function onClick(aEvent) {
+    // If someone clicks / taps in empty grid space, take away
+    // focus from the nav bar edit so the soft keyboard will hide.
+    BrowserUI.blurNavBar();
+  },
+
   handleEvent: function handleEvent(aEvent) {
     switch (aEvent.type) {
       case "autocompletestart":
         this.filter();
         break;
       case "autocompleteend":
         this.unfilter();
         break;
       case "contextmenu":
         let event = document.createEvent("Events");
         event.initEvent("MozEdgeUICompleted", true, false);
         window.dispatchEvent(event);
         break;
+      case "click":
+        this.onClick(aEvent);
+        break;
     }
   }
 };
 
 var SyncPanelUI = {
   init: function() {
     // Run some setup code the first time the panel is shown.
     Elements.syncFlyout.addEventListener("PopupChanged", function onShow(aEvent) {
@@ -1515,16 +1536,21 @@ var SyncPanelUI = {
   }
 };
 
 var FlyoutPanelsUI = {
   init: function() {
     AboutPanelUI.init();
     PreferencesPanelView.init();
     SyncPanelUI.init();
+
+    // make sure to hide all flyouts when window is deactivated
+    window.addEventListener("deactivate", function(window) {
+      FlyoutPanelsUI.hide();
+    });
   },
 
   hide: function() {
     Elements.aboutFlyout.hide();
     Elements.prefsFlyout.hide();
     Elements.syncFlyout.hide();
   }
 };
--- a/browser/metro/base/content/browser.xul
+++ b/browser/metro/base/content/browser.xul
@@ -192,17 +192,17 @@
                 onselect="BrowserUI.selectTabAndDismiss(this);"
                 onclosetab="BrowserUI.closeTab(this);"/>
           <vbox id="tabs-controls">
             <toolbarbutton id="newtab-button" command="cmd_newTab" label="&newtab.label;"/>
           </vbox>
         </hbox>
 
         <!-- Start UI -->
-        <hbox id="start-container" flex="1" observes="bcast_windowState" class="meta content-height content-width" onclick="false;">
+        <hbox id="start-container" flex="1" observes="bcast_windowState" class="meta content-height content-width">
           <!-- portrait/landscape/filled view -->
           <hbox id="start" class="start-page" flex="1" observes="bcast_windowState">
             <scrollbox id="start-scrollbox" orient="horizontal" flex="1">
             <vbox id="start-topsites" class="meta-section">
               <label class="meta-section-title" value="&startTopSitesHeader.label;"/>
               <richgrid id="start-topsites-grid" rows="3" columns="3" seltype="multiple" flex="1"/>
             </vbox>
             <vbox id="start-bookmarks" class="meta-section">
@@ -302,18 +302,18 @@
             </hbox>
           </vbox>
 
           <richlistbox id="console-box" class="panel-list console-box" flex="1" onkeypress="ConsolePanelView.onConsoleBoxKeyPress(event)" oncontextmenu="ConsolePanelView.onContextMenu(event);"/>
         </vbox>
       </deck>
     </vbox>
 
-    <!-- Windows 8 Appbar -->
-    <appbar id="appbar" mousethrough="never" observes="bcast_windowState">
+    <!-- Navbar -->
+    <appbar id="navbar" mousethrough="never" observes="bcast_windowState">
       <hbox id="progress-container" layer="true">
         <hbox id="progress-control" />
       </hbox>
 
       <!-- Main Toolbar -->
       <toolbar id="toolbar" observes="bcast_windowState" flex="1">
         <observes element="bcast_windowState" attribute="*"/>
         <observes element="bcast_urlbarState" attribute="*"/>
@@ -355,16 +355,17 @@
         <toolbarbutton id="zoomout-button" oncommand="Appbar.onZoomOutButton()"/>
         <toolbarbutton id="zoomin-button" oncommand="Appbar.onZoomInButton()"/>
         <toolbarbutton id="star-button" type="checkbox" oncommand="Appbar.onStarButton()"/>
         <toolbarbutton id="pin-button" type="checkbox" oncommand="Appbar.onPinButton()"/>
         <toolbarbutton id="more-button" onclick="Appbar.onMoreButton(event)"/>
       </toolbar>
     </appbar>
 
+    <!-- Context button bar -->
     <appbar id="contextappbar">
       <toolbar id="contextualactions-tray" flex="1">
         <toolbarbutton id="delete-selected-button" hidden="true" fade="true" oncommand="Appbar.dispatchContextualAction('delete')"/>
         <toolbarbutton id="restore-selected-button" hidden="true" fade="true" oncommand="Appbar.dispatchContextualAction('restore')"/>
         <toolbarbutton id="pin-selected-button" hidden="true" fade="true" oncommand="Appbar.dispatchContextualAction('pin')"/>
         <toolbarbutton id="unpin-selected-button" hidden="true" fade="true" oncommand="Appbar.dispatchContextualAction('unpin')"/>
         <toolbarbutton id="clear-selected-button" hidden="true" fade="true" oncommand="Appbar.dispatchContextualAction('clear')"/>
       </toolbar>
@@ -506,16 +507,19 @@
               <!-- TODO: we need a more metro-y throbber. See bug 852622 -->
               <image src="chrome://browser/skin/images/throbber.png" />
             </hbox>
             <description id="clear-notification-done">&clearPrivateData.done;</description>
           </deck>
         </hbox>
       </settings>
       <setting pref="signon.rememberSignons" title="&optionsHeader.privacy.passwords.label;" type="bool"/>
+      <settings id="prefs-reporting" label="&optionsHeader.reporting.title;">
+        <setting pref="app.reportCrashes" type="bool" title="&optionsHeader.reporting.crashes.label;" oncommand="BrowserUI.crashReportingPrefChanged(this.value);"/>
+      </settings>
       <settings id="prefs-dnt" label="&doNotTrack.title;">
         <description>&doNotTrack.desc;</description>
         <setting id="prefs-dnt-value" pref="privacy.donottrackheader.value" onpreferencechanged="PreferencesPanelView.onDNTPreferenceChanged()" type="radio" >
           <radiogroup id="prefs-dnt-options">
             <radio id="prefs-dnt-notrack" label="&doNotTrack.options.trackingNotOkay;" value="1"/>
             <radio id="prefs-dnt-nopref" label="&doNotTrack.options.noPreference;" value="-1"/>
             <radio id="prefs-dnt-oktrack" label="&doNotTrack.options.trackingOkay;" value="0"/>
           </radiogroup>
--- a/browser/metro/base/content/contenthandlers/SelectionHandler.js
+++ b/browser/metro/base/content/contenthandlers/SelectionHandler.js
@@ -318,17 +318,24 @@ var SelectionHandler = {
     *
     * @param aX, aY drag location in client coordinates.
     */
   _onCaretMove: function _onCaretMove(aX, aY) {
     if (!this._targetIsEditable) {
       this._onFail("Unexpected, caret position isn't supported with non-inputs.");
       return;
     }
-    let cp = this._contentWindow.document.caretPositionFromPoint(aX, aY);
+
+    // SelectionHelperUI sends text input tap coordinates and a caret move
+    // event at the start of a monocle drag. caretPositionFromPoint isn't
+    // going to give us correct info if the coord is outside the edit bounds,
+    // so restrict the coordinates before we call cpfp.
+    let containedCoords = this._restrictCoordinateToEditBounds(aX, aY);
+    let cp = this._contentWindow.document.caretPositionFromPoint(containedCoords.xPos,
+                                                                 containedCoords.yPos);
     let input = cp.offsetNode;
     let offset = cp.offset;
     input.selectionStart = input.selectionEnd = offset;
   },
 
   /*
    * Selection copy event handler
    *
@@ -598,16 +605,34 @@ var SelectionHandler = {
     if (this._cache.start.yPos > bounds.bottom)
       this._cache.start.yPos = bounds.bottom;
     if (this._cache.end.yPos > bounds.bottom)
       this._cache.end.yPos = bounds.bottom;
     if (this._cache.caret.yPos > bounds.bottom)
       this._cache.caret.yPos = bounds.bottom;
   },
 
+  _restrictCoordinateToEditBounds: function _restrictCoordinateToEditBounds(aX, aY) {
+    let result = {
+      xPos: aX,
+      yPos: aY
+    };
+    if (!this._targetIsEditable)
+      return result;
+    let bounds = this._getTargetBrowserRect();
+    if (aX <= bounds.left)
+      result.xPos = bounds.left + 1;
+    if (aX >= bounds.right)
+      result.xPos = bounds.right - 1;
+    if (aY <= bounds.top)
+      result.yPos = bounds.top + 1;
+    if (aY >= bounds.bottom)
+      result.yPos = bounds.bottom - 1;
+  },
+
   /*
    * _handleSelectionPoint(aMarker, aPoint, aEndOfSelection) 
    *
    * After a monocle moves to a new point in the document, determines
    * what the target is and acts on its selection accordingly. If the
    * monocle is within the bounds of the target, adds or subtracts selection
    * at the monocle coordinates appropriately and then merges selection ranges
    * into a single continuous selection. If the monocle is outside the bounds
--- a/browser/metro/base/content/helperui/FindHelperUI.js
+++ b/browser/metro/base/content/helperui/FindHelperUI.js
@@ -103,17 +103,19 @@ var FindHelperUI = {
       return;
 
     // Hide any menus
     ContextUI.dismiss();
 
     // Shutdown selection related ui
     SelectionHelperUI.closeEditSession();
 
+    // See bindings.xml
     this._container.show(this);
+
     this.search(this._textbox.value);
     this._textbox.select();
     this._textbox.focus();
     this._open = true;
     Elements.browsers.setAttribute("findbar", true);
     setTimeout(() => this._container.setAttribute("showing", true), 0);
 
     // Prevent the view to scroll automatically while searching
--- a/browser/metro/base/content/helperui/FormHelperUI.js
+++ b/browser/metro/base/content/helperui/FormHelperUI.js
@@ -67,17 +67,17 @@ var FormHelperUI = {
       type: aElement.type,
       choices: aElement.choices,
       isAutocomplete: aElement.isAutocomplete,
       list: aElement.list,
       rect: aElement.rect
     };
 
     this._updateContainerForSelect(lastElement, this._currentElement);
-    this._updatePopupsFor(this._currentElement);
+    this._showAutoCompleteSuggestions(this._currentElement);
 
     // Prevent the view to scroll automatically while typing
     this._currentBrowser.scrollSync = false;
 
     this._open = true;
   },
 
   hide: function formHelperHide() {
@@ -157,66 +157,82 @@ var FormHelperUI = {
     }
   },
 
   doAutoComplete: function formHelperDoAutoComplete(aData) {
     this._currentBrowser.messageManager.sendAsyncMessage("FormAssist:AutoComplete",
       { value: aData });
   },
 
-  _updatePopupsFor: function _formHelperUpdatePopupsFor(aElement) {
-    if (!this._updateSuggestionsFor(aElement)) {
-      AutofillMenuUI.hide();
+  /*
+   * Retrieves autocomplete suggestions asynchronously for an element from the
+   * form autocomplete service and updates and displays the autocompletepopup.
+   *
+   * @param aElement form input element
+   */
+  _showAutoCompleteSuggestions: function (aElement) {
+    if (!aElement.isAutocomplete) {
+      return;
     }
-  },
 
-  /*
-   * Populates the autofill menu for this element.
-   */
-  _updateSuggestionsFor: function _formHelperUpdateSuggestionsFor(aElement) {
-    let suggestions = this._getAutocompleteSuggestions(aElement);
-    if (!suggestions.length)
-      return false;
-    AutofillMenuUI.show(this._currentElementRect, suggestions);
-    return true;
+    let resultsAvailable = autoCompleteSuggestions => {
+      // Return false if there are no suggestions to show
+      if (!autoCompleteSuggestions.length) {
+        return;
+      }
+      AutofillMenuUI.show(this._currentElementRect, autoCompleteSuggestions);
+    };
+
+    this._getAutoCompleteSuggestions(aElement.value, aElement, resultsAvailable);
   },
 
   /*
-   * Retrieve the autocomplete list from the autocomplete service for an element
+   * Retrieves autocomplete suggestions for an element from the form
+   * autocomplete service. 
+   *
+   * @param aSearchString text entered into form
+   * @param aElement form input element
+   * @param aCallback(array_of_suggestions) called when results are available.
    */
-  _getAutocompleteSuggestions: function _formHelperGetAutocompleteSuggestions(aElement) {
-    if (!aElement.isAutocomplete) {
-      return [];
-    }
+  _getAutoCompleteSuggestions: function (aSearchString, aElement, aCallback) {
+    // Cache the form autocomplete service for future use
+    if (!this._formAutoCompleteService)
+      this._formAutoCompleteService = Cc["@mozilla.org/satchel/form-autocomplete;1"].
+                                      getService(Ci.nsIFormAutoComplete);
 
-    let suggestions = [];
-
-    let autocompleteService = Cc["@mozilla.org/satchel/form-autocomplete;1"].getService(Ci.nsIFormAutoComplete);
-    let results = autocompleteService.autoCompleteSearch(aElement.name || aElement.id, aElement.value, aElement, null);
-    if (results.matchCount > 0) {
-      for (let i = 0; i < results.matchCount; i++) {
-        let value = results.getValueAt(i);
+    // results callback
+    let resultsAvailable = function (results) {
+      let suggestions = [];
+      for (let idx = 0; idx < results.matchCount; idx++) {
+        let value = results.getValueAt(idx);
 
         // Do not show the value if it is the current one in the input field
-        if (value == aElement.value)
+        if (value == aSearchString)
           continue;
 
-        suggestions.push({ "label": value, "value": value});
+        // Supply a label and value, since they can differ for datalist suggestions
+        suggestions.push({ label: value, value: value });
       }
-    }
 
-    // Add the datalist elements provided by the website, note that the
-    // displayed value can differ from the real value of the element.
-    let options = aElement.list;
-    for (let i = 0; i < options.length; i++)
-      suggestions.push(options[i]);
+      // Add the datalist elements provided by the website, note that the
+      // displayed value can differ from the real value of the element.
+      let options = aElement.list;
+      for (let idx = 0; idx < options.length; idx++) {
+        suggestions.push(options[idx]);
+      }
 
-    return suggestions;
+      aCallback(suggestions);
+    };
+
+    // Send the query
+    this._formAutoCompleteService.autoCompleteSearchAsync(aElement.name || aElement.id,
+                                                          aSearchString, aElement, null,
+                                                          resultsAvailable);
   },
-
+  
   /*
    * Setup for displaying the selection choices menu
    */
   _updateContainerForSelect: function _formHelperUpdateContainerForSelect(aLastElement, aCurrentElement) {
     let lastHasChoices = aLastElement && (aLastElement.choices != null);
     let currentHasChoices = aCurrentElement && (aCurrentElement.choices != null);
 
     if (currentHasChoices)
--- a/browser/metro/base/content/history.js
+++ b/browser/metro/base/content/history.js
@@ -2,17 +2,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 'use strict';
 
 function HistoryView(aSet, aLimit, aFilterUnpinned) {
   this._set = aSet;
   this._set.controller = this;
-  this._inBatch = false;
+  this._inBatch = 0;
 
   this._limit = aLimit;
   this._filterUnpinned = aFilterUnpinned;
   this._historyService = PlacesUtils.history;
   this._navHistoryService = gHistSvc;
 
   this._pinHelper = new ItemPinHelper("metro.history.unpinned");
   this._historyService.addObserver(this, false);
@@ -25,16 +25,17 @@ HistoryView.prototype = {
   _toRemove: null,
 
   handleItemClick: function tabview_handleItemClick(aItem) {
     let url = aItem.getAttribute("value");
     BrowserUI.goToURI(url);
   },
 
   populateGrid: function populateGrid(aRefresh) {
+    this._inBatch++; // always batch up grid updates to avoid redundant arrangeItems calls
     let query = this._navHistoryService.getNewQuery();
     let options = this._navHistoryService.getNewQueryOptions();
     options.excludeQueries = true;
     options.queryType = options.QUERY_TYPE_HISTORY;
     options.resultType = options.RESULTS_AS_URI;
     options.sortingMode = options.SORT_BY_DATE_DESCENDING;
 
     let limit = this._limit || Infinity;
@@ -78,16 +79,19 @@ HistoryView.prototype = {
     // Remove extra items in case a refresh added more than the limit.
     // This can happen when undoing a delete.
     if (aRefresh) {
       while (this._set.itemCount > limit)
         this._set.removeItemAt(this._set.itemCount - 1);
     }
 
     rootNode.containerOpen = false;
+    this._set.arrangeItems();
+    if (this._inBatch > 0)
+      this._inBatch--;
   },
 
   destruct: function destruct() {
     this._historyService.removeObserver(this);
     window.removeEventListener('MozAppbarDismissing', this, false);
     window.removeEventListener('HistoryNeedsRefresh', this, false);
   },
 
@@ -108,17 +112,19 @@ HistoryView.prototype = {
     let event = document.createEvent("Events");
     event.initEvent("HistoryNeedsRefresh", true, false);
     window.dispatchEvent(event);
   },
 
   removeHistory: function (aUri) {
     let items = this._set.getItemsByUrl(aUri);
     for (let item of items)
-      this._set.removeItem(item, this._inBatch);
+      this._set.removeItem(item, true);
+    if (!this._inBatch)
+      this._set.arrangeItems();
   },
 
   doActionOnSelectedTiles: function bv_doActionOnSelectedTiles(aActionName, aEvent) {
     let tileGroup = this._set;
     let selectedTiles = tileGroup.selectedItems;
 
     switch (aActionName){
       case "delete":
@@ -202,22 +208,25 @@ HistoryView.prototype = {
         break;
     }
   },
 
   // nsINavHistoryObserver & helpers
 
   onBeginUpdateBatch: function() {
     // Avoid heavy grid redraws while a batch is in process
-    this._inBatch = true;
+    this._inBatch++;
   },
 
   onEndUpdateBatch: function() {
-    this._inBatch = false;
     this.populateGrid(true);
+    if (this._inBatch > 0) {
+      this._inBatch--;
+      this._set.arrangeItems();
+    }
   },
 
   onVisit: function(aURI, aVisitID, aTime, aSessionID,
                     aReferringID, aTransitionType) {
     if (!this._inBatch) {
       this.populateGrid(true);
     }
   },
--- a/browser/metro/base/content/pages/aboutRights.xhtml
+++ b/browser/metro/base/content/pages/aboutRights.xhtml
@@ -28,17 +28,17 @@
   <li>&rights.intro-point1a;<a href="http://www.mozilla.org/MPL/">&rights.intro-point1b;</a>&rights.intro-point1c;</li>
   <!--
     Point 2 discusses Mozilla trademarks, and isn't needed when the build is unbranded.
     Point 3 discusses privacy policy, unbranded builds get a placeholder (for the vendor to replace)
     Point 4 discusses web service terms, unbranded builds gets a placeholder (for the vendor to replace)
   -->
   <li>&rights.intro-point2-a;<a href="http://www.mozilla.org/foundation/trademarks/policy.html">&rights.intro-point2-b;</a>&rights.intro-point2-c;</li>
   <li>&rights.intro-point2.5;</li>
-  <li>&rights2.intro-point3a;<a href="http://www.mozilla.com/legal/privacy/">&rights2.intro-point3b;</a>&rights.intro-point3c;</li>
+  <li>&rights2.intro-point3a;<a href="https://www.mozilla.org/legal/privacy/">&rights2.intro-point3b;</a>&rights.intro-point3c;</li>
   <li>&rights2.intro-point4a;<a href="about:rights#webservices" onclick="showServices();">&rights.intro-point4b;</a>&rights.intro-point4c;</li>
 </ul>
 
 <div id="webservices-container">
   <a name="webservices"/>
   <h3>&rights2.webservices-header;</h3>
 
   <p>&rights2.webservices-a;<a href="about:rights#disabling-webservices" onclick="showDisablingServices();">&rights2.webservices-b;</a>&rights3.webservices-c;</p>
--- a/browser/metro/base/tests/mochitest/Makefile.in
+++ b/browser/metro/base/tests/mochitest/Makefile.in
@@ -25,16 +25,18 @@ BROWSER_TESTS = \
   browser_onscreen_keyboard.html \
   browser_prefs_ui.js \
   browser_remotetabs.js \
   browser_tabs.js \
   browser_test.js \
   browser_tiles.js \
   browser_tilegrid.xul \
   browser_topsites.js \
+  browser_form_auto_complete.js \
+  browser_form_auto_complete.html \
   $(NULL)
 
 # disabled due to timeouts and lack of plugin support.
 #  browser_plugin_input.html \
 #  browser_plugin_input_mouse.js \
 #  browser_plugin_input_keyboard.js \
 
 ifndef MOZ_DEBUG
--- a/browser/metro/base/tests/mochitest/browser_context_ui.js
+++ b/browser/metro/base/tests/mochitest/browser_context_ui.js
@@ -11,59 +11,59 @@ function test() {
 
 gTests.push({
   desc: "Context UI on about:start",
   run: function testAboutStart() {
     yield addTab("about:start");
     is(StartUI.isVisible, true, "Start UI is displayed on about:start");
     is(ContextUI.isVisible, true, "Toolbar is displayed on about:start");
     is(ContextUI.isExpanded, false, "Tab bar is not displayed initially");
-    is(Elements.appbar.isShowing, false, "Appbar is not displayed initially");
+    is(Elements.navbar.isShowing, false, "Appbar is not displayed initially");
 
     // toggle on
     doEdgeUIGesture();
     is(ContextUI.isVisible, true, "Toolbar is still visible after one swipe");
     is(ContextUI.isExpanded, true, "Tab bar is visible after one swipe");
-    is(Elements.appbar.isShowing, true, "Appbar is visible after one swipe");
+    is(Elements.navbar.isShowing, true, "Appbar is visible after one swipe");
 
     // toggle off
     doEdgeUIGesture();
     is(ContextUI.isVisible, true, "Toolbar is still visible after second swipe");
     is(ContextUI.isExpanded, false, "Tab bar is hidden after second swipe");
-    is(Elements.appbar.isShowing, false, "Appbar is hidden after second swipe");
+    is(Elements.navbar.isShowing, false, "Appbar is hidden after second swipe");
 
     // sanity check - toggle on again
     doEdgeUIGesture();
     is(ContextUI.isVisible, true, "Toolbar is still visible after third swipe");
     is(ContextUI.isExpanded, true, "Tab bar is visible after third swipe");
-    is(Elements.appbar.isShowing, true, "Appbar is visible after third swipe");
+    is(Elements.navbar.isShowing, true, "Appbar is visible after third swipe");
 
     is(StartUI.isVisible, true, "Start UI is still visible");
   }
 });
 
 gTests.push({
   desc: "Context UI on a web page (about:)",
   run: function testAbout() {
     yield addTab("about:");
     ContextUI.dismiss();
     is(StartUI.isVisible, false, "Start UI is not visible on about:");
     is(ContextUI.isVisible, false, "Toolbar is not initially visible on about:");
     is(ContextUI.isExpanded, false, "Tab bar is not initially visible on about:");
-    is(Elements.appbar.isShowing, false, "Appbar is not initially visible on about on about::");
+    is(Elements.navbar.isShowing, false, "Appbar is not initially visible on about on about::");
 
     doEdgeUIGesture();
     is(ContextUI.isVisible, true, "Toolbar is visible after one swipe");
     is(ContextUI.isExpanded, true, "Tab bar is visble after one swipe");
-    is(Elements.appbar.isShowing, true, "Appbar is visible after one swipe");
+    is(Elements.navbar.isShowing, true, "Appbar is visible after one swipe");
 
     doEdgeUIGesture();
     is(ContextUI.isVisible, false, "Toolbar is not visible after second swipe");
     is(ContextUI.isExpanded, false, "Tab bar is not visible after second swipe");
-    is(Elements.appbar.isShowing, false, "Appbar is hidden after second swipe");
+    is(Elements.navbar.isShowing, false, "Appbar is hidden after second swipe");
 
     is(StartUI.isVisible, false, "Start UI is still not visible");
   }
 });
 
 gTests.push({
   desc: "Control-L keyboard shortcut",
   run: function testAbout() {
new file mode 100644
--- /dev/null
+++ b/browser/metro/base/tests/mochitest/browser_form_auto_complete.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+</style>
+</head>
+<body style="margin: 20px 20px 20px 20px;">
+<form id="form1" method="get" action="" autocomplete="on">
+<datalist id="testdatalist">
+   <option value="one">
+   <option value="two">
+   <option value="three">
+   <option value="four">
+   <option value="five">
+</datalist> 
+<input autocomplete="on" list="testdatalist" id="textedit1" style="width:200px;" type="text" />
+</form>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/browser/metro/base/tests/mochitest/browser_form_auto_complete.js
@@ -0,0 +1,88 @@
+// -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+function clearFormHistory() {
+  var formHistory = Cc["@mozilla.org/satchel/form-history;1"].getService(Ci.nsIFormHistory2);
+  formHistory.removeAllEntries();
+}
+
+function test() {
+  clearFormHistory();
+  runTests();
+  clearFormHistory();
+}
+
+function setUp() {
+  PanelUI.hide();
+  yield hideContextUI();
+}
+
+function tearDown() {
+  PanelUI.hide();
+}
+
+function checkAutofillMenuItemContents(aItemList)
+{
+  let errors = 0;
+  let found = 0;
+  for (let idx = 0; idx < AutofillMenuUI._commands.childNodes.length; idx++) {
+    let item = AutofillMenuUI._commands.childNodes[idx];
+    let label = item.firstChild.getAttribute("value");
+    let value = item.getAttribute("data");
+    if (aItemList.indexOf(value) == -1) {
+      errors++;
+      info("unexpected entry:" + value);
+    } else {
+      found++;
+    }
+  }
+  is(errors, 0, "autofill menu item list error check");
+  is(found, aItemList.length, "autofill item list length mismatch, some items were not found.");
+}
+
+gTests.push({
+  desc: "simple auto complete test to insure auto complete code doesn't break.",
+  setUp: setUp,
+  tearDown: tearDown,
+  run: function () {
+    let loadedPromise, shownPromise;
+
+    yield addTab(chromeRoot + "browser_form_auto_complete.html");
+    yield waitForCondition(function () {
+      return !Browser.selectedTab.isLoading();
+    });
+
+    let tabDocument = Browser.selectedTab.browser.contentWindow.document;
+    let form = tabDocument.getElementById("form1");
+    let input = tabDocument.getElementById("textedit1");
+
+    input.value = "hellothere";
+    form.action = chromeRoot + "browser_form_auto_complete.html";
+
+    loadedPromise = waitForEvent(Browser.selectedTab.browser, "DOMContentLoaded");
+    form.submit();
+    yield loadedPromise;
+
+    // XXX Solves a problem with events not getting delivered to Content.js
+    // immediately after submitting the form.
+    yield waitForMs(500);
+
+    tabDocument = Browser.selectedTab.browser.contentWindow.document;
+    input = tabDocument.getElementById("textedit1");
+    ok(input, "input isn't null");
+    input.focus();
+
+    // Desktop and metrofx display auto-completes in response to double mouse clicks. The
+    // first click is ignored.
+    shownPromise = waitForEvent(document, "popupshown");
+    EventUtils.synthesizeMouseAtCenter(input, {}, Browser.selectedTab.browser.contentWindow);
+    EventUtils.synthesizeMouseAtCenter(input, {}, Browser.selectedTab.browser.contentWindow);
+    yield shownPromise;
+
+    checkAutofillMenuItemContents(["hellothere", "one", "two", "three", "four", "five"]);
+  }
+});
\ No newline at end of file
deleted file mode 100644
--- a/browser/metro/components/FormAutoComplete.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-function LOG() {
-  return; // comment out for verbose debugging
-  let msg = Array.join(arguments, " ");
-  dump(msg + "\n");
-  Cu.reportError(msg);
-}
-
-// Lazily get the base Form AutoComplete Search
-XPCOMUtils.defineLazyGetter(this, "FAC", function() {
-  return Components.classesByID["{c11c21b2-71c9-4f87-a0f8-5e13f50495fd}"]
-                   .getService(Ci.nsIFormAutoComplete);
-});
-
-function FormAutoComplete() {
-  LOG("new FAC");
-}
-
-FormAutoComplete.prototype = {
-  classDescription: "Form AutoComplete Plus",
-  classID: Components.ID("{cccd414c-3ec2-4cc5-9dc4-36c87cc3c4fe}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIFormAutoComplete]),
-
-  // Specify the html5 types that we want and some values to guess
-  contactTypes: {
-    email: /^(?:.*(?:e-?mail|recipients?).*|(send_)?to(_b?cc)?)$/i,
-    tel: /^(?:tel(?:ephone)?|.*phone.*)$/i
-  },
-
-  checkQueryType: function checkQueryType(aName, aField) {
-    // If we have an input field with the desired html5 type, take it!
-    if (aField && "type" in aField) {
-      let type = aField.type;
-      if (type && type in this.contactTypes)
-        return type;
-    }
-
-    // Grab properties to check for contact inputs
-    let props = [aName];
-    if (aField) {
-      let specialProps = [aField["className"], aField["id"]];
-      props = props.concat(specialProps.filter(function(aValue) {
-        return aValue;
-      }));
-    }
-
-    // Check the gathered properties for contact-like values
-    for (let [type, regex] in Iterator(this.contactTypes)) {
-      if (props.some(function(prop) prop.search(regex) != -1))
-        return type;
-    }
-    return null;
-  },
-
-  autoCompleteSearch: function autoCompleteSearch(aName, aQuery, aField, aPrev) {
-    if (!Services.prefs.getBoolPref("browser.formfill.enable"))
-      return null;
-
-    LOG("autocomplete search", Array.slice(arguments));
-    let result = Cc["@mozilla.org/autocomplete/simple-result;1"].createInstance(Ci.nsIAutoCompleteSimpleResult);
-    result.setSearchString(aQuery);
-
-    // Don't allow duplicates get merged into the final results
-    let dupCheck = {};
-
-    // Use the base form autocomplete for non-contact searches
-    let normal = FAC.autoCompleteSearch(aName, aQuery, aField, aPrev);
-    if (normal.matchCount > 0) {
-      for (let i = 0; i < normal.matchCount; i++) {
-        dupCheck[normal.getValueAt(i)] = true;
-        result.appendMatch(normal.getValueAt(i), normal.getCommentAt(i), normal.getImageAt(i), normal.getStyleAt(i));
-      }
-    }
-
-    // Do searches for certain input fields
-    let type = this.checkQueryType(aName, aField);
-
-    let resultCode = result.matchCount ? "RESULT_SUCCESS" : "RESULT_NOMATCH";
-    result.setSearchResult(Ci.nsIAutoCompleteResult[resultCode]);
-    return result;
-  }
-};
-
-let components = [FormAutoComplete];
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
--- a/browser/metro/components/Makefile.in
+++ b/browser/metro/components/Makefile.in
@@ -23,17 +23,16 @@ EXTRA_PP_COMPONENTS = \
         $(NULL)
 
 EXTRA_COMPONENTS = \
         AlertsService.js \
         ContentPermissionPrompt.js \
         DownloadManagerUI.js \
         PromptService.js \
         ContentDispatchChooser.js \
-        FormAutoComplete.js \
         LoginManagerPrompter.js \
         $(NULL)
 
 ifdef MOZ_SAFE_BROWSING
 EXTRA_COMPONENTS += SafeBrowsing.js
 endif
 
 include $(topsrcdir)/config/rules.mk
--- a/browser/metro/components/components.manifest
+++ b/browser/metro/components/components.manifest
@@ -64,20 +64,16 @@ category wakeup-request PromptService @m
 component {be623d20-d305-11de-8a39-0800200c9a66} BrowserCLH.js
 contract @mozilla.org/browser/browser-clh;1 {be623d20-d305-11de-8a39-0800200c9a66}
 category command-line-handler x-browser @mozilla.org/browser/browser-clh;1
 
 # ContentDispatchChooser.js
 component {5a072a22-1e66-4100-afc1-07aed8b62fc5} ContentDispatchChooser.js
 contract @mozilla.org/content-dispatch-chooser;1 {5a072a22-1e66-4100-afc1-07aed8b62fc5}
 
-# FormAutoComplete.js
-component {cccd414c-3ec2-4cc5-9dc4-36c87cc3c4fe} FormAutoComplete.js
-contract @mozilla.org/satchel/form-autocomplete;1 {cccd414c-3ec2-4cc5-9dc4-36c87cc3c4fe}
-
 # LoginManagerPrompter.js
 component {97d12931-abe2-11df-94e2-0800200c9a66} LoginManagerPrompter.js
 contract @mozilla.org/login-manager/prompter;1 {97d12931-abe2-11df-94e2-0800200c9a66}
 
 #ifdef MOZ_SAFE_BROWSING
 # SafeBrowsing.js
 component {aadaed90-6c03-42d0-924a-fc61198ff283} SafeBrowsing.js
 contract @mozilla.org/safebrowsing/application;1 {aadaed90-6c03-42d0-924a-fc61198ff283}
--- a/browser/metro/locales/en-US/chrome/preferences.dtd
+++ b/browser/metro/locales/en-US/chrome/preferences.dtd
@@ -31,8 +31,10 @@
 <!ENTITY clearPrivateData.logins                                 "Active logins">
 
 <!ENTITY optionsHeader.privacy.passwords.label                   "Remember Passwords">
 <!ENTITY doNotTrack.title                                        "Do Not Track">
 <!ENTITY doNotTrack.desc                                         "Tell sites:">
 <!ENTITY doNotTrack.options.trackingNotOkay                      "I do not want to be tracked">
 <!ENTITY doNotTrack.options.noPreference                         "Nothing about my tracking preferences">
 <!ENTITY doNotTrack.options.trackingOkay                         "I want to be tracked">
+<!ENTITY optionsHeader.reporting.title                           "Crash Reporter">
+<!ENTITY optionsHeader.reporting.crashes.label                   "&brandShortName; submits crash reports to help Mozilla make your browser more stable and secure">
--- a/browser/metro/profile/metro.js
+++ b/browser/metro/profile/metro.js
@@ -183,17 +183,17 @@ pref("xpinstall.enabled", false);
 pref("xpinstall.whitelist.add", "addons.mozilla.org");
 pref("extensions.autoupdate.enabled", false);
 pref("extensions.update.enabled", false);
 
 /* blocklist preferences */
 pref("extensions.blocklist.enabled", true);
 pref("extensions.blocklist.interval", 86400);
 pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/3/%APP_ID%/%APP_VERSION%/%PRODUCT%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/%PING_COUNT%/%TOTAL_PING_COUNT%/%DAYS_SINCE_LAST_PING%/");
-pref("extensions.blocklist.detailsURL", "https://www.mozilla.com/%LOCALE%/blocklist/");
+pref("extensions.blocklist.detailsURL", "https://www.mozilla.org/%LOCALE%/blocklist/");
 
 /* block popups by default, and notify the user about blocked popups */
 pref("dom.disable_open_during_load", true);
 pref("privacy.popups.showBrowserMessage", true);
 
 /* disable opening windows with the dialog feature */
 pref("dom.disable_window_open_dialog_feature", true);
 
@@ -377,18 +377,18 @@ pref("dom.ipc.plugins.enabled", true);
 // higher values give content process less CPU time
 pref("dom.ipc.content.nice", 1);
 
 // product URLs
 // The breakpad report server to link to in about:crashes
 pref("breakpad.reportURL", "https://crash-stats.mozilla.com/report/index/");
 // TODO: This is not the correct article for metro!!!
 pref("app.sync.tutorialURL", "https://support.mozilla.org/kb/sync-firefox-between-desktop-and-mobile");
-pref("app.support.baseURL", "http://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/");
-pref("app.privacyURL", "http://www.mozilla.com/legal/privacy/");
+pref("app.support.baseURL", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/");
+pref("app.privacyURL", "https://www.mozilla.org/legal/privacy/");
 pref("app.creditsURL", "http://www.mozilla.org/credits/");
 pref("app.channelURL", "http://www.mozilla.org/%LOCALE%/firefox/channel/");
 
 // Name of alternate about: page for certificate errors (when undefined, defaults to about:neterror)
 pref("security.alternate_certificate_error_page", "certerror");
 
 pref("security.warn_viewing_mixed", false); // Warning is disabled.  See Bug 616712.
 
--- a/browser/metro/theme/browser.css
+++ b/browser/metro/theme/browser.css
@@ -326,17 +326,18 @@ documenttab[selected] .documenttab-selec
 /* App Bar ----------------------------------------------------------------- */
 
 appbar {
   display: block;
   position: fixed;
   bottom: 0;
   width: 100%;
   transform: translateY(100%);
-  transition: transform @metro_animation_duration@ @metro_animation_easing@;
+  transition: transform @metro_animation_duration@ @metro_animation_easing@,
+              bottom @metro_animation_duration@ @metro_animation_easing@;
   font-size: 0;
 }
 
 appbar > toolbar {
   -moz-appearance: none;
   -moz-box-align: center;
   border: 0;
   width: 100%;
@@ -351,17 +352,17 @@ appbar > toolbar > toolbarbutton {
   /* Don't inherit background-color from toolbarbutton[checked="true"] */
   background-color: transparent;
 }
 
 appbar > toolbar > toolbarbutton[disabled] {
   visibility: collapse;
 }
 
-#appbar[startpage],
+#navbar[startpage],
 appbar[visible] {
   transform: none;
 }
 
 appbar > toolbar > toolbarbutton {
   list-style-image: url(chrome://browser/skin/images/appbar-icons.png);
   -moz-image-region: rect(0px, 200px, 40px, 160px); /* Gear icon is default. */
 }
@@ -556,16 +557,22 @@ flyoutpanel > settings:first-child {
 #about-version-label {
  margin-top: 11pt;
 }
 
 #about-policy-label {
  margin-top: 24pt;
 }
 
+#currentChannel {
+  margin: 0;
+  padding: 0;
+  font-weight: bold;
+}
+
 /* Preferences flyout */
 
 #prefs-flyoutpanel {
   width: 400px;
 }
 
 /* Lay out each <setting> in a single row */
 setting {
@@ -884,32 +891,37 @@ setting[type="radio"] > vbox {
 }
 
 #overlay-plus:-moz-locale-dir(ltr),
 #overlay-back:-moz-locale-dir(rtl) {
   right: -70px;
   background-position: left 6px center;
 }
 
+#stack[keyboardVisible] > .overlay-button,
 #stack[fullscreen] > .overlay-button,
 #appbar[visible] ~ .overlay-button,
 .overlay-button[disabled] {
   box-shadow: none;
   visibility: collapse;
 }
 
+#stack[keyboardVisible] > #overlay-back:-moz-locale-dir(ltr),
+#stack[keyboardVisible] > #overlay-plus:-moz-locale-dir(rtl),
 #stack[fullscreen] > #overlay-back:-moz-locale-dir(ltr),
 #stack[fullscreen] > #overlay-plus:-moz-locale-dir(rtl),
 #appbar[visible] ~ #overlay-back:-moz-locale-dir(ltr),
 #appbar[visible] ~ #overlay-plus:-moz-locale-dir(rtl),
 #overlay-back[disabled]:-moz-locale-dir(ltr),
 #overlay-plus[disabled]:-moz-locale-dir(rtl) {
   transform: translateX(-60px);
 }
 
+#stack[keyboardVisible] > #overlay-plus:-moz-locale-dir(ltr),
+#stack[keyboardVisible] > #overlay-back:-moz-locale-dir(rtl),
 #stack[fullscreen] > #overlay-plus:-moz-locale-dir(ltr),
 #stack[fullscreen] > #overlay-back:-moz-locale-dir(rtl),
 #appbar[visible] ~ #overlay-plus:-moz-locale-dir(ltr),
 #appbar[visible] ~ #overlay-back:-moz-locale-dir(rtl),
 #overlay-plus[disabled]:-moz-locale-dir(ltr),
 #overlay-back[disabled]:-moz-locale-dir(rtl) {
   transform: translateX(60px);
 }
--- a/browser/metro/theme/forms.css
+++ b/browser/metro/theme/forms.css
@@ -1,48 +1,44 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 %filter substitution
 %include defines.inc
 
-/* Content Navigator popup ------------------------------------------------- */
+/* Find bar ------------------------------------------------------------- */
+
 #content-navigator {
-  display: none;
+  display: block;
+  position: fixed;
   pointer-events: none;
   padding: 0;
+  bottom: 0;
+  transform: translateY(100%);
+  transition: transform @metro_animation_duration@ @metro_animation_easing@,
+              bottom @metro_animation_duration@ @metro_animation_easing@;
   background-color: @metro_orange@;
-  bottom: 0;
-  position: fixed;
-  transition: margin-bottom @metro_animation_duration@ @metro_animation_easing@;
-  margin-bottom: -@findbar_height@;
 }
 
-#content-navigator[showing] {
-  margin-bottom: 0;
-}
-
-#content-navigator[type="find"],
-#content-navigator[type="form"]:not([disabled]) {
-  display: -moz-box;
-}
+#content-navigator[type] {
+  transform: none;
+ }
 
 #content-navigator > .previous-button,
 #content-navigator > .next-button,
 #content-navigator > .close-button {
   min-width: @touch_button_small@ !important; /* button size */
   min-height: @touch_button_small@ !important; /* button size */
   border: none !important;
   background-image: none !important;
   background-color: inherit !important;
   pointer-events: auto;
   -moz-user-focus: ignore !important;
   margin: 0 @margin_normal@ !important;
-
 }
 
 #content-navigator > .close-button {
   -moz-margin-start: 0;
   list-style-image: url(chrome://browser/skin/images/appbar-icons.png);
   -moz-image-region: rect(0px, 480px, 40px, 440px);
 }
 
@@ -97,33 +93,28 @@
   border-bottom-left-radius: 0;
 }
 
 #content-navigator:-moz-locale-dir(rtl) > .next-button {
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
 }
 
-/* Find Helper ------------------------------------------------------------- */
 #content-navigator[type="find"] > .previous-button {
   /* previous button overlap the textbox */
   -moz-margin-start: -@margin_normal@;
 }
 
 #content-navigator:not([type="find"]) > #find-helper-textbox {
   display: none;
 }
 
 #find-helper-textbox {
   pointer-events: auto;
-  margin: @margin_normal@;
   -moz-margin-end: 0;
-  padding: @padding_xnormal@;
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
   border: none !important;
   width: 20em;
 }
 
 .textbox-search-icon {
   list-style-image: url("chrome://browser/skin/images/search-glass-30.png");
   -moz-image-region: auto;
 }
@@ -141,83 +132,16 @@
 #find-helper-textbox[status="1"] { /* Ci.nsITypeAheadFind.FIND_NOTFOUND */
   background: rgb(255,200,200);
 }
 
 #find-helper-textbox:hover:active {
   background: #8db8d8;
 }
 
-/* Form Helper Autofill ---------------------------------------------------- */
-#form-helper-suggestions-container .panel-arrowcontent {
-  border-radius: @border_radius_normal@;
-  padding: 0; /* half core spacing & none (autorepeat arrows compensate) */
-  background-color: white;
-}
-
-#form-helper-suggestions {
-  background-color: white;
-  margin: 0;
-  color: black;
-  max-width: 0;
-}
-
-#form-helper-suggestions > .autorepeatbutton-down,
-#form-helper-suggestions > .autorepeatbutton-up {
-  border: none;
-}
-
-#form-helper-suggestions > .autorepeatbutton-down {
-  list-style-image: url("chrome://browser/skin/images/arrowright-16.png");
-}
-
-#form-helper-suggestions > .autorepeatbutton-down:-moz-locale-dir(rtl) {
-  list-style-image: url("chrome://browser/skin/images/arrowleft-16.png");
-}
-
-#form-helper-suggestions > .autorepeatbutton-up {
-  list-style-image: url("chrome://browser/skin/images/arrowleft-16.png");
-}
-
-#form-helper-suggestions > .autorepeatbutton-up:-moz-locale-dir(rtl) {
-  list-style-image: url("chrome://browser/skin/images/arrowright-16.png");
-}
-
-/* force the autorepeat buttons to create a 'padding' when collapsed */
-#form-helper-suggestions > autorepeatbutton[collapsed="true"],
-#form-helper-suggestions > autorepeatbutton[disabled] {
-  visibility: hidden;
-}
-
-#form-helper-suggestions .form-helper-suggestions-label {
-  padding: @padding_xxnormal@ @padding_normal@; /* 12px helps get row size for the labels */
-  margin: 0;
-  border-color: transparent rgb(215,215,215) transparent rgb(255,255,255);
-  border-style: solid;
-  border-width: @border_width_tiny@;
-  background-color: white;
-}
-
-#form-helper-suggestions .form-helper-suggestions-label:first-child {
-  -moz-padding-start: initial; /* the arrowscrollbox creates enough left padding */
-  -moz-border-start: none;
-}
-
-#form-helper-suggestions .form-helper-suggestions-label:last-child {
-  -moz-border-end: none;
-}
-
-#form-helper-suggestions .form-helper-suggestions-label:hover {
-  background-color: #dedad0;
-}
-
-#form-helper-suggestions .form-helper-suggestions-label:hover:active {
-  background-color: @selected_color@ !important;
-}
-
 /* Select popup ------------------------------------------------------------- */
 
 #select-container {
   padding: 0;
   position: absolute;
   background-color: transparent;
 }
 
--- a/browser/modules/webrtcUI.jsm
+++ b/browser/modules/webrtcUI.jsm
@@ -52,32 +52,34 @@ this.webrtcUI = {
         });
       }
     }
     return activeStreams;
   }
 }
 
 function getBrowserForWindowId(aWindowID) {
-  let contentWindow = Services.wm.getOuterWindowWithId(aWindowID);
-  return contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-                      .getInterface(Ci.nsIWebNavigation)
-                      .QueryInterface(Ci.nsIDocShell)
-                      .chromeEventHandler;
+  return getBrowserForWindow(Services.wm.getOuterWindowWithId(aWindowID));
+}
+
+function getBrowserForWindow(aContentWindow) {
+  return aContentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                       .getInterface(Ci.nsIWebNavigation)
+                       .QueryInterface(Ci.nsIDocShell)
+                       .chromeEventHandler;
 }
 
 function handleRequest(aSubject, aTopic, aData) {
   let {windowID: windowID, callID: callID} = JSON.parse(aData);
 
-  let browser = getBrowserForWindowId(windowID);
   let params = aSubject.QueryInterface(Ci.nsIMediaStreamOptions);
 
-  browser.ownerDocument.defaultView.navigator.mozGetUserMediaDevices(
+  Services.wm.getMostRecentWindow(null).navigator.mozGetUserMediaDevices(
     function (devices) {
-      prompt(browser, callID, params.audio, params.video || params.picture, devices);
+      prompt(windowID, callID, params.audio, params.video || params.picture, devices);
     },
     function (error) {
       // bug 827146 -- In the future, the UI should catch NO_DEVICES_FOUND
       // and allow the user to plug in a device, instead of immediately failing.
       denyRequest(callID, error);
     }
   );
 }
@@ -86,17 +88,17 @@ function denyRequest(aCallID, aError) {
   let msg = null;
   if (aError) {
     msg = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
     msg.data = aError;
   }
   Services.obs.notifyObservers(msg, "getUserMedia:response:deny", aCallID);
 }
 
-function prompt(aBrowser, aCallID, aAudioRequested, aVideoRequested, aDevices) {
+function prompt(aWindowID, aCallID, aAudioRequested, aVideoRequested, aDevices) {
   let audioDevices = [];
   let videoDevices = [];
   for (let device of aDevices) {
     device = device.QueryInterface(Ci.nsIMediaDevice);
     switch (device.type) {
       case "audio":
         if (aAudioRequested)
           audioDevices.push(device);
@@ -115,18 +117,20 @@ function prompt(aBrowser, aCallID, aAudi
     requestType = "Microphone";
   else if (videoDevices.length)
     requestType = "Camera";
   else {
     denyRequest(aCallID, "NO_DEVICES_FOUND");
     return;
   }
 
-  let host = aBrowser.contentDocument.documentURIObject.asciiHost;
-  let chromeDoc = aBrowser.ownerDocument;
+  let contentWindow = Services.wm.getOuterWindowWithId(aWindowID);
+  let host = contentWindow.document.documentURIObject.asciiHost;
+  let browser = getBrowserForWindow(contentWindow);
+  let chromeDoc = browser.ownerDocument;
   let chromeWin = chromeDoc.defaultView;
   let stringBundle = chromeWin.gNavigatorBundle;
   let message = stringBundle.getFormattedString("getUserMedia.share" + requestType + ".message",
                                                 [ host ]);
 
   function listDevices(menupopup, devices) {
     while (menupopup.lastChild)
       menupopup.removeChild(menupopup.lastChild);
@@ -190,17 +194,17 @@ function prompt(aBrowser, aCallID, aAudi
     accessKey: stringBundle.getString("getUserMedia.denyRequest.accesskey"),
     callback: function () {
       denyRequest(aCallID);
     }
   }];
 
   let options = null;
 
-  chromeWin.PopupNotifications.show(aBrowser, "webRTC-shareDevices", message,
+  chromeWin.PopupNotifications.show(browser, "webRTC-shareDevices", message,
                                     "webRTC-shareDevices-notification-icon", mainAction,
                                     secondaryActions, options);
 }
 
 function updateIndicators() {
   webrtcUI.showGlobalIndicator =
     MediaManagerService.activeMediaCaptureWindows.Count() > 0;
 
@@ -226,20 +230,18 @@ function showBrowserSpecificIndicator(aB
     captureState = "Microphone";
   } else {
     Cu.reportError("showBrowserSpecificIndicator: got neither video nor audio access");
     return;
   }
 
   let chromeWin = aBrowser.ownerDocument.defaultView;
   let stringBundle = chromeWin.gNavigatorBundle;
-  let host = aBrowser.contentDocument.documentURIObject.asciiHost;
 
-  let message = stringBundle.getFormattedString("getUserMedia.sharing" + captureState + ".message",
-                                                [ host ]);
+  let message = stringBundle.getString("getUserMedia.sharing" + captureState + ".message2");
   let mainAction = null;
   let secondaryActions = null;
   let options = {
     dismissed: true
   };
   chromeWin.PopupNotifications.show(aBrowser, "webRTC-sharingDevices", message,
                                     "webRTC-sharingDevices-notification-icon", mainAction,
                                     secondaryActions, options);
--- a/browser/themes/linux/devtools/netmonitor.css
+++ b/browser/themes/linux/devtools/netmonitor.css
@@ -373,16 +373,20 @@ box.requests-menu-status[code^="5"] {
 .requests-menu-footer-label {
   min-width: 1em;
   margin: 0;
   border: none;
   padding: 2px 1.5vw;
   color: #fff;
 }
 
+.requests-menu-footer-spacer {
+  min-width: 2px;
+}
+
 .requests-menu-footer-spacer,
 .requests-menu-footer-button {
   -moz-border-end: 1px solid hsla(210,8%,5%,.25);
   box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
 }
 
 .requests-menu-footer-button {
   -moz-appearance: none;
--- a/browser/themes/osx/devtools/netmonitor.css
+++ b/browser/themes/osx/devtools/netmonitor.css
@@ -373,16 +373,20 @@ box.requests-menu-status[code^="5"] {
 .requests-menu-footer-label {
   min-width: 1em;
   margin: 0;
   border: none;
   padding: 2px 1.5vw;
   color: #fff;
 }
 
+.requests-menu-footer-spacer {
+  min-width: 2px;
+}
+
 .requests-menu-footer-spacer,
 .requests-menu-footer-button {
   -moz-border-end: 1px solid hsla(210,8%,5%,.25);
   box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
 }
 
 .requests-menu-footer-button {
   -moz-appearance: none;
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -210,17 +210,17 @@ browser.jar:
   skin/classic/browser/tabbrowser/tab-stroke-start.png                   (tabbrowser/tab-stroke-start.png)
   skin/classic/browser/tabbrowser/tab-stroke-start@2x.png                (tabbrowser/tab-stroke-start@2x.png)
   skin/classic/browser/tabbrowser/tabbar-bottom-bg-active.png            (tabbrowser/tabbar-bottom-bg-active.png)
   skin/classic/browser/tabbrowser/tabbar-bottom-bg-inactive.png          (tabbrowser/tabbar-bottom-bg-inactive.png)
   skin/classic/browser/tabbrowser/tabbar-top-bg-active.png               (tabbrowser/tabbar-top-bg-active.png)
   skin/classic/browser/tabbrowser/tabbar-top-bg-inactive.png             (tabbrowser/tabbar-top-bg-inactive.png)
   skin/classic/browser/tabbrowser/tab-overflow-border.png                (tabbrowser/tab-overflow-border.png)
   skin/classic/browser/tabbrowser/tabDragIndicator.png                   (tabbrowser/tabDragIndicator.png)
-  skin/classic/browser/tabbrowser/tabDragIndicator@2x.png                (tabbrowser/tabDragIndicator.png)
+  skin/classic/browser/tabbrowser/tabDragIndicator@2x.png                (tabbrowser/tabDragIndicator@2x.png)
   skin/classic/browser/tabbrowser/tab-separator.png                      (tabbrowser/tab-separator.png)
   skin/classic/browser/tabbrowser/tab-separator@2x.png                   (tabbrowser/tab-separator@2x.png)
   skin/classic/browser/tabview/close.png                    (tabview/close.png)
   skin/classic/browser/tabview/edit-light.png               (tabview/edit-light.png)
   skin/classic/browser/tabview/search.png                   (tabview/search.png)
   skin/classic/browser/tabview/stack-expander.png           (tabview/stack-expander.png)
   skin/classic/browser/tabview/tabview.png                  (tabview/tabview.png)
   skin/classic/browser/tabview/tabview.css                  (tabview/tabview.css)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b51b873cbd928ba222d9244eaf5c06562d699427
GIT binary patch
literal 1124
zc$@)b1e^PbP)<h;3K|Lk000e1NJLTq000;O002S=1^@s6O=1>l000ClNkl<Zc-rll
z+fQ6o7{yygLFr%_m_m`Nq!(jSLrhB2l%e<+7%N^Ld~b}2CMIn(R*gUhi*hSf(^t8f
zl-kBx`%+`P#RQVlN9_o&CI$p41%`nk+w}|G!#)h7!`SmMiC^*~oBgeCt;0EI&V;jV
zN3bLl+eJVWiJ&MIWg;YYvPTaM+DtzGWLzx5qDCAPhs0rEeRuCMG-xvgZDw95LSpa!
z1CKWh4Sn7oi^YDPpP!#xU0q#K#b;+{e`jxCaIhT>T4tEt7_!m4NbC}|pY`=c=jP`A
zF#l3$`uh9Zm|+$VH)P|HS5!S*T{ki^a>W|Nrj2?3Cu16ijHx-l#?xA}N6!{B%;I7H
z5;q_qLZa51FDH#T^@B0hpBhv3$>z{|^E+eWE9)V6;Dx6RAgNgF(>Xn3&0o5LNp`&W
z<=PB|2VQvMZI3>@Z~uX#^9u{ph~EBQgCB2=Q<|X`78a-R!V_--ibTzY3&ULqZYiQ#
zN3~l+mihr>u1)BICV(}2UJWzMQp3X+yYR%DfS@=yK0ZE5^SvLvgONdFZZDa%VvnAy
zWtN(lm>8AklXw$QDh}y(Bi}T5hdA1dMbFhTOW`HYI=l%e6Ni(@<O<C_x-%-zrQnog
ztodcHmRTyP!V_--Lj1C{w3PU-0ejD<2c%BX<mBWG&B%av=<AH9h@My5c=r^|%*@=j
zrzmxiZ`>HWMe|*KxGH+riS!#Yn|6`eqvzGWqghH`F?*3yw`q4z&oIqj|I~eb&O2By
zBaZe?0$8)>)iA>>C9jL_Z5j|^Jx7k~DLIFLkN>XTt-%Z>k2`xFdGxsbpt+BV`e?N6
z3q*;eG0$Jt;MweGy0kV!;UTYx`>23`C@&6{yz<r6tD`pLEge;5Z)Rh9C%;{P*fEO-
zUU;TGuGOp!m4{DUzy8e_1NNHmoC%-x!rm|H+0x8SX7NaSTst8}5;Ta{o10rMO-)Vx
zWevhTUTmRhX=%O846_-&aMD8R#cLH6m7Uh8yvK_zG-yS{nrHi^|CBh93h4G?OPZ5t
zv;ER{35%oFsI1$IEi`ED+*Si3Sp-DxNkFK}B_9JyJ6(JT*xBjeOF)N<4*?H#IOJtO
z$ww~v7!dr>B_9KJw7cYEKykZ+9{~@ZammMk2R?Ag$AF?XmwXH;Y;*7>AnM{n!2MAN
zUjk0M_z-a4X@~p_Xm#-+AkgZNmjMMWF8>E?60p6+!Iyw$mwOXXE{<doa0G2G0i~iY
z9*-w5s_Hamn~Y(%)|B2cEu%r3OF&ROp;t4%VRlVFF|O`fTT}GVpv@(qP*gqF)YP%K
zxS00Fh&_5}(B=|QAcFc2{+VZw9qSq!yBXuP8?a`N9vZZ{1VBJk%IIbBs(1rfvqujN
q+FS#mKxSp4QM>@G*>jFOBYy*S4<=5a#&uf&0000<MNUMnLSTX~1rcok
--- a/browser/themes/windows/devtools/netmonitor.css
+++ b/browser/themes/windows/devtools/netmonitor.css
@@ -373,16 +373,20 @@ box.requests-menu-status[code^="5"] {
 .requests-menu-footer-label {
   min-width: 1em;
   margin: 0;
   border: none;
   padding: 0px 1.5vw;
   color: #fff;
 }
 
+.requests-menu-footer-spacer {
+  min-width: 2px;
+}
+
 .requests-menu-footer-spacer,
 .requests-menu-footer-button {
   -moz-border-end: 1px solid hsla(210,8%,5%,.25);
   box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
 }
 
 .requests-menu-footer-button {
   -moz-appearance: none;
--- a/build/autoconf/frameptr.m4
+++ b/build/autoconf/frameptr.m4
@@ -10,16 +10,20 @@ AC_DEFUN([MOZ_SET_FRAMEPTR_FLAGS], [
   case "$target" in
   *android*)
     unwind_tables="-funwind-tables"
     ;;
   esac
   if test "$GNU_CC"; then
     MOZ_ENABLE_FRAME_PTR="-fno-omit-frame-pointer $unwind_tables"
     MOZ_DISABLE_FRAME_PTR="-fomit-frame-pointer"
+    if test "$CPU_ARCH" = arm; then
+      # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54398
+      MOZ_ENABLE_FRAME_PTR="$unwind_tables"
+    fi
   else
     case "$target" in
     *-mingw*)
       MOZ_ENABLE_FRAME_PTR="-Oy-"
       MOZ_DISABLE_FRAME_PTR="-Oy"
     ;;
     esac
   fi
--- a/build/automationutils.py
+++ b/build/automationutils.py
@@ -25,16 +25,21 @@ from urlparse import urlparse
 DEBUGGER_INFO = {
   # gdb requires that you supply the '--args' flag in order to pass arguments
   # after the executable name to the executable.
   "gdb": {
     "interactive": True,
     "args": "-q --args"
   },
 
+  "cgdb": {
+    "interactive": True,
+    "args": "-q --args"
+  },
+
   "lldb": {
     "interactive": True,
     "args": "--"
   },
 
   # valgrind doesn't explain much about leaks unless you set the
   # '--leak-check=full' flag.
   "valgrind": {
--- a/caps/src/nsScriptSecurityManager.cpp
+++ b/caps/src/nsScriptSecurityManager.cpp
@@ -2097,18 +2097,18 @@ nsScriptSecurityManager::old_doGetObject
             if (result) {
                 break;
             }
         } else {
             nsISupports *priv;
             if (!(~jsClass->flags & (JSCLASS_HAS_PRIVATE |
                                      JSCLASS_PRIVATE_IS_NSISUPPORTS))) {
                 priv = (nsISupports *) js::GetObjectPrivate(obj);
-            } else if (!UnwrapDOMObjectToISupports(obj, priv)) {
-                priv = nullptr;
+            } else {
+                priv = UnwrapDOMObjectToISupports(obj);
             }
 
             if (aAllowShortCircuit) {
                 nsCOMPtr<nsIXPConnectWrappedNative> xpcWrapper =
                     do_QueryInterface(priv);
 
                 NS_ASSERTION(!xpcWrapper ||
                              !strcmp(jsClass->name, "XPCNativeWrapper"),
--- a/configure.in
+++ b/configure.in
@@ -65,17 +65,17 @@ GTK2_VERSION=2.10.0
 WINDRES_VERSION=2.14.90
 W32API_VERSION=3.14
 GNOMEVFS_VERSION=2.0
 GNOMEUI_VERSION=2.2.0
 GCONF_VERSION=1.2.1
 GIO_VERSION=2.20
 STARTUP_NOTIFICATION_VERSION=0.8
 DBUS_VERSION=0.60
-SQLITE_VERSION=3.7.16.1
+SQLITE_VERSION=3.7.17
 
 MSMANIFEST_TOOL=
 
 dnl Set various checks
 dnl ========================================================
 MISSING_X=
 AC_PROG_AWK
 
@@ -2087,16 +2087,17 @@ ia64*-hpux*)
         CFLAGS="$CFLAGS -mms-bitfields"
         CXXFLAGS="$CXXFLAGS -mms-bitfields"
         DSO_LDOPTS='-shared'
         MKSHLIB='$(CXX) $(DSO_LDOPTS) -o $@'
         MKCSHLIB='$(CC) $(DSO_LDOPTS) -o $@'
         RC='$(WINDRES)'
         # Use static libgcc and libstdc++
         LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++"
+        NSPR_LDFLAGS="$NSPR_LDFLAGS -static-libgcc"
         # Use temp file for windres (bug 213281)
         RCFLAGS='-O coff --use-temp-file'
         # mingw doesn't require kernel32, user32, and advapi32 explicitly
         LIBS="$LIBS -luuid -lgdi32 -lwinmm -lwsock32 -luserenv -lsecur32 -lnetapi32"
         MOZ_FIX_LINK_PATHS=
         DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/lib -lxul -lxpcom_core -lmozalloc'
         XPCOM_FROZEN_LDOPTS='-L$(LIBXUL_DIST)/lib -lxul -lmozalloc'
         DLL_PREFIX=
--- a/content/base/public/Element.h
+++ b/content/base/public/Element.h
@@ -391,24 +391,24 @@ private:
   }
   void RemoveStates(nsEventStates aStates) {
     NS_PRECONDITION(!aStates.HasAtLeastOneOfStates(INTRINSIC_STATES),
                     "Should only be removing ESM-managed states here");
     RemoveStatesSilently(aStates);
     NotifyStateChange(aStates);
   }
 public:
-  virtual void UpdateEditableState(bool aNotify);
+  virtual void UpdateEditableState(bool aNotify) MOZ_OVERRIDE;
 
   virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                               nsIContent* aBindingParent,
-                              bool aCompileEventHandlers);
+                              bool aCompileEventHandlers) MOZ_OVERRIDE;
   virtual void UnbindFromTree(bool aDeep = true,
-                              bool aNullParent = true);
-  virtual already_AddRefed<nsINodeInfo> GetExistingAttrNameFromQName(const nsAString& aStr) const;
+                              bool aNullParent = true) MOZ_OVERRIDE;
+  virtual already_AddRefed<nsINodeInfo> GetExistingAttrNameFromQName(const nsAString& aStr) const MOZ_OVERRIDE;
   nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                    const nsAString& aValue, bool aNotify)
   {
     return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify);
   }
 
   /**
    * Helper for SetAttr/SetParsedAttr. This method will return true if aNotify
@@ -434,17 +434,17 @@ public:
 
   bool OnlyNotifySameValueSet(int32_t aNamespaceID, nsIAtom* aName,
                               nsIAtom* aPrefix,
                               const nsAttrValueOrString& aValue,
                               bool aNotify, nsAttrValue& aOldValue,
                               uint8_t* aModType, bool* aHasListeners);
 
   virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix,
-                           const nsAString& aValue, bool aNotify);
+                           const nsAString& aValue, bool aNotify) MOZ_OVERRIDE;
   nsresult SetParsedAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix,
                          nsAttrValue& aParsedValue, bool aNotify);
   // GetAttr is not inlined on purpose, to keep down codesize from all
   // the inlined nsAttrValue bits for C++ callers.
   bool GetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                nsAString& aResult) const;
   inline bool HasAttr(int32_t aNameSpaceID, nsIAtom* aName) const;
   // aCaseSensitive == eIgnoreCaase means ASCII case-insensitive matching.
@@ -452,29 +452,29 @@ public:
                           const nsAString& aValue,
                           nsCaseTreatment aCaseSensitive) const;
   inline bool AttrValueIs(int32_t aNameSpaceID, nsIAtom* aName,
                           nsIAtom* aValue,
                           nsCaseTreatment aCaseSensitive) const;
   virtual int32_t FindAttrValueIn(int32_t aNameSpaceID,
                                   nsIAtom* aName,
                                   AttrValuesArray* aValues,
-                                  nsCaseTreatment aCaseSensitive) const;
+                                  nsCaseTreatment aCaseSensitive) const MOZ_OVERRIDE;
   virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
-                             bool aNotify);
-  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const;
-  virtual uint32_t GetAttrCount() const;
-  virtual bool IsNodeOfType(uint32_t aFlags) const;
+                             bool aNotify) MOZ_OVERRIDE;
+  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const MOZ_OVERRIDE;
+  virtual uint32_t GetAttrCount() const MOZ_OVERRIDE;
+  virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
 
 #ifdef DEBUG
-  virtual void List(FILE* out = stdout, int32_t aIndent = 0) const
+  virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE
   {
     List(out, aIndent, EmptyCString());
   }
-  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const;
+  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const MOZ_OVERRIDE;
   void List(FILE* out, int32_t aIndent, const nsCString& aPrefix) const;
   void ListAttributes(FILE* out) const;
 #endif
 
   /*
    * Attribute Mapping Helpers
    */
   struct MappedAttributeEntry {
--- a/content/base/public/FragmentOrElement.h
+++ b/content/base/public/FragmentOrElement.h
@@ -7,16 +7,17 @@
  * Base class for all element classes as well as nsDocumentFragment.  This
  * provides an implementation of nsIDOMNode, implements nsIContent, provides
  * utility methods for subclasses, and so forth.
  */
 
 #ifndef FragmentOrElement_h___
 #define FragmentOrElement_h___
 
+#include "mozilla/Attributes.h"
 #include "nsAttrAndChildArray.h"          // member
 #include "nsCycleCollectionParticipant.h" // NS_DECL_CYCLE_*
 #include "nsIContent.h"                   // base class
 #include "nsIDOMTouchEvent.h"             // base class (nsITouchEventReceiver)
 #include "nsIDOMXPathNSResolver.h"        // base class
 #include "nsIInlineEventHandlers.h"       // base class
 #include "nsINodeList.h"                  // base class
 #include "nsIWeakReference.h"             // base class
@@ -55,25 +56,25 @@ public:
   // nsWrapperCache
   virtual JSObject* WrapObject(JSContext *cx,
                                JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
 
   // nsIDOMNodeList interface
   NS_DECL_NSIDOMNODELIST
 
   // nsINodeList interface
-  virtual int32_t IndexOf(nsIContent* aContent);
-  virtual nsIContent* Item(uint32_t aIndex);
+  virtual int32_t IndexOf(nsIContent* aContent) MOZ_OVERRIDE;
+  virtual nsIContent* Item(uint32_t aIndex) MOZ_OVERRIDE;
 
   void DropReference()
   {
     mNode = nullptr;
   }
 
-  virtual nsINode* GetParentObject()
+  virtual nsINode* GetParentObject() MOZ_OVERRIDE
   {
     return mNode;
   }
 
 private:
   // The node whose children make up the list (weak reference)
   nsINode* mNode;
 };
@@ -181,50 +182,50 @@ public:
 
   /**
    * Called during QueryInterface to give the binding manager a chance to
    * get an interface for this element.
    */
   nsresult PostQueryInterface(REFNSIID aIID, void** aInstancePtr);
 
   // nsINode interface methods
-  virtual uint32_t GetChildCount() const;
-  virtual nsIContent *GetChildAt(uint32_t aIndex) const;
-  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const;
+  virtual uint32_t GetChildCount() const MOZ_OVERRIDE;
+  virtual nsIContent *GetChildAt(uint32_t aIndex) const MOZ_OVERRIDE;
+  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const MOZ_OVERRIDE;
   virtual int32_t IndexOf(const nsINode* aPossibleChild) const MOZ_OVERRIDE;
   virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
-                                 bool aNotify);
-  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify);
-  virtual void GetTextContentInternal(nsAString& aTextContent);
+                                 bool aNotify) MOZ_OVERRIDE;
+  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) MOZ_OVERRIDE;
+  virtual void GetTextContentInternal(nsAString& aTextContent) MOZ_OVERRIDE;
   virtual void SetTextContentInternal(const nsAString& aTextContent,
-                                      mozilla::ErrorResult& aError);
+                                      mozilla::ErrorResult& aError) MOZ_OVERRIDE;
 
   // nsIContent interface methods
-  virtual already_AddRefed<nsINodeList> GetChildren(uint32_t aFilter);
-  virtual const nsTextFragment *GetText();
-  virtual uint32_t TextLength() const;
+  virtual already_AddRefed<nsINodeList> GetChildren(uint32_t aFilter) MOZ_OVERRIDE;
+  virtual const nsTextFragment *GetText() MOZ_OVERRIDE;
+  virtual uint32_t TextLength() const MOZ_OVERRIDE;
   virtual nsresult SetText(const PRUnichar* aBuffer, uint32_t aLength,
-                           bool aNotify);
+                           bool aNotify) MOZ_OVERRIDE;
   // Need to implement this here too to avoid hiding.
   nsresult SetText(const nsAString& aStr, bool aNotify)
   {
     return SetText(aStr.BeginReading(), aStr.Length(), aNotify);
   }
   virtual nsresult AppendText(const PRUnichar* aBuffer, uint32_t aLength,
-                              bool aNotify);
-  virtual bool TextIsOnlyWhitespace();
-  virtual void AppendTextTo(nsAString& aResult);
-  virtual nsIContent *GetBindingParent() const;
-  virtual bool IsLink(nsIURI** aURI) const;
+                              bool aNotify) MOZ_OVERRIDE;
+  virtual bool TextIsOnlyWhitespace() MOZ_OVERRIDE;
+  virtual void AppendTextTo(nsAString& aResult) MOZ_OVERRIDE;
+  virtual nsIContent *GetBindingParent() const MOZ_OVERRIDE;
+  virtual bool IsLink(nsIURI** aURI) const MOZ_OVERRIDE;
 
-  virtual void DestroyContent();
-  virtual void SaveSubtreeState();
+  virtual void DestroyContent() MOZ_OVERRIDE;
+  virtual void SaveSubtreeState() MOZ_OVERRIDE;
 
-  virtual const nsAttrValue* DoGetClasses() const;
-  NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker);
+  virtual const nsAttrValue* DoGetClasses() const MOZ_OVERRIDE;
+  NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker) MOZ_OVERRIDE;
 
   nsIHTMLCollection* Children();
 
 public:
   /**
    * If there are listeners for DOMNodeInserted event, fires the event on all
    * aNodes
    */
@@ -234,32 +235,32 @@ public:
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS(FragmentOrElement)
 
   /**
    * Fire a DOMNodeRemoved mutation event for all children of this node
    */
   void FireNodeRemovedForChildren();
 
-  virtual bool OwnedOnlyByTheDOMTree()
+  virtual bool OwnedOnlyByTheDOMTree() MOZ_OVERRIDE
   {
     uint32_t rc = mRefCnt.get();
     if (GetParent()) {
       --rc;
     }
     rc -= mAttrsAndChildren.ChildCount();
     return rc == 0;
   }
 
-  virtual bool IsPurple()
+  virtual bool IsPurple() MOZ_OVERRIDE
   {
     return mRefCnt.IsPurple();
   }
 
-  virtual void RemovePurple()
+  virtual void RemovePurple() MOZ_OVERRIDE
   {
     mRefCnt.RemovePurple();
   }
 
   static void ClearContentUnbinder();
   static bool CanSkip(nsINode* aNode, bool aRemovingAllowed);
   static bool CanSkipInCC(nsINode* aNode);
   static bool CanSkipThis(nsINode* aNode);
@@ -356,17 +357,17 @@ public:
     /**
      * An object implementing the .classList property for this element.
      */
     nsRefPtr<nsDOMTokenList> mClassList;
   };
 
 protected:
   // Override from nsINode
-  virtual nsINode::nsSlots* CreateSlots();
+  virtual nsINode::nsSlots* CreateSlots() MOZ_OVERRIDE;
 
   nsDOMSlots *DOMSlots()
   {
     return static_cast<nsDOMSlots*>(Slots());
   }
 
   nsDOMSlots *GetExistingDOMSlots() const
   {
--- a/content/base/public/nsDOMFile.h
+++ b/content/base/public/nsDOMFile.h
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsDOMFile_h__
 #define nsDOMFile_h__
 
+#include "mozilla/Attributes.h"
 #include "nsICharsetDetectionObserver.h"
 #include "nsIFile.h"
 #include "nsIDOMFile.h"
 #include "nsIDOMFileList.h"
 #include "nsIInputStream.h"
 #include "nsIJSNativeInitializer.h"
 #include "nsIMutable.h"
 #include "nsCOMArray.h"
@@ -285,22 +286,22 @@ public:
       mWholeFile(true), mStoredFile(false)
   {
     // Lazily get the content type and size
     mContentType.SetIsVoid(true);
     mName.SetIsVoid(true);
   }
 
   // Overrides
-  NS_IMETHOD GetSize(uint64_t* aSize);
-  NS_IMETHOD GetType(nsAString& aType);
-  NS_IMETHOD GetLastModifiedDate(JSContext* cx, JS::Value* aLastModifiedDate);
-  NS_IMETHOD GetMozLastModifiedDate(uint64_t* aLastModifiedDate);
-  NS_IMETHOD GetMozFullPathInternal(nsAString& aFullPath);
-  NS_IMETHOD GetInternalStream(nsIInputStream**);
+  NS_IMETHOD GetSize(uint64_t* aSize) MOZ_OVERRIDE;
+  NS_IMETHOD GetType(nsAString& aType) MOZ_OVERRIDE;
+  NS_IMETHOD GetLastModifiedDate(JSContext* cx, JS::Value* aLastModifiedDate) MOZ_OVERRIDE;
+  NS_IMETHOD GetMozLastModifiedDate(uint64_t* aLastModifiedDate) MOZ_OVERRIDE;
+  NS_IMETHOD GetMozFullPathInternal(nsAString& aFullPath) MOZ_OVERRIDE;
+  NS_IMETHOD GetInternalStream(nsIInputStream**) MOZ_OVERRIDE;
 
 protected:
   // Create slice
   nsDOMFileFile(const nsDOMFileFile* aOther, uint64_t aStart, uint64_t aLength,
                 const nsAString& aContentType)
     : nsDOMFile(aContentType, aOther->mStart + aStart, aLength),
       mFile(aOther->mFile), mWholeFile(false),
       mStoredFile(aOther->mStoredFile)
@@ -322,24 +323,24 @@ protected:
       }
 
       mFileInfos.AppendElement(fileInfo);
     }
   }
 
   virtual already_AddRefed<nsIDOMBlob>
   CreateSlice(uint64_t aStart, uint64_t aLength,
-              const nsAString& aContentType);
+              const nsAString& aContentType) MOZ_OVERRIDE;
 
-  virtual bool IsStoredFile() const
+  virtual bool IsStoredFile() const MOZ_OVERRIDE
   {
     return mStoredFile;
   }
 
-  virtual bool IsWholeFile() const
+  virtual bool IsWholeFile() const MOZ_OVERRIDE
   {
     return mWholeFile;
   }
 
   nsCOMPtr<nsIFile> mFile;
   bool mWholeFile;
   bool mStoredFile;
 };
@@ -367,31 +368,31 @@ public:
                   uint64_t aLength,
                   const nsAString& aContentType)
     : nsDOMFile(aContentType, aLength),
       mDataOwner(new DataOwner(aMemoryBuffer, aLength))
   {
     NS_ASSERTION(mDataOwner && mDataOwner->mData, "must have data");
   }
 
-  NS_IMETHOD GetInternalStream(nsIInputStream**);
+  NS_IMETHOD GetInternalStream(nsIInputStream**) MOZ_OVERRIDE;
 
 protected:
   // Create slice
   nsDOMMemoryFile(const nsDOMMemoryFile* aOther, uint64_t aStart,
                   uint64_t aLength, const nsAString& aContentType)
     : nsDOMFile(aContentType, aOther->mStart + aStart, aLength),
       mDataOwner(aOther->mDataOwner)
   {
     NS_ASSERTION(mDataOwner && mDataOwner->mData, "must have data");
     mImmutable = aOther->mImmutable;
   }
   virtual already_AddRefed<nsIDOMBlob>
   CreateSlice(uint64_t aStart, uint64_t aLength,
-              const nsAString& aContentType);
+              const nsAString& aContentType) MOZ_OVERRIDE;
 
   // These classes need to see DataOwner.
   friend class DataOwnerAdapter;
   friend class nsDOMMemoryFileDataOwnerMemoryReporter;
 
   class DataOwner : public mozilla::LinkedListElement<DataOwner> {
   public:
     NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DataOwner)
--- a/content/base/public/nsDocElementCreatedNotificationRunner.h
+++ b/content/base/public/nsDocElementCreatedNotificationRunner.h
@@ -1,31 +1,32 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsDocElementCreatedNotificationRunner_h
 #define nsDocElementCreatedNotificationRunner_h
 
+#include "mozilla/Attributes.h"
 #include "nsThreadUtils.h" /* nsRunnable */
 
 #include "nsContentSink.h"
 #include "nsCOMPtr.h"
 #include "nsIDocument.h"
 
 class nsDocElementCreatedNotificationRunner : public nsRunnable
 {
 public:
   nsDocElementCreatedNotificationRunner(nsIDocument* aDoc)
     : mDoc(aDoc)
   {
   }
 
-  NS_IMETHOD Run()
+  NS_IMETHOD Run() MOZ_OVERRIDE
   {
     nsContentSink::NotifyDocElementCreated(mDoc);
     return NS_OK;
   }
 
   nsCOMPtr<nsIDocument> mDoc;
 };
 
--- a/content/base/public/nsHostObjectProtocolHandler.h
+++ b/content/base/public/nsHostObjectProtocolHandler.h
@@ -1,15 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsHostObjectProtocolHandler_h
 #define nsHostObjectProtocolHandler_h
 
+#include "mozilla/Attributes.h"
 #include "nsIProtocolHandler.h"
 #include "nsIURI.h"
 #include "nsCOMPtr.h"
 
 #define BLOBURI_SCHEME "blob"
 #define MEDIASTREAMURI_SCHEME "mediastream"
 
 class nsIDOMBlob;
@@ -20,43 +21,43 @@ class nsIInputStream;
 class nsHostObjectProtocolHandler : public nsIProtocolHandler
 {
 public:
   virtual ~nsHostObjectProtocolHandler() {}
   NS_DECL_ISUPPORTS
 
   // nsIProtocolHandler methods, except for GetScheme which is only defined
   // in subclasses.
-  NS_IMETHOD GetDefaultPort(int32_t *aDefaultPort);
-  NS_IMETHOD GetProtocolFlags(uint32_t *aProtocolFlags);
-  NS_IMETHOD NewURI(const nsACString & aSpec, const char * aOriginCharset, nsIURI *aBaseURI, nsIURI * *_retval);
-  NS_IMETHOD NewChannel(nsIURI *aURI, nsIChannel * *_retval);
-  NS_IMETHOD AllowPort(int32_t port, const char * scheme, bool *_retval);
+  NS_IMETHOD GetDefaultPort(int32_t *aDefaultPort) MOZ_OVERRIDE;
+  NS_IMETHOD GetProtocolFlags(uint32_t *aProtocolFlags) MOZ_OVERRIDE;
+  NS_IMETHOD NewURI(const nsACString & aSpec, const char * aOriginCharset, nsIURI *aBaseURI, nsIURI * *_retval) MOZ_OVERRIDE;
+  NS_IMETHOD NewChannel(nsIURI *aURI, nsIChannel * *_retval) MOZ_OVERRIDE;
+  NS_IMETHOD AllowPort(int32_t port, const char * scheme, bool *_retval) MOZ_OVERRIDE;
 
   // Methods for managing uri->object mapping
   // AddDataEntry creates the URI with the given scheme and returns it in aUri
   static nsresult AddDataEntry(const nsACString& aScheme,
                                nsISupports* aObject,
                                nsIPrincipal* aPrincipal,
                                nsACString& aUri);
   static void RemoveDataEntry(const nsACString& aUri);
   static nsIPrincipal* GetDataEntryPrincipal(const nsACString& aUri);
   static void Traverse(const nsACString& aUri, nsCycleCollectionTraversalCallback& aCallback);
 };
 
 class nsBlobProtocolHandler : public nsHostObjectProtocolHandler
 {
 public:
-  NS_IMETHOD GetScheme(nsACString &result);
+  NS_IMETHOD GetScheme(nsACString &result) MOZ_OVERRIDE;
 };
 
 class nsMediaStreamProtocolHandler : public nsHostObjectProtocolHandler
 {
 public:
-  NS_IMETHOD GetScheme(nsACString &result);
+  NS_IMETHOD GetScheme(nsACString &result) MOZ_OVERRIDE;
 };
 
 inline bool IsBlobURI(nsIURI* aUri)
 {
   bool isBlob;
   return NS_SUCCEEDED(aUri->SchemeIs(BLOBURI_SCHEME, &isBlob)) && isBlob;
 }
 
--- a/content/base/public/nsIContent.h
+++ b/content/base/public/nsIContent.h
@@ -1,15 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 #ifndef nsIContent_h___
 #define nsIContent_h___
 
+#include "mozilla/Attributes.h"
 #include "nsCaseTreatment.h" // for enum, cannot be forward-declared
 #include "nsIDocument.h"
 
 // Forward declarations
 class nsAString;
 class nsIAtom;
 class nsIURI;
 class nsRuleWalker;
@@ -841,19 +842,19 @@ public:
         if (hasAttr) {
           return;
         }
       }
     }
   }
 
   // Overloaded from nsINode
-  virtual already_AddRefed<nsIURI> GetBaseURI() const;
+  virtual already_AddRefed<nsIURI> GetBaseURI() const MOZ_OVERRIDE;
 
-  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
+  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor) MOZ_OVERRIDE;
 
   virtual bool IsPurple() = 0;
   virtual void RemovePurple() = 0;
 
   virtual bool OwnedOnlyByTheDOMTree() { return false; }
 protected:
   /**
    * Hook for implementing GetID.  This is guaranteed to only be
--- a/content/base/public/nsIDocument.h
+++ b/content/base/public/nsIDocument.h
@@ -1,15 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 #ifndef nsIDocument_h___
 #define nsIDocument_h___
 
+#include "mozilla/Attributes.h"
 #include "mozFlushType.h"                // for enum
 #include "nsAutoPtr.h"                   // for member
 #include "nsCOMArray.h"                  // for member
 #include "nsCRT.h"                       // for NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
 #include "nsCompatibility.h"             // for member
 #include "nsCOMPtr.h"                    // for member
 #include "nsGkAtoms.h"                   // for static class members
 #include "nsIDocumentEncoder.h"          // for member (in nsCOMPtr)
@@ -255,17 +256,17 @@ public:
    * Return the base URI for relative URIs in the document (the document uri
    * unless it's overridden by SetBaseURI, HTML <base> tags, etc.).  The
    * returned URI could be null if there is no document URI.
    */
   nsIURI* GetDocBaseURI() const
   {
     return mDocumentBaseURI ? mDocumentBaseURI : mDocumentURI;
   }
-  virtual already_AddRefed<nsIURI> GetBaseURI() const
+  virtual already_AddRefed<nsIURI> GetBaseURI() const MOZ_OVERRIDE
   {
     nsCOMPtr<nsIURI> uri = GetDocBaseURI();
 
     return uri.forget();
   }
 
   virtual nsresult SetBaseURI(nsIURI* aURI) = 0;
 
--- a/content/base/public/nsINode.h
+++ b/content/base/public/nsINode.h
@@ -63,16 +63,17 @@ class Element;
 class EventHandlerNonNull;
 class OnErrorEventHandlerNonNull;
 template<typename T> class Optional;
 } // namespace dom
 } // namespace mozilla
 
 namespace JS {
 class Value;
+template<typename T> class Handle;
 }
 
 #define NODE_FLAG_BIT(n_) (1U << (n_))
 
 enum {
   // This bit will be set if the node has a listener manager.
   NODE_HAS_LISTENERMANAGER =              NODE_FLAG_BIT(0),
 
@@ -807,16 +808,17 @@ public:
   using mozilla::dom::EventTarget::RemoveEventListener;
   using nsIDOMEventTarget::AddEventListener;
   virtual void AddEventListener(const nsAString& aType,
                                 nsIDOMEventListener* aListener,
                                 bool aUseCapture,
                                 const mozilla::dom::Nullable<bool>& aWantsUntrusted,
                                 mozilla::ErrorResult& aRv) MOZ_OVERRIDE;
   using nsIDOMEventTarget::AddSystemEventListener;
+  virtual nsIDOMWindow* GetOwnerGlobal() MOZ_OVERRIDE;
 
   /**
    * Adds a mutation observer to be notified when this node, or any of its
    * descendants, are modified. The node will hold a weak reference to the
    * observer, which means that it is the responsibility of the observer to
    * remove itself in case it dies before the node.  If an observer is added
    * while observers are being notified, it may also be notified.  In general,
    * adding observers while inside a notification is not a good idea.  An
@@ -1575,17 +1577,18 @@ public:
 #endif
   void GetLocalName(nsAString& aLocalName)
   {
     aLocalName = mNodeInfo->LocalName();
   }
   // HasAttributes is defined inline in Element.h.
   bool HasAttributes() const;
   nsDOMAttributeMap* GetAttributes();
-  JS::Value SetUserData(JSContext* aCx, const nsAString& aKey, JS::Value aData,
+  JS::Value SetUserData(JSContext* aCx, const nsAString& aKey,
+                        JS::Handle<JS::Value> aData,
                         nsIDOMUserDataHandler* aHandler,
                         mozilla::ErrorResult& aError);
   JS::Value GetUserData(JSContext* aCx, const nsAString& aKey,
                         mozilla::ErrorResult& aError);
 
   // Helper method to remove this node from its parent. This is not exposed
   // through WebIDL.
   // Only call this if the node has a parent node.
--- a/content/base/public/nsReferencedElement.h
+++ b/content/base/public/nsReferencedElement.h
@@ -2,16 +2,17 @@
 /* vim: set ts=2 sw=2 et tw=78: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef NSREFERENCEDELEMENT_H_
 #define NSREFERENCEDELEMENT_H_
 
+#include "mozilla/Attributes.h"
 #include "mozilla/dom/Element.h"
 #include "nsIAtom.h"
 #include "nsIDocument.h"
 #include "nsThreadUtils.h"
 #include "nsAutoPtr.h"
 
 class nsIURI;
 class nsCycleCollectionCallback;
@@ -129,17 +130,17 @@ private:
   public:
     ChangeNotification(nsReferencedElement* aTarget,
                        Element* aFrom, Element* aTo)
       : Notification(aTarget), mFrom(aFrom), mTo(aTo)
     {}
     virtual ~ChangeNotification() {}
 
     NS_DECL_ISUPPORTS_INHERITED
-    NS_IMETHOD Run() {
+    NS_IMETHOD Run() MOZ_OVERRIDE {
       if (mTarget) {
         mTarget->mPendingNotification = nullptr;
         mTarget->ElementChanged(mFrom, mTo);
       }
       return NS_OK;
     }
     virtual void SetTo(Element* aTo) { mTo = aTo; }
     virtual void Clear()
--- a/content/base/src/Attr.h
+++ b/content/base/src/Attr.h
@@ -5,16 +5,17 @@
 
 /*
  * Implementation of DOM Core's nsIDOMAttr node.
  */
 
 #ifndef mozilla_dom_Attr_h
 #define mozilla_dom_Attr_h
 
+#include "mozilla/Attributes.h"
 #include "nsIAttribute.h"
 #include "nsIDOMAttr.h"
 #include "nsIDOMText.h"
 #include "nsIDOMNodeList.h"
 #include "nsString.h"
 #include "nsCOMPtr.h"
 #include "nsINodeInfo.h"
 #include "nsCycleCollectionParticipant.h"
@@ -34,44 +35,44 @@ public:
        const nsAString& aValue,
        bool aNsAware);
   virtual ~Attr() {}
 
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 
   // nsIDOMNode interface
   NS_FORWARD_NSIDOMNODE_TO_NSINODE
-  virtual void GetTextContentInternal(nsAString& aTextContent);
+  virtual void GetTextContentInternal(nsAString& aTextContent) MOZ_OVERRIDE;
   virtual void SetTextContentInternal(const nsAString& aTextContent,
-                                      ErrorResult& aError);
-  virtual void GetNodeValueInternal(nsAString& aNodeValue);
+                                      ErrorResult& aError) MOZ_OVERRIDE;
+  virtual void GetNodeValueInternal(nsAString& aNodeValue) MOZ_OVERRIDE;
   virtual void SetNodeValueInternal(const nsAString& aNodeValue,
-                                    ErrorResult& aError);
+                                    ErrorResult& aError) MOZ_OVERRIDE;
 
   // nsIDOMAttr interface
   NS_DECL_NSIDOMATTR
 
-  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
+  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor) MOZ_OVERRIDE;
 
   // nsIAttribute interface
-  void SetMap(nsDOMAttributeMap *aMap);
-  nsIContent *GetContent() const;
-  nsresult SetOwnerDocument(nsIDocument* aDocument);
+  void SetMap(nsDOMAttributeMap *aMap) MOZ_OVERRIDE;
+  nsIContent *GetContent() const MOZ_OVERRIDE;
+  nsresult SetOwnerDocument(nsIDocument* aDocument) MOZ_OVERRIDE;
 
   // nsINode interface
-  virtual bool IsNodeOfType(uint32_t aFlags) const;
-  virtual uint32_t GetChildCount() const;
-  virtual nsIContent *GetChildAt(uint32_t aIndex) const;
-  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const;
+  virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
+  virtual uint32_t GetChildCount() const MOZ_OVERRIDE;
+  virtual nsIContent *GetChildAt(uint32_t aIndex) const MOZ_OVERRIDE;
+  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const MOZ_OVERRIDE;
   virtual int32_t IndexOf(const nsINode* aPossibleChild) const MOZ_OVERRIDE;
   virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
-                                 bool aNotify);
-  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify);
-  virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
-  virtual already_AddRefed<nsIURI> GetBaseURI() const;
+                                 bool aNotify) MOZ_OVERRIDE;
+  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) MOZ_OVERRIDE;
+  virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
+  virtual already_AddRefed<nsIURI> GetBaseURI() const MOZ_OVERRIDE;
 
   static void Initialize();
   static void Shutdown();
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS(Attr,
                                                                    nsIAttribute)
 
   virtual nsIDOMNode* AsDOMNode() { return this; }
--- a/content/base/src/Comment.h
+++ b/content/base/src/Comment.h
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_Comment_h
 #define mozilla_dom_Comment_h
 
+#include "mozilla/Attributes.h"
 #include "nsIDOMComment.h"
 #include "nsGenericDOMDataNode.h"
 
 namespace mozilla {
 namespace dom {
 
 class Comment : public nsGenericDOMDataNode,
                 public nsIDOMComment
@@ -49,23 +50,23 @@ public:
 
   // nsIDOMComment
   // Empty interface
 
   // nsINode
   virtual bool IsNodeOfType(uint32_t aFlags) const;
 
   virtual nsGenericDOMDataNode* CloneDataNode(nsINodeInfo *aNodeInfo,
-                                              bool aCloneText) const;
+                                              bool aCloneText) const MOZ_OVERRIDE;
 
-  virtual nsIDOMNode* AsDOMNode() { return this; }
+  virtual nsIDOMNode* AsDOMNode() MOZ_OVERRIDE { return this; }
 #ifdef DEBUG
-  virtual void List(FILE* out, int32_t aIndent) const;
+  virtual void List(FILE* out, int32_t aIndent) const MOZ_OVERRIDE;
   virtual void DumpContent(FILE* out = stdout, int32_t aIndent = 0,
-                           bool aDumpAll = true) const
+                           bool aDumpAll = true) const MOZ_OVERRIDE
   {
     return;
   }
 #endif
 
   static already_AddRefed<Comment>
   Constructor(const GlobalObject& aGlobal, const nsAString& aData,
               ErrorResult& aRv);
--- a/content/base/src/DocumentFragment.h
+++ b/content/base/src/DocumentFragment.h
@@ -2,16 +2,17 @@
  * vim: sw=2 ts=2 et :
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_DocumentFragment_h__
 #define mozilla_dom_DocumentFragment_h__
 
+#include "mozilla/Attributes.h"
 #include "mozilla/dom/FragmentOrElement.h"
 #include "nsIDOMDocumentFragment.h"
 
 class nsINodeInfo;
 class nsIAtom;
 class nsAString;
 class nsIDocument;
 class nsIContent;
@@ -70,62 +71,62 @@ public:
   {
   }
 
   virtual JSObject* WrapNode(JSContext *aCx,
                              JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
   // nsIContent
   virtual already_AddRefed<nsINodeInfo>
-    GetExistingAttrNameFromQName(const nsAString& aStr) const
+    GetExistingAttrNameFromQName(const nsAString& aStr) const MOZ_OVERRIDE
   {
     return nullptr;
   }
 
   nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                    const nsAString& aValue, bool aNotify)
   {
     return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify);
   }
   virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                            nsIAtom* aPrefix, const nsAString& aValue,
-                           bool aNotify)
+                           bool aNotify) MOZ_OVERRIDE
   {
     return NS_OK;
   }
   virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute, 
-                             bool aNotify)
+                             bool aNotify) MOZ_OVERRIDE
   {
     return NS_OK;
   }
-  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const
+  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const MOZ_OVERRIDE
   {
     return nullptr;
   }
-  virtual uint32_t GetAttrCount() const
+  virtual uint32_t GetAttrCount() const MOZ_OVERRIDE
   {
     return 0;
   }
 
-  virtual bool IsNodeOfType(uint32_t aFlags) const;
+  virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
 
-  virtual nsIDOMNode* AsDOMNode() { return this; }
+  virtual nsIDOMNode* AsDOMNode() MOZ_OVERRIDE { return this; }
 
-  virtual nsIAtom* DoGetID() const;
-  virtual nsIAtom *GetIDAttributeName() const;
+  virtual nsIAtom* DoGetID() const MOZ_OVERRIDE;
+  virtual nsIAtom *GetIDAttributeName() const MOZ_OVERRIDE;
 
   virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                               nsIContent* aBindingParent,
-                              bool aCompileEventHandlers)
+                              bool aCompileEventHandlers) MOZ_OVERRIDE
   {
     NS_ASSERTION(false, "Trying to bind a fragment to a tree");
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
-  virtual void UnbindFromTree(bool aDeep, bool aNullParent)
+  virtual void UnbindFromTree(bool aDeep, bool aNullParent) MOZ_OVERRIDE
   {
     NS_ASSERTION(false, "Trying to unbind a fragment from a tree");
     return;
   }
 
   virtual Element* GetNameSpaceElement()
   {
     return nullptr;
@@ -140,22 +141,22 @@ public:
   {
     mHost = aHost;
   }
 
   static already_AddRefed<DocumentFragment>
   Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
 
 #ifdef DEBUG
-  virtual void List(FILE* out, int32_t aIndent) const;
-  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const;
+  virtual void List(FILE* out, int32_t aIndent) const MOZ_OVERRIDE;
+  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const MOZ_OVERRIDE;
 #endif
 
 protected:
-  nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
+  nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
   mozilla::dom::HTMLTemplateElement* mHost; // Weak
 };
 
 } // namespace dom
 } // namespace mozilla
 
 
 #endif // mozilla_dom_DocumentFragment_h__
--- a/content/base/src/DocumentType.h
+++ b/content/base/src/DocumentType.h
@@ -5,16 +5,17 @@
 
 /*
  * Implementation of DOM Core's nsIDOMDocumentType node.
  */
 
 #ifndef DocumentType_h
 #define DocumentType_h
 
+#include "mozilla/Attributes.h"
 #include "nsCOMPtr.h"
 #include "nsIDOMDocumentType.h"
 #include "nsIContent.h"
 #include "nsGenericDOMDataNode.h"
 #include "nsString.h"
 
 namespace mozilla {
 namespace dom {
@@ -52,33 +53,33 @@ public:
 
   // nsIDOMNode
   // Forwarded by base class
 
   // nsIDOMDocumentType
   NS_DECL_NSIDOMDOCUMENTTYPE
 
   // nsINode
-  virtual bool IsNodeOfType(uint32_t aFlags) const;
-  virtual void GetNodeValueInternal(nsAString& aNodeValue)
+  virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
+  virtual void GetNodeValueInternal(nsAString& aNodeValue) MOZ_OVERRIDE
   {
     SetDOMStringToNull(aNodeValue);
   }
   virtual void SetNodeValueInternal(const nsAString& aNodeValue,
-                                    mozilla::ErrorResult& aError)
+                                    mozilla::ErrorResult& aError) MOZ_OVERRIDE
   {
   }
 
   // nsIContent overrides
-  virtual const nsTextFragment* GetText();
+  virtual const nsTextFragment* GetText() MOZ_OVERRIDE;
 
   virtual nsGenericDOMDataNode* CloneDataNode(nsINodeInfo *aNodeInfo,
-                                              bool aCloneText) const;
+                                              bool aCloneText) const MOZ_OVERRIDE;
 
-  virtual nsIDOMNode* AsDOMNode() { return this; }
+  virtual nsIDOMNode* AsDOMNode() MOZ_OVERRIDE { return this; }
 
 protected:
   virtual JSObject* WrapNode(JSContext *cx,
                              JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
 
   nsString mPublicId;
   nsString mSystemId;
   nsString mInternalSubset;
--- a/content/base/src/EventSource.h
+++ b/content/base/src/EventSource.h
@@ -8,16 +8,17 @@
  * spec has defined event streams only for http. HTTP is required because
  * this implementation uses some http headers: "Last-Event-ID", "Cache-Control"
  * and "Accept".
  */
 
 #ifndef mozilla_dom_EventSource_h
 #define mozilla_dom_EventSource_h
 
+#include "mozilla/Attributes.h"
 #include "nsDOMEventTargetHelper.h"
 #include "nsIObserver.h"
 #include "nsIStreamListener.h"
 #include "nsIChannelEventSink.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsITimer.h"
 #include "nsIHttpChannel.h"
 #include "nsWeakReference.h"
@@ -101,17 +102,17 @@ public:
   IMPL_EVENT_HANDLER(open)
   IMPL_EVENT_HANDLER(message)
   IMPL_EVENT_HANDLER(error)
   void Close();
 
   // Determine if preferences allow EventSource
   static bool PrefEnabled();
 
-  virtual void DisconnectFromOwner();
+  virtual void DisconnectFromOwner() MOZ_OVERRIDE;
 
 protected:
   nsresult Init(nsISupports* aOwner,
                 const nsAString& aURL,
                 bool aWithCredentials);
 
   nsresult GetBaseURI(nsIURI **aBaseURI);
 
--- a/content/base/src/WebSocket.h
+++ b/content/base/src/WebSocket.h
@@ -2,16 +2,17 @@
 /* vim: set sw=2 ts=8 et tw=80 : */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef WebSocket_h__
 #define WebSocket_h__
 
+#include "mozilla/Attributes.h"
 #include "mozilla/Util.h"
 
 #include "nsWrapperCache.h"
 #include "nsIWebSocketListener.h"
 #include "nsISupports.h"
 
 #include "mozilla/ErrorResult.h"
 #include "mozilla/dom/TypedArray.h"
@@ -70,17 +71,17 @@ public:
   NS_DECL_NSIWEBSOCKETLISTENER
   NS_DECL_NSIOBSERVER
   NS_DECL_NSIREQUEST
 
   // EventTarget
   virtual void EventListenerAdded(nsIAtom* aType) MOZ_OVERRIDE;
   virtual void EventListenerRemoved(nsIAtom* aType) MOZ_OVERRIDE;
 
-  virtual void DisconnectFromOwner();
+  virtual void DisconnectFromOwner() MOZ_OVERRIDE;
 
   // nsWrapperCache
   nsPIDOMWindow* GetParentObject() { return GetOwner(); }
 
   virtual JSObject* WrapObject(JSContext *cx,
                                JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
 
 public: // static helpers:
--- a/content/base/src/nsContentList.h
+++ b/content/base/src/nsContentList.h
@@ -7,16 +7,17 @@
  * nsBaseContentList is a basic list of content nodes; nsContentList
  * is a commonly used NodeList implementation (used for
  * getElementsByTagName, some properties on nsIDOMHTMLDocument, etc).
  */
 
 #ifndef nsContentList_h___
 #define nsContentList_h___
 
+#include "mozilla/Attributes.h"
 #include "nsContentListDeclarations.h"
 #include "nsISupports.h"
 #include "nsTArray.h"
 #include "nsStringGlue.h"
 #include "nsIHTMLCollection.h"
 #include "nsIDOMNodeList.h"
 #include "nsINodeList.h"
 #include "nsStubMutationObserver.h"
@@ -44,18 +45,18 @@ public:
   virtual ~nsBaseContentList();
 
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 
   // nsIDOMNodeList
   NS_DECL_NSIDOMNODELIST
 
   // nsINodeList
-  virtual int32_t IndexOf(nsIContent* aContent);
-  virtual nsIContent* Item(uint32_t aIndex);
+  virtual int32_t IndexOf(nsIContent* aContent) MOZ_OVERRIDE;
+  virtual nsIContent* Item(uint32_t aIndex) MOZ_OVERRIDE;
 
   uint32_t Length() const { 
     return mElements.Length();
   }
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS(nsBaseContentList)
 
   void AppendElement(nsIContent *aContent)
@@ -106,17 +107,17 @@ public:
                                         mRoot(aRoot)
   {
   }
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsSimpleContentList,
                                            nsBaseContentList)
 
-  virtual nsINode* GetParentObject()
+  virtual nsINode* GetParentObject() MOZ_OVERRIDE
   {
     return mRoot;
   }
   virtual JSObject* WrapObject(JSContext *cx,
                                JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
 
 private:
   // This has to be a strong reference, the root might go away before the list.
@@ -249,28 +250,28 @@ public:
   using nsWrapperCache::GetWrapperPreserveColor;
   virtual JSObject* WrapObject(JSContext *cx,
                                JS::Handle<JSObject*> scope) MOZ_OVERRIDE;
 
   // nsIDOMHTMLCollection
   NS_DECL_NSIDOMHTMLCOLLECTION
 
   // nsBaseContentList overrides
-  virtual int32_t IndexOf(nsIContent *aContent, bool aDoFlush);
-  virtual int32_t IndexOf(nsIContent* aContent);
-  virtual nsINode* GetParentObject()
+  virtual int32_t IndexOf(nsIContent *aContent, bool aDoFlush) MOZ_OVERRIDE;
+  virtual int32_t IndexOf(nsIContent* aContent) MOZ_OVERRIDE;
+  virtual nsINode* GetParentObject() MOZ_OVERRIDE
   {
     return mRootNode;
   }
 
-  virtual nsIContent* Item(uint32_t aIndex);
-  virtual mozilla::dom::Element* GetElementAt(uint32_t index);
+  virtual nsIContent* Item(uint32_t aIndex) MOZ_OVERRIDE;
+  virtual mozilla::dom::Element* GetElementAt(uint32_t index) MOZ_OVERRIDE;
   virtual JSObject* NamedItem(JSContext* cx, const nsAString& name,
-                              mozilla::ErrorResult& error);
-  virtual void GetSupportedNames(nsTArray<nsString>& aNames);
+                              mozilla::ErrorResult& error) MOZ_OVERRIDE;
+  virtual void GetSupportedNames(nsTArray<nsString>& aNames) MOZ_OVERRIDE;
 
   // nsContentList public methods
   NS_HIDDEN_(uint32_t) Length(bool aDoFlush);
   NS_HIDDEN_(nsIContent*) Item(uint32_t aIndex, bool aDoFlush);
   NS_HIDDEN_(nsIContent*) NamedItem(const nsAString& aName, bool aDoFlush);
 
   // nsIMutationObserver
   NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED
@@ -487,17 +488,17 @@ protected:
                                    const nsAString& aString) :
     nsContentList(aRootNode, aFunc, aDestroyFunc, nullptr),
     mString(aString)
   {
     mData = (*aDataAllocator)(aRootNode, &mString);
     MOZ_ASSERT(mData);
   }
 
-  virtual void RemoveFromCaches() {
+  virtual void RemoveFromCaches() MOZ_OVERRIDE {
     RemoveFromFuncStringHashtable();
   }
   void RemoveFromFuncStringHashtable();
 
   nsString mString;
 };
 
 class nsCacheableFuncStringNodeList
--- a/content/base/src/nsContentSink.h
+++ b/content/base/src/nsContentSink.h
@@ -8,16 +8,17 @@
  * DOM based on information from the parser.
  */
 
 #ifndef _nsContentSink_h_
 #define _nsContentSink_h_
 
 // Base class for contentsink implementations.
 
+#include "mozilla/Attributes.h"
 #include "nsICSSLoaderObserver.h"
 #include "nsWeakReference.h"
 #include "nsCOMPtr.h"
 #include "nsString.h"
 #include "nsAutoPtr.h"
 #include "nsGkAtoms.h"
 #include "nsITimer.h"
 #include "nsStubDocumentObserver.h"
@@ -81,17 +82,17 @@ class nsContentSink : public nsICSSLoade
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsContentSink,
                                            nsICSSLoaderObserver)
     // nsITimerCallback
   NS_DECL_NSITIMERCALLBACK
 
   // nsICSSLoaderObserver
   NS_IMETHOD StyleSheetLoaded(nsCSSStyleSheet* aSheet, bool aWasAlternate,
-                              nsresult aStatus);
+                              nsresult aStatus) MOZ_OVERRIDE;
 
   virtual nsresult ProcessMETATag(nsIContent* aContent);
 
   // nsIContentSink implementation helpers
   NS_HIDDEN_(nsresult) WillParseImpl(void);
   NS_HIDDEN_(nsresult) WillInterruptImpl(void);
   NS_HIDDEN_(nsresult) WillResumeImpl(void);
   NS_HIDDEN_(nsresult) DidProcessATokenImpl(void);
--- a/content/base/src/nsDOMBlobBuilder.h
+++ b/content/base/src/nsDOMBlobBuilder.h
@@ -46,32 +46,32 @@ public:
   }
 
   NS_DECL_ISUPPORTS_INHERITED
 
   // nsIJSNativeInitializer
   NS_IMETHOD Initialize(nsISupports* aOwner,
                         JSContext* aCx,
                         JSObject* aObj,
-                        const JS::CallArgs& aArgs);
+                        const JS::CallArgs& aArgs) MOZ_OVERRIDE;
 
   typedef nsIDOMBlob* (*UnwrapFuncPtr)(JSContext*, JSObject*);
   nsresult InitBlob(JSContext* aCx,
                     uint32_t aArgc,
                     JS::Value* aArgv,
                     UnwrapFuncPtr aUnwrapFunc);
   nsresult InitFile(JSContext* aCx,
                     uint32_t aArgc,
                     JS::Value* aArgv);
 
   already_AddRefed<nsIDOMBlob>
-  CreateSlice(uint64_t aStart, uint64_t aLength, const nsAString& aContentType);
+  CreateSlice(uint64_t aStart, uint64_t aLength, const nsAString& aContentType) MOZ_OVERRIDE;
 
-  NS_IMETHOD GetSize(uint64_t*);
-  NS_IMETHOD GetInternalStream(nsIInputStream**);
+  NS_IMETHOD GetSize(uint64_t*) MOZ_OVERRIDE;
+  NS_IMETHOD GetInternalStream(nsIInputStream**) MOZ_OVERRIDE;
 
   static nsresult
   NewFile(const nsAString& aName, nsISupports* *aNewObject);
 
   // DOMClassInfo constructor (for Blob([b1, "foo"], { type: "image/png" }))
   static nsresult
   NewBlob(nsISupports* *aNewObject);
 
@@ -81,17 +81,17 @@ public:
   NewFile(nsISupports* *aNewObject)
   {
     // Initialization will set the filename, so we can pass in an empty string
     // for now.
     return NewFile(EmptyString(), aNewObject);
   }
 
   virtual const nsTArray<nsCOMPtr<nsIDOMBlob> >*
-  GetSubBlobs() const { return &mBlobs; }
+  GetSubBlobs() const MOZ_OVERRIDE { return &mBlobs; }
 
 protected:
   nsTArray<nsCOMPtr<nsIDOMBlob> > mBlobs;
 };
 
 class BlobSet {
 public:
   BlobSet()
--- a/content/base/src/nsDOMDataChannel.h
+++ b/content/base/src/nsDOMDataChannel.h
@@ -2,16 +2,17 @@
 /* vim: set sw=2 ts=8 et tw=80 : */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsDOMDataChannel_h
 #define nsDOMDataChannel_h
 
+#include "mozilla/Attributes.h"
 #include "mozilla/dom/DataChannelBinding.h"
 #include "mozilla/dom/TypedArray.h"
 #include "mozilla/net/DataChannel.h"
 #include "nsDOMEventTargetHelper.h"
 #include "nsIDOMDataChannel.h"
 
 class nsDOMDataChannel : public nsDOMEventTargetHelper,
                          public nsIDOMDataChannel,
@@ -72,28 +73,28 @@ public:
   // Uses XPIDL GetProtocol.
   bool Ordered() const;
   uint16_t Stream() const;
 
   nsresult
   DoOnMessageAvailable(const nsACString& aMessage, bool aBinary);
 
   virtual nsresult
-  OnMessageAvailable(nsISupports* aContext, const nsACString& aMessage);
+  OnMessageAvailable(nsISupports* aContext, const nsACString& aMessage) MOZ_OVERRIDE;
 
   virtual nsresult
-  OnBinaryMessageAvailable(nsISupports* aContext, const nsACString& aMessage);
+  OnBinaryMessageAvailable(nsISupports* aContext, const nsACString& aMessage) MOZ_OVERRIDE;
 
   virtual nsresult OnSimpleEvent(nsISupports* aContext, const nsAString& aName);
 
   virtual nsresult
-  OnChannelConnected(nsISupports* aContext);
+  OnChannelConnected(nsISupports* aContext) MOZ_OVERRIDE;
 
   virtual nsresult
-  OnChannelClosed(nsISupports* aContext);
+  OnChannelClosed(nsISupports* aContext) MOZ_OVERRIDE;
 
   virtual void
   AppReady();
 
 private:
   void Send(nsIInputStream* aMsgStream, const nsACString& aMsgString,
             uint32_t aMsgLength, bool aIsBinary, mozilla::ErrorResult& aRv);
 
--- a/content/base/src/nsDOMFileReader.h
+++ b/content/base/src/nsDOMFileReader.h
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsDOMFileReader_h__
 #define nsDOMFileReader_h__
 
+#include "mozilla/Attributes.h"
 #include "nsISupportsUtils.h"      
 #include "nsString.h"
 #include "nsWeakReference.h"
 #include "nsIStreamListener.h"     
 #include "nsIInterfaceRequestor.h" 
 #include "nsJSUtils.h"             
 #include "nsTArray.h"              
 #include "nsIJSNativeInitializer.h"
@@ -45,20 +46,20 @@ public:
 
   // nsIInterfaceRequestor 
   NS_DECL_NSIINTERFACEREQUESTOR
 
   // FileIOObject overrides
   virtual void DoAbort(nsAString& aEvent) MOZ_OVERRIDE;
   NS_IMETHOD DoOnStopRequest(nsIRequest* aRequest, nsISupports* aContext,
                              nsresult aStatus, nsAString& aSuccessEvent,
-                             nsAString& aTerminationEvent);
+                             nsAString& aTerminationEvent) MOZ_OVERRIDE;
   NS_IMETHOD DoOnDataAvailable(nsIRequest* aRequest, nsISupports* aContext,
                                nsIInputStream* aInputStream, uint64_t aOffset,
-                               uint32_t aCount);
+                               uint32_t aCount) MOZ_OVERRIDE;
 
   nsPIDOMWindow* GetParentObject() const
   {
     return GetOwner();
   }
   virtual JSObject* WrapObject(JSContext* aCx,
                                JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
--- a/content/base/src/nsDOMMutationObserver.h
+++ b/content/base/src/nsDOMMutationObserver.h
@@ -2,16 +2,17 @@
 /* vim: set sw=4 ts=8 et tw=80 : */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsDOMMutationObserver_h
 #define nsDOMMutationObserver_h
 
+#include "mozilla/Attributes.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsPIDOMWindow.h"
 #include "nsIScriptContext.h"
 #include "nsStubMutationObserver.h"
 #include "nsCOMArray.h"
 #include "nsTArray.h"
 #include "nsAutoPtr.h"
 #include "nsIVariant.h"
@@ -323,17 +324,17 @@ public:
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
   NS_DECL_NSIMUTATIONOBSERVER_NODEWILLBEDESTROYED
 
   virtual void AttributeSetToCurrentValue(nsIDocument* aDocument,
                                           mozilla::dom::Element* aElement,
                                           int32_t aNameSpaceID,
-                                          nsIAtom* aAttribute)
+                                          nsIAtom* aAttribute) MOZ_OVERRIDE
   {
     // We can reuse AttributeWillChange implementation.
     AttributeWillChange(aDocument, aElement, aNameSpaceID, aAttribute,
                         nsIDOMMutationEvent::MODIFICATION);
   }
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsMutationReceiver, NS_MUTATION_OBSERVER_IID)
--- a/content/base/src/nsDOMTokenList.h
+++ b/content/base/src/nsDOMTokenList.h
@@ -7,23 +7,21 @@
  */
 
 #ifndef nsDOMTokenList_h___
 #define nsDOMTokenList_h___
 
 #include "nsCOMPtr.h"
 #include "nsDOMString.h"
 #include "nsWrapperCache.h"
+#include "mozilla/dom/Element.h"
 
 namespace mozilla {
 class ErrorResult;
 
-namespace dom {
-class Element;
-} // namespace dom
 } // namespace mozilla
 
 class nsAttrValue;
 class nsIAtom;
 
 // nsISupports must be on the primary inheritance chain
 // because nsDOMSettableTokenList is traversed by Element.
 class nsDOMTokenList : public nsISupports,
--- a/content/base/src/nsDocument.h
+++ b/content/base/src/nsDocument.h
@@ -511,266 +511,266 @@ class nsDocument : public nsIDocument,
 public:
   typedef mozilla::dom::Element Element;
   using nsIDocument::GetElementsByTagName;
 
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 
   NS_DECL_SIZEOF_EXCLUDING_THIS
 
-  virtual void Reset(nsIChannel *aChannel, nsILoadGroup *aLoadGroup);
+  virtual void Reset(nsIChannel *aChannel, nsILoadGroup *aLoadGroup) MOZ_OVERRIDE;
   virtual void ResetToURI(nsIURI *aURI, nsILoadGroup *aLoadGroup,
-                          nsIPrincipal* aPrincipal);
+                          nsIPrincipal* aPrincipal) MOZ_OVERRIDE;
 
   // StartDocumentLoad is pure virtual so that subclasses must override it.
   // The nsDocument StartDocumentLoad does some setup, but does NOT set
   // *aDocListener; this is the job of subclasses.
   virtual nsresult StartDocumentLoad(const char* aCommand,
                                      nsIChannel* aChannel,
                                      nsILoadGroup* aLoadGroup,
                                      nsISupports* aContainer,
                                      nsIStreamListener **aDocListener,
                                      bool aReset = true,
-                                     nsIContentSink* aContentSink = nullptr) = 0;
+                                     nsIContentSink* aContentSink = nullptr) MOZ_OVERRIDE = 0;
 
-  virtual void StopDocumentLoad();
+  virtual void StopDocumentLoad() MOZ_OVERRIDE;
 
-  virtual void NotifyPossibleTitleChange(bool aBoundTitleElement);
+  virtual void NotifyPossibleTitleChange(bool aBoundTitleElement) MOZ_OVERRIDE;
 
-  virtual void SetDocumentURI(nsIURI* aURI);
+  virtual void SetDocumentURI(nsIURI* aURI) MOZ_OVERRIDE;
 
   /**
    * Set the principal responsible for this document.
    */
-  virtual void SetPrincipal(nsIPrincipal *aPrincipal);
+  virtual void SetPrincipal(nsIPrincipal *aPrincipal) MOZ_OVERRIDE;
 
   /**
    * Get the Content-Type of this document.
    */
   // NS_IMETHOD GetContentType(nsAString& aContentType);
   // Already declared in nsIDOMDocument
 
   /**
    * Set the Content-Type of this document.
    */
-  virtual void SetContentType(const nsAString& aContentType);
+  virtual void SetContentType(const nsAString& aContentType) MOZ_OVERRIDE;
 
-  virtual nsresult SetBaseURI(nsIURI* aURI);
+  virtual nsresult SetBaseURI(nsIURI* aURI) MOZ_OVERRIDE;
 
   /**
    * Get/Set the base target of a link in a document.
    */
-  virtual void GetBaseTarget(nsAString &aBaseTarget);
+  virtual void GetBaseTarget(nsAString &aBaseTarget) MOZ_OVERRIDE;
 
   /**
    * Return a standard name for the document's character set. This will
    * trigger a startDocumentLoad if necessary to answer the question.
    */
-  virtual void SetDocumentCharacterSet(const nsACString& aCharSetID);
+  virtual void SetDocumentCharacterSet(const nsACString& aCharSetID) MOZ_OVERRIDE;
 
   /**
    * Add an observer that gets notified whenever the charset changes.
    */
-  virtual nsresult AddCharSetObserver(nsIObserver* aObserver);
+  virtual nsresult AddCharSetObserver(nsIObserver* aObserver) MOZ_OVERRIDE;
 
   /**
    * Remove a charset observer.
    */
-  virtual void RemoveCharSetObserver(nsIObserver* aObserver);
+  virtual void RemoveCharSetObserver(nsIObserver* aObserver) MOZ_OVERRIDE;
 
   virtual Element* AddIDTargetObserver(nsIAtom* aID, IDTargetObserver aObserver,
-                                       void* aData, bool aForImage);
+                                       void* aData, bool aForImage) MOZ_OVERRIDE;
   virtual void RemoveIDTargetObserver(nsIAtom* aID, IDTargetObserver aObserver,
-                                      void* aData, bool aForImage);
+                                      void* aData, bool aForImage) MOZ_OVERRIDE;
 
   /**
    * Access HTTP header data (this may also get set from other sources, like
    * HTML META tags).
    */
-  virtual void GetHeaderData(nsIAtom* aHeaderField, nsAString& aData) const;
+  virtual void GetHeaderData(nsIAtom* aHeaderField, nsAString& aData) const MOZ_OVERRIDE;
   virtual void SetHeaderData(nsIAtom* aheaderField,
-                             const nsAString& aData);
+                             const nsAString& aData) MOZ_OVERRIDE;
 
   /**
    * Create a new presentation shell that will use aContext for
    * its presentation context (presentation contexts <b>must not</b> be
    * shared among multiple presentation shells).
    */
   virtual already_AddRefed<nsIPresShell> CreateShell(nsPresContext* aContext,
                                                      nsViewManager* aViewManager,
                                                      nsStyleSet* aStyleSet) MOZ_OVERRIDE;
-  virtual void DeleteShell();
+  virtual void DeleteShell() MOZ_OVERRIDE;
 
-  virtual nsresult GetAllowPlugins(bool* aAllowPlugins);
+  virtual nsresult GetAllowPlugins(bool* aAllowPlugins) MOZ_OVERRIDE;
 
-  virtual already_AddRefed<mozilla::dom::UndoManager> GetUndoManager();
+  virtual already_AddRefed<mozilla::dom::UndoManager> GetUndoManager() MOZ_OVERRIDE;
 
   virtual nsresult SetSubDocumentFor(Element* aContent,
-                                     nsIDocument* aSubDoc);
-  virtual nsIDocument* GetSubDocumentFor(nsIContent* aContent) const;
-  virtual Element* FindContentForSubDocument(nsIDocument *aDocument) const;
-  virtual Element* GetRootElementInternal() const;
+                                     nsIDocument* aSubDoc) MOZ_OVERRIDE;
+  virtual nsIDocument* GetSubDocumentFor(nsIContent* aContent) const MOZ_OVERRIDE;
+  virtual Element* FindContentForSubDocument(nsIDocument *aDocument) const MOZ_OVERRIDE;
+  virtual Element* GetRootElementInternal() const MOZ_OVERRIDE;
 
   /**
    * Get the style sheets owned by this document.
    * These are ordered, highest priority last
    */
-  virtual int32_t GetNumberOfStyleSheets() const;
-  virtual nsIStyleSheet* GetStyleSheetAt(int32_t aIndex) const;
-  virtual int32_t GetIndexOfStyleSheet(nsIStyleSheet* aSheet) const;
-  virtual void AddStyleSheet(nsIStyleSheet* aSheet);
-  virtual void RemoveStyleSheet(nsIStyleSheet* aSheet);
+  virtual int32_t GetNumberOfStyleSheets() const MOZ_OVERRIDE;
+  virtual nsIStyleSheet* GetStyleSheetAt(int32_t aIndex) const MOZ_OVERRIDE;
+  virtual int32_t GetIndexOfStyleSheet(nsIStyleSheet* aSheet) const MOZ_OVERRIDE;
+  virtual void AddStyleSheet(nsIStyleSheet* aSheet) MOZ_OVERRIDE;
+  virtual void RemoveStyleSheet(nsIStyleSheet* aSheet) MOZ_OVERRIDE;
 
   virtual void UpdateStyleSheets(nsCOMArray<nsIStyleSheet>& aOldSheets,
-                                 nsCOMArray<nsIStyleSheet>& aNewSheets);
+                                 nsCOMArray<nsIStyleSheet>& aNewSheets) MOZ_OVERRIDE;
   virtual void AddStyleSheetToStyleSets(nsIStyleSheet* aSheet);
   virtual void RemoveStyleSheetFromStyleSets(nsIStyleSheet* aSheet);
 
-  virtual void InsertStyleSheetAt(nsIStyleSheet* aSheet, int32_t aIndex);
+  virtual void InsertStyleSheetAt(nsIStyleSheet* aSheet, int32_t aIndex) MOZ_OVERRIDE;
   virtual void SetStyleSheetApplicableState(nsIStyleSheet* aSheet,
-                                            bool aApplicable);
+                                            bool aApplicable) MOZ_OVERRIDE;
 
-  virtual int32_t GetNumberOfCatalogStyleSheets() const;
-  virtual nsIStyleSheet* GetCatalogStyleSheetAt(int32_t aIndex) const;
-  virtual void AddCatalogStyleSheet(nsCSSStyleSheet* aSheet);
-  virtual void EnsureCatalogStyleSheet(const char *aStyleSheetURI);
+  virtual int32_t GetNumberOfCatalogStyleSheets() const MOZ_OVERRIDE;
+  virtual nsIStyleSheet* GetCatalogStyleSheetAt(int32_t aIndex) const MOZ_OVERRIDE;
+  virtual void AddCatalogStyleSheet(nsCSSStyleSheet* aSheet) MOZ_OVERRIDE;
+  virtual void EnsureCatalogStyleSheet(const char *aStyleSheetURI) MOZ_OVERRIDE;
 
-  virtual nsresult LoadAdditionalStyleSheet(additionalSheetType aType, nsIURI* aSheetURI);
-  virtual void RemoveAdditionalStyleSheet(additionalSheetType aType, nsIURI* sheetURI);
-  virtual nsIStyleSheet* FirstAdditionalAuthorSheet();
+  virtual nsresult LoadAdditionalStyleSheet(additionalSheetType aType, nsIURI* aSheetURI) MOZ_OVERRIDE;
+  virtual void RemoveAdditionalStyleSheet(additionalSheetType aType, nsIURI* sheetURI) MOZ_OVERRIDE;
+  virtual nsIStyleSheet* FirstAdditionalAuthorSheet() MOZ_OVERRIDE;
 
-  virtual nsIChannel* GetChannel() const {
+  virtual nsIChannel* GetChannel() const MOZ_OVERRIDE {
     return mChannel;
   }
 
   /**
    * Get this document's inline style sheet.  May return null if there
    * isn't one
    */
-  virtual nsHTMLCSSStyleSheet* GetInlineStyleSheet() const {
+  virtual nsHTMLCSSStyleSheet* GetInlineStyleSheet() const MOZ_OVERRIDE {
     return mStyleAttrStyleSheet;
   }
   
   /**
    * Set the object from which a document can get a script context.
    * This is the context within which all scripts (during document
    * creation and during event handling) will run.
    */
-  virtual nsIScriptGlobalObject* GetScriptGlobalObject() const;
-  virtual void SetScriptGlobalObject(nsIScriptGlobalObject* aGlobalObject);
+  virtual nsIScriptGlobalObject* GetScriptGlobalObject() const MOZ_OVERRIDE;
+  virtual void SetScriptGlobalObject(nsIScriptGlobalObject* aGlobalObject) MOZ_OVERRIDE;
 
-  virtual void SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject);
+  virtual void SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject) MOZ_OVERRIDE;
 
-  virtual nsIGlobalObject* GetScopeObject() const;
-  void SetScopeObject(nsIGlobalObject* aGlobal);
+  virtual nsIGlobalObject* GetScopeObject() const MOZ_OVERRIDE;
+  void SetScopeObject(nsIGlobalObject* aGlobal) MOZ_OVERRIDE;
   /**
    * Get the script loader for this document
    */
-  virtual nsScriptLoader* ScriptLoader();
+  virtual nsScriptLoader* ScriptLoader() MOZ_OVERRIDE;
 
   /**
    * Add/Remove an element to the document's id and name hashes
    */
-  virtual void AddToIdTable(Element* aElement, nsIAtom* aId);
-  virtual void RemoveFromIdTable(Element* aElement, nsIAtom* aId);
-  virtual void AddToNameTable(Element* aElement, nsIAtom* aName);
-  virtual void RemoveFromNameTable(Element* aElement, nsIAtom* aName);
+  virtual void AddToIdTable(Element* aElement, nsIAtom* aId) MOZ_OVERRIDE;
+  virtual void RemoveFromIdTable(Element* aElement, nsIAtom* aId) MOZ_OVERRIDE;
+  virtual void AddToNameTable(Element* aElement, nsIAtom* aName) MOZ_OVERRIDE;
+  virtual void RemoveFromNameTable(Element* aElement, nsIAtom* aName) MOZ_OVERRIDE;
 
   /**
    * Add a new observer of document change notifications. Whenever
    * content is changed, appended, inserted or removed the observers are
    * informed.
    */
-  virtual void AddObserver(nsIDocumentObserver* aObserver);
+  virtual void AddObserver(nsIDocumentObserver* aObserver) MOZ_OVERRIDE;
 
   /**
    * Remove an observer of document change notifications. This will
    * return false if the observer cannot be found.
    */
-  virtual bool RemoveObserver(nsIDocumentObserver* aObserver);
+  virtual bool RemoveObserver(nsIDocumentObserver* aObserver) MOZ_OVERRIDE;
 
   // Observation hooks used to propagate notifications to document
   // observers.
-  virtual void BeginUpdate(nsUpdateType aUpdateType);
-  virtual void EndUpdate(nsUpdateType aUpdateType);
-  virtual void BeginLoad();
-  virtual void EndLoad();
+  virtual void BeginUpdate(nsUpdateType aUpdateType) MOZ_OVERRIDE;
+  virtual void EndUpdate(nsUpdateType aUpdateType) MOZ_OVERRIDE;
+  virtual void BeginLoad() MOZ_OVERRIDE;
+  virtual void EndLoad() MOZ_OVERRIDE;
 
-  virtual void SetReadyStateInternal(ReadyState rs);
+  virtual void SetReadyStateInternal(ReadyState rs) MOZ_OVERRIDE;
 
   virtual void ContentStateChanged(nsIContent* aContent,
-                                   nsEventStates aStateMask);
-  virtual void DocumentStatesChanged(nsEventStates aStateMask);
+                                   nsEventStates aStateMask) MOZ_OVERRIDE;
+  virtual void DocumentStatesChanged(nsEventStates aStateMask) MOZ_OVERRIDE;
 
   virtual void StyleRuleChanged(nsIStyleSheet* aStyleSheet,
                                 nsIStyleRule* aOldStyleRule,
-                                nsIStyleRule* aNewStyleRule);
+                                nsIStyleRule* aNewStyleRule) MOZ_OVERRIDE;
   virtual void StyleRuleAdded(nsIStyleSheet* aStyleSheet,
-                              nsIStyleRule* aStyleRule);
+                              nsIStyleRule* aStyleRule) MOZ_OVERRIDE;
   virtual void StyleRuleRemoved(nsIStyleSheet* aStyleSheet,
-                                nsIStyleRule* aStyleRule);
+                                nsIStyleRule* aStyleRule) MOZ_OVERRIDE;
 
-  virtual void FlushPendingNotifications(mozFlushType aType);
-  virtual void FlushExternalResources(mozFlushType aType);
+  virtual void FlushPendingNotifications(mozFlushType aType) MOZ_OVERRIDE;
+  virtual void FlushExternalResources(mozFlushType aType) MOZ_OVERRIDE;
   virtual void SetXMLDeclaration(const PRUnichar *aVersion,
                                  const PRUnichar *aEncoding,
-                                 const int32_t aStandalone);
+                                 const int32_t aStandalone) MOZ_OVERRIDE;
   virtual void GetXMLDeclaration(nsAString& aVersion,
                                  nsAString& aEncoding,
-                                 nsAString& Standalone);
-  virtual bool IsScriptEnabled();
+                                 nsAString& Standalone) MOZ_OVERRIDE;
+  virtual bool IsScriptEnabled() MOZ_OVERRIDE;
 
-  virtual void OnPageShow(bool aPersisted, mozilla::dom::EventTarget* aDispatchStartTarget);
-  virtual void OnPageHide(bool aPersisted, mozilla::dom::EventTarget* aDispatchStartTarget);
+  virtual void OnPageShow(bool aPersisted, mozilla::dom::EventTarget* aDispatchStartTarget) MOZ_OVERRIDE;
+  virtual void OnPageHide(bool aPersisted, mozilla::dom::EventTarget* aDispatchStartTarget) MOZ_OVERRIDE;
 
-  virtual void WillDispatchMutationEvent(nsINode* aTarget);
-  virtual void MutationEventDispatched(nsINode* aTarget);
+  virtual void WillDispatchMutationEvent(nsINode* aTarget) MOZ_OVERRIDE;
+  virtual void MutationEventDispatched(nsINode* aTarget) MOZ_OVERRIDE;
 
   // nsINode
-  virtual bool IsNodeOfType(uint32_t aFlags) const;
-  virtual nsIContent *GetChildAt(uint32_t aIndex) const;
-  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const;
+  virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
+  virtual nsIContent *GetChildAt(uint32_t aIndex) const MOZ_OVERRIDE;
+  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const MOZ_OVERRIDE;
   virtual int32_t IndexOf(const nsINode* aPossibleChild) const MOZ_OVERRIDE;
-  virtual uint32_t GetChildCount() const;
+  virtual uint32_t GetChildCount() const MOZ_OVERRIDE;
   virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
-                                 bool aNotify);
+                                 bool aNotify) MOZ_OVERRIDE;
   virtual nsresult AppendChildTo(nsIContent* aKid, bool aNotify);
-  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify);
-  virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const
+  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) MOZ_OVERRIDE;
+  virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE
   {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
   // nsIRadioGroupContainer
   NS_IMETHOD WalkRadioGroup(const nsAString& aName,
                             nsIRadioVisitor* aVisitor,
-                            bool aFlushContent);
+                            bool aFlushContent) MOZ_OVERRIDE;
   virtual void SetCurrentRadioButton(const nsAString& aName,
-                                     nsIDOMHTMLInputElement* aRadio);
-  virtual nsIDOMHTMLInputElement* GetCurrentRadioButton(const nsAString& aName);
+                                     nsIDOMHTMLInputElement* aRadio) MOZ_OVERRIDE;
+  virtual nsIDOMHTMLInputElement* GetCurrentRadioButton(const nsAString& aName) MOZ_OVERRIDE;
   NS_IMETHOD GetNextRadioButton(const nsAString& aName,
                                 const bool aPrevious,
                                 nsIDOMHTMLInputElement*  aFocusedRadio,
-                                nsIDOMHTMLInputElement** aRadioOut);
+                                nsIDOMHTMLInputElement** aRadioOut) MOZ_OVERRIDE;
   virtual void AddToRadioGroup(const nsAString& aName,
-                               nsIFormControl* aRadio);
+                               nsIFormControl* aRadio) MOZ_OVERRIDE;
   virtual void RemoveFromRadioGroup(const nsAString& aName,
-                                    nsIFormControl* aRadio);
-  virtual uint32_t GetRequiredRadioCount(const nsAString& aName) const;
+                                    nsIFormControl* aRadio) MOZ_OVERRIDE;
+  virtual uint32_t GetRequiredRadioCount(const nsAString& aName) const MOZ_OVERRIDE;
   virtual void RadioRequiredChanged(const nsAString& aName,
-                                    nsIFormControl* aRadio);
-  virtual bool GetValueMissingState(const nsAString& aName) const;
-  virtual void SetValueMissingState(const nsAString& aName, bool aValue);
+                                    nsIFormControl* aRadio) MOZ_OVERRIDE;
+  virtual bool GetValueMissingState(const nsAString& aName) const MOZ_OVERRIDE;
+  virtual void SetValueMissingState(const nsAString& aName, bool aValue) MOZ_OVERRIDE;
 
   // for radio group
   nsRadioGroupStruct* GetRadioGroup(const nsAString& aName) const;
   nsRadioGroupStruct* GetOrCreateRadioGroup(const nsAString& aName);
 
   virtual nsViewportInfo GetViewportInfo(uint32_t aDisplayWidth,
-                                         uint32_t aDisplayHeight);
+                                         uint32_t aDisplayHeight) MOZ_OVERRIDE;
 
 
 private:
   nsRadioGroupStruct* GetRadioGroupInternal(const nsAString& aName) const;
 
 public:
   // nsIDOMNode
   NS_FORWARD_NSIDOMNODE_TO_NSINODE_OVERRIDABLE
@@ -780,22 +780,22 @@ public:
 
   // nsIDOMXMLDocument
   NS_DECL_NSIDOMXMLDOCUMENT
 
   // nsIDOMDocumentXBL
   NS_DECL_NSIDOMDOCUMENTXBL
 
   // nsIDOMEventTarget
-  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
+  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor) MOZ_OVERRIDE;
   virtual nsEventListenerManager*
-    GetListenerManager(bool aCreateIfNotFound);
+    GetListenerManager(bool aCreateIfNotFound) MOZ_OVERRIDE;
 
   // nsIScriptObjectPrincipal
-  virtual nsIPrincipal* GetPrincipal();
+  virtual nsIPrincipal* GetPrincipal() MOZ_OVERRIDE;
 
   // nsIApplicationCacheContainer
   NS_DECL_NSIAPPLICATIONCACHECONTAINER
 
   // nsITouchEventReceiver
   NS_DECL_NSITOUCHEVENTRECEIVER
 
   // nsIDOMDocumentTouch
@@ -809,17 +809,17 @@ public:
 
   // nsIObserver
   NS_DECL_NSIOBSERVER
 
   virtual nsresult Init();
 
   virtual nsresult CreateElem(const nsAString& aName, nsIAtom *aPrefix,
                               int32_t aNamespaceID,
-                              nsIContent **aResult);
+                              nsIContent **aResult) MOZ_OVERRIDE;
 
   virtual NS_HIDDEN_(void) Sanitize();
 
   virtual NS_HIDDEN_(void) EnumerateSubDocuments(nsSubDocEnumFunc aCallback,
                                                  void *aData);
 
   virtual NS_HIDDEN_(bool) CanSavePresentation(nsIRequest *aNewRequest);
   virtual NS_HIDDEN_(void) Destroy();
@@ -829,17 +829,17 @@ public:
   virtual NS_HIDDEN_(void) BlockOnload();
   virtual NS_HIDDEN_(void) UnblockOnload(bool aFireSync);
 
   virtual NS_HIDDEN_(void) AddStyleRelevantLink(mozilla::dom::Link* aLink);
   virtual NS_HIDDEN_(void) ForgetLink(mozilla::dom::Link* aLink);
 
   NS_HIDDEN_(void) ClearBoxObjectFor(nsIContent* aContent);
   already_AddRefed<nsIBoxObject> GetBoxObjectFor(mozilla::dom::Element* aElement,
-                                                 mozilla::ErrorResult& aRv);
+                                                 mozilla::ErrorResult& aRv) MOZ_OVERRIDE;
 
   virtual NS_HIDDEN_(nsresult) GetXBLChildNodesFor(nsIContent* aContent,
                                                    nsIDOMNodeList** aResult);
   virtual NS_HIDDEN_(nsresult) GetContentListFor(nsIContent* aContent,
                                                  nsIDOMNodeList** aResult);
   virtual NS_HIDDEN_(Element*)
     GetAnonymousElementByAttribute(nsIContent* aElement,
                                    nsIAtom* aAttrName,
@@ -868,30 +868,30 @@ public:
                             ExternalResourceLoad** aPendingLoad);
   virtual NS_HIDDEN_(void)
     EnumerateExternalResources(nsSubDocEnumFunc aCallback, void* aData);
 
   nsTArray<nsCString> mHostObjectURIs;
 
   // Returns our (lazily-initialized) animation controller.
   // If HasAnimationController is true, this is guaranteed to return non-null.
-  nsSMILAnimationController* GetAnimationController();
+  nsSMILAnimationController* GetAnimationController() MOZ_OVERRIDE;
 
-  void SetImagesNeedAnimating(bool aAnimating);
+  void SetImagesNeedAnimating(bool aAnimating) MOZ_OVERRIDE;
 
-  virtual void SuppressEventHandling(uint32_t aIncrease);
+  virtual void SuppressEventHandling(uint32_t aIncrease) MOZ_OVERRIDE;
 
-  virtual void UnsuppressEventHandlingAndFireEvents(bool aFireEvents);
+  virtual void UnsuppressEventHandlingAndFireEvents(bool aFireEvents) MOZ_OVERRIDE;
   
   void DecreaseEventSuppression() {
     --mEventsSuppressed;
     MaybeRescheduleAnimationFrameNotifications();
   }
 
-  virtual nsIDocument* GetTemplateContentsOwner();
+  virtual nsIDocument* GetTemplateContentsOwner() MOZ_OVERRIDE;
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsDocument,
                                                                    nsIDocument)
 
   void DoNotifyPossibleTitleChange();
 
   nsExternalResourceMap& ExternalResourceMap()
   {
@@ -906,86 +906,86 @@ public:
 
   nsresult CloneDocHelper(nsDocument* clone) const;
 
   void MaybeInitializeFinalizeFrameLoaders();
 
   void MaybeEndOutermostXBLUpdate();
 
   virtual void MaybePreLoadImage(nsIURI* uri,
-                                 const nsAString &aCrossOriginAttr);
+                                 const nsAString &aCrossOriginAttr) MOZ_OVERRIDE;
 
   virtual void PreloadStyle(nsIURI* uri, const nsAString& charset,
-                            const nsAString& aCrossOriginAttr);
+                            const nsAString& aCrossOriginAttr) MOZ_OVERRIDE;
 
   virtual nsresult LoadChromeSheetSync(nsIURI* uri, bool isAgentSheet,
-                                       nsCSSStyleSheet** sheet);
+                                       nsCSSStyleSheet** sheet) MOZ_OVERRIDE;
 
-  virtual nsISupports* GetCurrentContentSink();
+  virtual nsISupports* GetCurrentContentSink() MOZ_OVERRIDE;
 
-  virtual nsEventStates GetDocumentState();
+  virtual nsEventStates GetDocumentState() MOZ_OVERRIDE;
 
-  virtual void RegisterHostObjectUri(const nsACString& aUri);
-  virtual void UnregisterHostObjectUri(const nsACString& aUri);
+  virtual void RegisterHostObjectUri(const nsACString& aUri) MOZ_OVERRIDE;
+  virtual void UnregisterHostObjectUri(const nsACString& aUri) MOZ_OVERRIDE;
 
   // Only BlockOnload should call this!
   void AsyncBlockOnload();
 
-  virtual void SetScrollToRef(nsIURI *aDocumentURI);
-  virtual void ScrollToRef();
-  virtual void ResetScrolledToRefAlready();
-  virtual void SetChangeScrollPosWhenScrollingToRef(bool aValue);
+  virtual void SetScrollToRef(nsIURI *aDocumentURI) MOZ_OVERRIDE;
+  virtual void ScrollToRef() MOZ_OVERRIDE;
+  virtual void ResetScrolledToRefAlready() MOZ_OVERRIDE;
+  virtual void SetChangeScrollPosWhenScrollingToRef(bool aValue) MOZ_OVERRIDE;
 
-  virtual Element *GetElementById(const nsAString& aElementId);
-  virtual const nsSmallVoidArray* GetAllElementsForId(const nsAString& aElementId) const;
+  virtual Element *GetElementById(const nsAString& aElementId) MOZ_OVERRIDE;
+  virtual const nsSmallVoidArray* GetAllElementsForId(const nsAString& aElementId) const MOZ_OVERRIDE;
 
-  virtual Element *LookupImageElement(const nsAString& aElementId);
+  virtual Element *LookupImageElement(const nsAString& aElementId) MOZ_OVERRIDE;
   virtual void MozSetImageElement(const nsAString& aImageElementId,
-                                  Element* aElement);
+                                  Element* aElement) MOZ_OVERRIDE;
 
   virtual NS_HIDDEN_(nsresult) AddImage(imgIRequest* aImage);
   virtual NS_HIDDEN_(nsresult) RemoveImage(imgIRequest* aImage, uint32_t aFlags);
   virtual NS_HIDDEN_(nsresult) SetImageLockingState(bool aLocked);
 
   // AddPlugin adds a plugin-related element to mPlugins when the element is
   // added to the tree.
-  virtual nsresult AddPlugin(nsIObjectLoadingContent* aPlugin);
+  virtual nsresult AddPlugin(nsIObjectLoadingContent* aPlugin) MOZ_OVERRIDE;
   // RemovePlugin removes a plugin-related element to mPlugins when the
   // element is removed from the tree.
-  virtual void RemovePlugin(nsIObjectLoadingContent* aPlugin);
+  virtual void RemovePlugin(nsIObjectLoadingContent* aPlugin) MOZ_OVERRIDE;
   // GetPlugins returns the plugin-related elements from
   // the frame and any subframes.
-  virtual void GetPlugins(nsTArray<nsIObjectLoadingContent*>& aPlugins);
+  virtual void GetPlugins(nsTArray<nsIObjectLoadingContent*>& aPlugins) MOZ_OVERRIDE;
 
-  virtual nsresult GetStateObject(nsIVariant** aResult);
+  virtual nsresult GetStateObject(nsIVariant** aResult) MOZ_OVERRIDE;
 
-  virtual nsDOMNavigationTiming* GetNavigationTiming() const;
-  virtual nsresult SetNavigationTiming(nsDOMNavigationTiming* aTiming);
+  virtual nsDOMNavigationTiming* GetNavigationTiming() const MOZ_OVERRIDE;
+  virtual nsresult SetNavigationTiming(nsDOMNavigationTiming* aTiming) MOZ_OVERRIDE;
 
-  virtual Element* FindImageMap(const nsAString& aNormalizedMapName);
+  virtual Element* FindImageMap(const nsAString& aNormalizedMapName) MOZ_OVERRIDE;
 
-  virtual void NotifyAudioAvailableListener();
+  virtual void NotifyAudioAvailableListener() MOZ_OVERRIDE;
 
-  bool HasAudioAvailableListeners()
+  bool HasAudioAvailableListeners() MOZ_OVERRIDE
   {
     return mHasAudioAvailableListener;
   }
 
-  virtual Element* GetFullScreenElement();
-  virtual void AsyncRequestFullScreen(Element* aElement);
-  virtual void RestorePreviousFullScreenState();
-  virtual bool IsFullscreenLeaf();
-  virtual bool IsFullScreenDoc();
-  virtual void SetApprovedForFullscreen(bool aIsApproved);
+  virtual Element* GetFullScreenElement() MOZ_OVERRIDE;
+  virtual void AsyncRequestFullScreen(Element* aElement) MOZ_OVERRIDE;
+  virtual void RestorePreviousFullScreenState() MOZ_OVERRIDE;
+  virtual bool IsFullscreenLeaf() MOZ_OVERRIDE;
+  virtual bool IsFullScreenDoc() MOZ_OVERRIDE;
+  virtual void SetApprovedForFullscreen(bool aIsApproved) MOZ_OVERRIDE;
   virtual nsresult RemoteFrameFullscreenChanged(nsIDOMElement* aFrameElement,
-                                                const nsAString& aNewOrigin);
+                                                const nsAString& aNewOrigin) MOZ_OVERRIDE;
 
-  virtual nsresult RemoteFrameFullscreenReverted();
-  virtual nsIDocument* GetFullscreenRoot();
-  virtual void SetFullscreenRoot(nsIDocument* aRoot);
+  virtual nsresult RemoteFrameFullscreenReverted() MOZ_OVERRIDE;
+  virtual nsIDocument* GetFullscreenRoot() MOZ_OVERRIDE;
+  virtual void SetFullscreenRoot(nsIDocument* aRoot) MOZ_OVERRIDE;
 
   static void ExitFullscreen(nsIDocument* aDoc);
 
   // This is called asynchronously by nsIDocument::AsyncRequestFullScreen()
   // to move this document into full-screen mode if allowed. aWasCallerChrome
   // should be true when nsIDocument::AsyncRequestFullScreen() was called
   // by chrome code. aNotifyOnOriginChange denotes whether we should send a
   // fullscreen-origin-change notification if requesting fullscreen in this
@@ -1018,55 +1018,55 @@ public:
   // styles from the former top element, and applies them to the new top
   // element, if there is one.
   void FullScreenStackPop();
 
   // Returns the top element from the full-screen stack.
   Element* FullScreenStackTop();
 
   // DOM-exposed fullscreen API
-  virtual bool MozFullScreenEnabled();
-  virtual Element* GetMozFullScreenElement(mozilla::ErrorResult& rv);
+  virtual bool MozFullScreenEnabled() MOZ_OVERRIDE;
+  virtual Element* GetMozFullScreenElement(mozilla::ErrorResult& rv) MOZ_OVERRIDE;
 
-  void RequestPointerLock(Element* aElement);
+  void RequestPointerLock(Element* aElement) MOZ_OVERRIDE;
   bool ShouldLockPointer(Element* aElement, Element* aCurrentLock,
                          bool aNoFocusCheck = false);
   bool SetPointerLock(Element* aElement, int aCursorStyle);
   static void UnlockPointer(nsIDocument* aDoc = nullptr);
 
   // This method may fire a DOM event; if it does so it will happen
   // synchronously.
   void UpdateVisibilityState();
   // Posts an event to call UpdateVisibilityState
-  virtual void PostVisibilityUpdateEvent();
+  virtual void PostVisibilityUpdateEvent() MOZ_OVERRIDE;
 
-  virtual void DocSizeOfExcludingThis(nsWindowSizes* aWindowSizes) const;
+  virtual void DocSizeOfExcludingThis(nsWindowSizes* aWindowSizes) const MOZ_OVERRIDE;
   // DocSizeOfIncludingThis is inherited from nsIDocument.
 
-  virtual nsIDOMNode* AsDOMNode() { return this; }
+  virtual nsIDOMNode* AsDOMNode() MOZ_OVERRIDE { return this; }
 
   void GetCustomPrototype(const nsAString& aElementName, JS::MutableHandle<JSObject*> prototype)
   {
     mCustomPrototypes.Get(aElementName, prototype.address());
   }
 
   static bool RegisterEnabled();
 
   // WebIDL bits
   virtual mozilla::dom::DOMImplementation*
-    GetImplementation(mozilla::ErrorResult& rv);
+    GetImplementation(mozilla::ErrorResult& rv) MOZ_OVERRIDE;
   virtual JSObject*
   Register(JSContext* aCx, const nsAString& aName,
            const mozilla::dom::ElementRegistrationOptions& aOptions,
-           mozilla::ErrorResult& rv);
-  virtual nsIDOMStyleSheetList* StyleSheets();
-  virtual void SetSelectedStyleSheetSet(const nsAString& aSheetSet);
-  virtual void GetLastStyleSheetSet(nsString& aSheetSet);
-  virtual nsIDOMDOMStringList* StyleSheetSets();
-  virtual void EnableStyleSheetsForSet(const nsAString& aSheetSet);
+           mozilla::ErrorResult& rv) MOZ_OVERRIDE;
+  virtual nsIDOMStyleSheetList* StyleSheets() MOZ_OVERRIDE;
+  virtual void SetSelectedStyleSheetSet(const nsAString& aSheetSet) MOZ_OVERRIDE;
+  virtual void GetLastStyleSheetSet(nsString& aSheetSet) MOZ_OVERRIDE;
+  virtual nsIDOMDOMStringList* StyleSheetSets() MOZ_OVERRIDE;
+  virtual void EnableStyleSheetsForSet(const nsAString& aSheetSet) MOZ_OVERRIDE;
 
 protected:
   friend class nsNodeUtils;
   friend class nsDocumentOnStack;
 
   void IncreaseStackRefCnt()
   {
     ++mStackRefCnt;
@@ -1128,19 +1128,19 @@ protected:
   // return null if there isn't one
   nsIContent* GetTitleContent(uint32_t aNodeType);
   // Find the first "title" element in the given IsNodeOfType type and
   // append the concatenation of its text node children to aTitle. Do
   // nothing if there is no such element.
   void GetTitleFromElement(uint32_t aNodeType, nsAString& aTitle);
 public:
   // Get our title
-  virtual void GetTitle(nsString& aTitle);
+  virtual void GetTitle(nsString& aTitle) MOZ_OVERRIDE;
   // Set our title
-  virtual void SetTitle(const nsAString& aTitle, mozilla::ErrorResult& rv);
+  virtual void SetTitle(const nsAString& aTitle, mozilla::ErrorResult& rv) MOZ_OVERRIDE;
 
   static void XPCOMShutdown();
 
   js::ExpandoAndGeneration mExpandoAndGeneration;
 
 protected:
   already_AddRefed<nsIPresShell> doCreateShell(nsPresContext* aContext,
                                                nsViewManager* aViewManager,
@@ -1155,19 +1155,19 @@ protected:
 
   // Return whether all the presshells for this document are safe to flush
   bool IsSafeToFlush() const;
 
   void DispatchPageTransition(mozilla::dom::EventTarget* aDispatchTarget,
                               const nsAString& aType,
                               bool aPersisted);
 
-  virtual nsPIDOMWindow *GetWindowInternal() const;
-  virtual nsIScriptGlobalObject* GetScriptHandlingObjectInternal() const;
-  virtual bool InternalAllowXULXBL();
+  virtual nsPIDOMWindow *GetWindowInternal() const MOZ_OVERRIDE;
+  virtual nsIScriptGlobalObject* GetScriptHandlingObjectInternal() const MOZ_OVERRIDE;
+  virtual bool InternalAllowXULXBL() MOZ_OVERRIDE;
 
 #define NS_DOCUMENT_NOTIFY_OBSERVERS(func_, params_)                        \
   NS_OBSERVER_ARRAY_NOTIFY_XPCOM_OBSERVERS(mObservers, nsIDocumentObserver, \
                                            func_, params_);
 
 #ifdef DEBUG
   void VerifyRootContentState();
 #endif
--- a/content/base/src/nsFormData.h
+++ b/content/base/src/nsFormData.h
@@ -1,15 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsFormData_h__
 #define nsFormData_h__
 
+#include "mozilla/Attributes.h"
 #include "nsIDOMFormData.h"
 #include "nsIXMLHttpRequest.h"
 #include "nsFormSubmission.h"
 #include "nsWrapperCache.h"
 #include "nsTArray.h"
 #include "mozilla/ErrorResult.h"
 #include "mozilla/dom/BindingDeclarations.h"
 
@@ -54,29 +55,29 @@ public:
               const mozilla::dom::Optional<nsHTMLFormElement*>& aFormElement,
               mozilla::ErrorResult& aRv);
   void Append(const nsAString& aName, const nsAString& aValue);
   void Append(const nsAString& aName, nsIDOMBlob* aBlob,
               const mozilla::dom::Optional<nsAString>& aFilename);
 
   // nsFormSubmission
   virtual nsresult GetEncodedSubmission(nsIURI* aURI,
-                                        nsIInputStream** aPostDataStream);
+                                        nsIInputStream** aPostDataStream) MOZ_OVERRIDE;
   virtual nsresult AddNameValuePair(const nsAString& aName,
-                                    const nsAString& aValue)
+                                    const nsAString& aValue) MOZ_OVERRIDE
   {
     FormDataTuple* data = mFormData.AppendElement();
     data->name = aName;
     data->stringValue = aValue;
     data->valueIsFile = false;
     return NS_OK;
   }
   virtual nsresult AddNameFilePair(const nsAString& aName,
                                    nsIDOMBlob* aBlob,
-                                   const nsString& aFilename)
+                                   const nsString& aFilename) MOZ_OVERRIDE
   {
     FormDataTuple* data = mFormData.AppendElement();
     data->name = aName;
     data->fileValue = aBlob;
     data->filename = aFilename;
     data->valueIsFile = true;
     return NS_OK;
   }
--- a/content/base/src/nsFrameLoader.h
+++ b/content/base/src/nsFrameLoader.h
@@ -180,22 +180,22 @@ public:
   void Finalize();
   nsIDocShell* GetExistingDocShell() { return mDocShell; }
   mozilla::dom::EventTarget* GetTabChildGlobalAsEventTarget();
   nsresult CreateStaticClone(nsIFrameLoader* aDest);
 
   /**
    * MessageManagerCallback methods that we override.
    */
-  virtual bool DoLoadFrameScript(const nsAString& aURL);
+  virtual bool DoLoadFrameScript(const nsAString& aURL) MOZ_OVERRIDE;
   virtual bool DoSendAsyncMessage(const nsAString& aMessage,
-                                  const mozilla::dom::StructuredCloneData& aData);
-  virtual bool CheckPermission(const nsAString& aPermission);
-  virtual bool CheckManifestURL(const nsAString& aManifestURL);
-  virtual bool CheckAppHasPermission(const nsAString& aPermission);
+                                  const mozilla::dom::StructuredCloneData& aData) MOZ_OVERRIDE;
+  virtual bool CheckPermission(const nsAString& aPermission) MOZ_OVERRIDE;
+  virtual bool CheckManifestURL(const nsAString& aManifestURL) MOZ_OVERRIDE;
+  virtual bool CheckAppHasPermission(const nsAString& aPermission) MOZ_OVERRIDE;
 
   /**
    * Called from the layout frame associated with this frame loader;
    * this notifies us to hook up with the widget and view.
    */
   bool Show(int32_t marginWidth, int32_t marginHeight,
               int32_t scrollbarPrefX, int32_t scrollbarPrefY,
               nsSubDocumentFrame* frame);
--- a/content/base/src/nsFrameMessageManager.cpp
+++ b/content/base/src/nsFrameMessageManager.cpp
@@ -333,23 +333,24 @@ GetParamsForMessage(JSContext* aCx,
   }
   JS_ClearPendingException(aCx);
 
   // Not clonable, try JSON
   //XXX This is ugly but currently structured cloning doesn't handle
   //    properly cases when interface is implemented in JS and used
   //    as a dictionary.
   nsAutoString json;
-  JS::Value v = aObject;
-  NS_ENSURE_TRUE(JS_Stringify(aCx, &v, nullptr, JSVAL_NULL, JSONCreator, &json), false);
+  JS::Rooted<JS::Value> v(aCx, aObject);
+  NS_ENSURE_TRUE(JS_Stringify(aCx, v.address(), nullptr, JSVAL_NULL,
+                              JSONCreator, &json), false);
   NS_ENSURE_TRUE(!json.IsEmpty(), false);
 
   JS::Rooted<JS::Value> val(aCx, JS::NullValue());
   NS_ENSURE_TRUE(JS_ParseJSON(aCx, static_cast<const jschar*>(json.get()),
-                              json.Length(), val.address()), false);
+                              json.Length(), &val), false);
 
   return WriteStructuredClone(aCx, val, aBuffer, aClosure);
 }
 
 
 // nsISyncMessageSender
 
 NS_IMETHODIMP
@@ -383,17 +384,17 @@ nsFrameMessageManager::SendSyncMessage(c
 
     for (uint32_t i = 0; i < len; ++i) {
       if (retval[i].IsEmpty()) {
         continue;
       }
 
       JS::Rooted<JS::Value> ret(aCx);
       if (!JS_ParseJSON(aCx, static_cast<const jschar*>(retval[i].get()),
-                        retval[i].Length(), ret.address())) {
+                        retval[i].Length(), &ret)) {
         return NS_ERROR_UNEXPECTED;
       }
       NS_ENSURE_TRUE(JS_SetElement(aCx, dataArray, i, ret.address()),
                      NS_ERROR_OUT_OF_MEMORY);
     }
 
     *aRetval = OBJECT_TO_JSVAL(dataArray);
   }
--- a/content/base/src/nsGenericDOMDataNode.h
+++ b/content/base/src/nsGenericDOMDataNode.h
@@ -6,16 +6,17 @@
 /*
  * Base class for DOM Core's nsIDOMComment, nsIDOMDocumentType, nsIDOMText,
  * nsIDOMCDATASection, and nsIDOMProcessingInstruction nodes.
  */
 
 #ifndef nsGenericDOMDataNode_h___
 #define nsGenericDOMDataNode_h___
 
+#include "mozilla/Attributes.h"
 #include "nsIContent.h"
 
 #include "nsTextFragment.h"
 #include "nsError.h"
 #include "nsEventListenerManager.h"
 #include "mozilla/dom/Element.h"
 #include "nsCycleCollectionParticipant.h"
 
@@ -53,110 +54,110 @@ class nsGenericDOMDataNode : public nsIC
 public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 
   NS_DECL_SIZEOF_EXCLUDING_THIS
 
   nsGenericDOMDataNode(already_AddRefed<nsINodeInfo> aNodeInfo);
   virtual ~nsGenericDOMDataNode();
 
-  virtual void GetNodeValueInternal(nsAString& aNodeValue);
+  virtual void GetNodeValueInternal(nsAString& aNodeValue) MOZ_OVERRIDE;
   virtual void SetNodeValueInternal(const nsAString& aNodeValue,
-                                    mozilla::ErrorResult& aError);
+                                    mozilla::ErrorResult& aError) MOZ_OVERRIDE;
 
   // Implementation for nsIDOMCharacterData
   nsresult GetData(nsAString& aData) const;
   nsresult SetData(const nsAString& aData);
   nsresult GetLength(uint32_t* aLength);
   nsresult SubstringData(uint32_t aOffset, uint32_t aCount,
                          nsAString& aReturn);
   nsresult AppendData(const nsAString& aArg);
   nsresult InsertData(uint32_t aOffset, const nsAString& aArg);
   nsresult DeleteData(uint32_t aOffset, uint32_t aCount);
   nsresult ReplaceData(uint32_t aOffset, uint32_t aCount,
                        const nsAString& aArg);
   NS_IMETHOD MozRemove();
 
   // nsINode methods
-  virtual uint32_t GetChildCount() const;
-  virtual nsIContent *GetChildAt(uint32_t aIndex) const;
-  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const;
-  virtual int32_t IndexOf(const nsINode* aPossibleChild) const;
+  virtual uint32_t GetChildCount() const MOZ_OVERRIDE;
+  virtual nsIContent *GetChildAt(uint32_t aIndex) const MOZ_OVERRIDE;
+  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const MOZ_OVERRIDE;
+  virtual int32_t IndexOf(const nsINode* aPossibleChild) const MOZ_OVERRIDE;
   virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
-                                 bool aNotify);
-  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify);
-  virtual void GetTextContentInternal(nsAString& aTextContent)
+                                 bool aNotify) MOZ_OVERRIDE;
+  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) MOZ_OVERRIDE;
+  virtual void GetTextContentInternal(nsAString& aTextContent) MOZ_OVERRIDE
   {
     GetNodeValue(aTextContent);
   }
   virtual void SetTextContentInternal(const nsAString& aTextContent,
-                                      mozilla::ErrorResult& aError)
+                                      mozilla::ErrorResult& aError) MOZ_OVERRIDE
   {
     // Batch possible DOMSubtreeModified events.
     mozAutoSubtreeModified subtree(OwnerDoc(), nullptr);
     return SetNodeValue(aTextContent, aError);
   }
 
   // Implementation for nsIContent
   virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                               nsIContent* aBindingParent,
-                              bool aCompileEventHandlers);
+                              bool aCompileEventHandlers) MOZ_OVERRIDE;
   virtual void UnbindFromTree(bool aDeep = true,
-                              bool aNullParent = true);
+                              bool aNullParent = true) MOZ_OVERRIDE;
 
-  virtual already_AddRefed<nsINodeList> GetChildren(uint32_t aFilter);
+  virtual already_AddRefed<nsINodeList> GetChildren(uint32_t aFilter) MOZ_OVERRIDE;
 
-  virtual nsIAtom *GetIDAttributeName() const;
-  virtual already_AddRefed<nsINodeInfo> GetExistingAttrNameFromQName(const nsAString& aStr) const;
+  virtual nsIAtom *GetIDAttributeName() const MOZ_OVERRIDE;
+  virtual already_AddRefed<nsINodeInfo> GetExistingAttrNameFromQName(const nsAString& aStr) const MOZ_OVERRIDE;
   nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                    const nsAString& aValue, bool aNotify)
   {
     return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify);
   }
   virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
                            nsIAtom* aPrefix, const nsAString& aValue,
-                           bool aNotify);
+                           bool aNotify) MOZ_OVERRIDE;
   virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
-                             bool aNotify);
-  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const;
-  virtual uint32_t GetAttrCount() const;
-  virtual const nsTextFragment *GetText();
-  virtual uint32_t TextLength() const;
+                             bool aNotify) MOZ_OVERRIDE;
+  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const MOZ_OVERRIDE;
+  virtual uint32_t GetAttrCount() const MOZ_OVERRIDE;
+  virtual const nsTextFragment *GetText() MOZ_OVERRIDE;
+  virtual uint32_t TextLength() const MOZ_OVERRIDE;
   virtual nsresult SetText(const PRUnichar* aBuffer, uint32_t aLength,
-                           bool aNotify);
+                           bool aNotify) MOZ_OVERRIDE;
   // Need to implement this here too to avoid hiding.
   nsresult SetText(const nsAString& aStr, bool aNotify)
   {
     return SetText(aStr.BeginReading(), aStr.Length(), aNotify);
   }
   virtual nsresult AppendText(const PRUnichar* aBuffer, uint32_t aLength,
-                              bool aNotify);
-  virtual bool TextIsOnlyWhitespace();
-  virtual void AppendTextTo(nsAString& aResult);
-  virtual void DestroyContent();
-  virtual void SaveSubtreeState();
+                              bool aNotify) MOZ_OVERRIDE;
+  virtual bool TextIsOnlyWhitespace() MOZ_OVERRIDE;
+  virtual void AppendTextTo(nsAString& aResult) MOZ_OVERRIDE;
+  virtual void DestroyContent() MOZ_OVERRIDE;
+  virtual void SaveSubtreeState() MOZ_OVERRIDE;
 
 #ifdef DEBUG
-  virtual void List(FILE* out, int32_t aIndent) const;
-  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const;
+  virtual void List(FILE* out, int32_t aIndent) const MOZ_OVERRIDE;
+  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const MOZ_OVERRIDE;
 #endif
 
-  virtual nsIContent *GetBindingParent() const;
-  virtual bool IsNodeOfType(uint32_t aFlags) const;
-  virtual bool IsLink(nsIURI** aURI) const;
+  virtual nsIContent *GetBindingParent() const MOZ_OVERRIDE;
+  virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
+  virtual bool IsLink(nsIURI** aURI) const MOZ_OVERRIDE;
 
-  virtual nsIAtom* DoGetID() const;
-  virtual const nsAttrValue* DoGetClasses() const;
-  NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker);
+  virtual nsIAtom* DoGetID() const MOZ_OVERRIDE;
+  virtual const nsAttrValue* DoGetClasses() const MOZ_OVERRIDE;
+  NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker) MOZ_OVERRIDE;
   NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* aAttribute) const;
   virtual nsChangeHint GetAttributeChangeHint(const nsIAtom* aAttribute,
                                               int32_t aModType) const;
   virtual nsIAtom *GetClassAttributeName() const;
 
-  virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const
+  virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE
   {
     *aResult = CloneDataNode(aNodeInfo, true);
     if (!*aResult) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
 
     NS_ADDREF(*aResult);
 
@@ -230,17 +231,17 @@ protected:
     /**
      * The nearest enclosing content node with a binding that created us.
      * @see nsIContent::GetBindingParent
      */
     nsIContent* mBindingParent;  // [Weak]
   };
 
   // Override from nsINode
-  virtual nsINode::nsSlots* CreateSlots();
+  virtual nsINode::nsSlots* CreateSlots() MOZ_OVERRIDE;
 
   nsDataSlots* DataSlots()
   {
     return static_cast<nsDataSlots*>(Slots());
   }
 
   nsDataSlots *GetExistingDataSlots() const
   {
@@ -272,26 +273,26 @@ protected:
    * @return the clone
    */
   virtual nsGenericDOMDataNode *CloneDataNode(nsINodeInfo *aNodeInfo,
                                               bool aCloneText) const = 0;
 
   nsTextFragment mText;
 
 public:
-  virtual bool OwnedOnlyByTheDOMTree()
+  virtual bool OwnedOnlyByTheDOMTree() MOZ_OVERRIDE
   {
     return GetParent() && mRefCnt.get() == 1;
   }
 
-  virtual bool IsPurple()
+  virtual bool IsPurple() MOZ_OVERRIDE
   {
     return mRefCnt.IsPurple();
   }
-  virtual void RemovePurple()
+  virtual void RemovePurple() MOZ_OVERRIDE
   {
     mRefCnt.RemovePurple();
   }
   
 private:
   already_AddRefed<nsIAtom> GetCurrentValueAtom();
 };
 
--- a/content/base/src/nsHTMLContentSerializer.h
+++ b/content/base/src/nsHTMLContentSerializer.h
@@ -7,48 +7,49 @@
  * nsIContentSerializer implementation that can be used with an
  * nsIDocumentEncoder to convert an HTML (not XHTML!) DOM to an HTML
  * string that could be parsed into more or less the original DOM.
  */
 
 #ifndef nsHTMLContentSerializer_h__
 #define nsHTMLContentSerializer_h__
 
+#include "mozilla/Attributes.h"
 #include "nsXHTMLContentSerializer.h"
 #include "nsIEntityConverter.h"
 #include "nsString.h"
 
 class nsIContent;
 class nsIAtom;
 
 class nsHTMLContentSerializer : public nsXHTMLContentSerializer {
  public:
   nsHTMLContentSerializer();
   virtual ~nsHTMLContentSerializer();
 
   NS_IMETHOD AppendElementStart(mozilla::dom::Element* aElement,
                                 mozilla::dom::Element* aOriginalElement,
-                                nsAString& aStr);
+                                nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
-                              nsAString& aStr);
+                              nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
-                                 nsAString& aStr);
+                                 nsAString& aStr) MOZ_OVERRIDE;
  protected:
 
   virtual void SerializeHTMLAttributes(nsIContent* aContent,
                                        nsIContent *aOriginalElement,
                                        nsAString& aTagPrefix,
                                        const nsAString& aTagNamespaceURI,
                                        nsIAtom* aTagName,
                                        int32_t aNamespace,
                                        nsAString& aStr);
 
   virtual void AppendAndTranslateEntities(const nsAString& aStr,
-                                          nsAString& aOutputStr);
+                                          nsAString& aOutputStr) MOZ_OVERRIDE;
 
 };
 
 nsresult
 NS_NewHTMLContentSerializer(nsIContentSerializer** aSerializer);
 
 #endif
--- a/content/base/src/nsHostObjectURI.h
+++ b/content/base/src/nsHostObjectURI.h
@@ -1,15 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsHostObjectURI_h
 #define nsHostObjectURI_h
 
+#include "mozilla/Attributes.h"
 #include "nsCOMPtr.h"
 #include "nsIClassInfo.h"
 #include "nsIPrincipal.h"
 #include "nsISerializable.h"
 #include "nsIURIWithPrincipal.h"
 #include "nsSimpleURI.h"
 
 /**
@@ -30,23 +31,23 @@ public:
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_NSIURIWITHPRINCIPAL
   NS_DECL_NSISERIALIZABLE
   NS_DECL_NSICLASSINFO
 
   // Override CloneInternal() and EqualsInternal()
   virtual nsresult CloneInternal(RefHandlingEnum aRefHandlingMode,
-                                 nsIURI** aClone);
+                                 nsIURI** aClone) MOZ_OVERRIDE;
   virtual nsresult EqualsInternal(nsIURI* aOther,
                                   RefHandlingEnum aRefHandlingMode,
-                                  bool* aResult);
+                                  bool* aResult) MOZ_OVERRIDE;
 
   // Override StartClone to hand back a nsHostObjectURI
-  virtual nsSimpleURI* StartClone(RefHandlingEnum /* unused */)
+  virtual nsSimpleURI* StartClone(RefHandlingEnum /* unused */) MOZ_OVERRIDE
   { return new nsHostObjectURI(); }
 
   nsCOMPtr<nsIPrincipal> mPrincipal;
 };
 
 #define NS_HOSTOBJECTURI_CID \
 { 0xf5475c51, 0x59a7, 0x4757, \
   { 0xb3, 0xd9, 0xe2, 0x11, 0xa9, 0x41, 0x08, 0x72 } }
--- a/content/base/src/nsINode.cpp
+++ b/content/base/src/nsINode.cpp
@@ -99,16 +99,17 @@
 #include "nsCSSRuleProcessor.h"
 #include "nsCSSParser.h"
 #include "HTMLLegendElement.h"
 #include "nsWrapperCacheInlines.h"
 #include "WrapperFactory.h"
 #include "DocumentType.h"
 #include <algorithm>
 #include "nsDOMEvent.h"
+#include "nsGlobalWindow.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 nsINode::nsSlots::~nsSlots()
 {
   if (mChildNodes) {
     mChildNodes->DropReference();
@@ -672,21 +673,23 @@ nsINode::SetUserData(const nsAString &aK
   }
 
   oldData.swap(*aResult);
 
   return NS_OK;
 }
 
 JS::Value
-nsINode::SetUserData(JSContext* aCx, const nsAString& aKey, JS::Value aData,
+nsINode::SetUserData(JSContext* aCx, const nsAString& aKey,
+                     JS::Handle<JS::Value> aData,
                      nsIDOMUserDataHandler* aHandler, ErrorResult& aError)
 {
   nsCOMPtr<nsIVariant> data;
-  aError = nsContentUtils::XPConnect()->JSValToVariant(aCx, &aData,
+  JS::Rooted<JS::Value> dataVal(aCx, aData);
+  aError = nsContentUtils::XPConnect()->JSValToVariant(aCx, dataVal.address(),
                                                        getter_AddRefs(data));
   if (aError.Failed()) {
     return JS::UndefinedValue();
   }
 
   nsCOMPtr<nsIVariant> oldData;
   aError = SetUserData(aKey, data, aHandler, getter_AddRefs(oldData));
   if (aError.Failed()) {
@@ -1158,16 +1161,24 @@ nsINode::GetListenerManager(bool aCreate
 }
 
 nsIScriptContext*
 nsINode::GetContextForEventHandlers(nsresult* aRv)
 {
   return nsContentUtils::GetContextForEventHandlers(this, aRv);
 }
 
+nsIDOMWindow*
+nsINode::GetOwnerGlobal()
+{
+  bool dummy;
+  return nsPIDOMWindow::GetOuterFromCurrentInner(
+    static_cast<nsGlobalWindow*>(OwnerDoc()->GetScriptHandlingObject(dummy)));
+}
+
 bool
 nsINode::UnoptimizableCCNode() const
 {
   const uintptr_t problematicFlags = (NODE_IS_ANONYMOUS |
                                       NODE_IS_IN_ANONYMOUS_SUBTREE |
                                       NODE_IS_NATIVE_ANONYMOUS_ROOT |
                                       NODE_MAY_BE_IN_BINDING_MNGR |
                                       NODE_IS_INSERTION_PARENT);
--- a/content/base/src/nsInProcessTabChildGlobal.h
+++ b/content/base/src/nsInProcessTabChildGlobal.h
@@ -2,16 +2,17 @@
 /* vim: set sw=4 ts=8 et tw=80 : */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsInProcessTabChildGlobal_h
 #define nsInProcessTabChildGlobal_h
 
+#include "mozilla/Attributes.h"
 #include "nsCOMPtr.h"
 #include "nsFrameMessageManager.h"
 #include "nsIScriptContext.h"
 #include "nsDOMEventTargetHelper.h"
 #include "nsIScriptObjectPrincipal.h"
 #include "nsIScriptContext.h"
 #include "nsIClassInfo.h"
 #include "jsapi.h"
@@ -43,62 +44,62 @@ public:
                              JSContext* aCx,
                              uint8_t aArgc,
                              JS::Value* aRetval)
   {
     return mMessageManager
       ? mMessageManager->SendSyncMessage(aMessageName, aObject, aCx, aArgc, aRetval)
       : NS_ERROR_NULL_POINTER;
   }
-  NS_IMETHOD GetContent(nsIDOMWindow** aContent);
-  NS_IMETHOD GetDocShell(nsIDocShell** aDocShell);
-  NS_IMETHOD Dump(const nsAString& aStr)
+  NS_IMETHOD GetContent(nsIDOMWindow** aContent) MOZ_OVERRIDE;
+  NS_IMETHOD GetDocShell(nsIDocShell** aDocShell) MOZ_OVERRIDE;
+  NS_IMETHOD Dump(const nsAString& aStr) MOZ_OVERRIDE
   {
     return mMessageManager ? mMessageManager->Dump(aStr) : NS_OK;
   }
-  NS_IMETHOD PrivateNoteIntentionalCrash();
+  NS_IMETHOD PrivateNoteIntentionalCrash() MOZ_OVERRIDE;
   NS_IMETHOD Btoa(const nsAString& aBinaryData,
-                  nsAString& aAsciiBase64String);
+                  nsAString& aAsciiBase64String) MOZ_OVERRIDE;
   NS_IMETHOD Atob(const nsAString& aAsciiString,
-                  nsAString& aBinaryData);
+                  nsAString& aBinaryData) MOZ_OVERRIDE;
 
   NS_DECL_NSIINPROCESSCONTENTFRAMEMESSAGEMANAGER
 
   /**
    * MessageManagerCallback methods that we override.
    */
   virtual bool DoSendSyncMessage(const nsAString& aMessage,
                                  const mozilla::dom::StructuredCloneData& aData,
-                                 InfallibleTArray<nsString>* aJSONRetVal);
+                                 InfallibleTArray<nsString>* aJSONRetVal) MOZ_OVERRIDE;
   virtual bool DoSendAsyncMessage(const nsAString& aMessage,
-                                  const mozilla::dom::StructuredCloneData& aData);
+                                  const mozilla::dom::StructuredCloneData& aData) MOZ_OVERRIDE;
 
-  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
+  virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor) MOZ_OVERRIDE;
   NS_IMETHOD AddEventListener(const nsAString& aType,
                               nsIDOMEventListener* aListener,
                               bool aUseCapture)
   {
     // By default add listeners only for trusted events!
     return nsDOMEventTargetHelper::AddEventListener(aType, aListener,
                                                     aUseCapture, false, 2);
   }
   NS_IMETHOD AddEventListener(const nsAString& aType,
                               nsIDOMEventListener* aListener,
                               bool aUseCapture, bool aWantsUntrusted,
-                              uint8_t optional_argc)
+                              uint8_t optional_argc) MOZ_OVERRIDE
   {
     return nsDOMEventTargetHelper::AddEventListener(aType, aListener,
                                                     aUseCapture,
                                                     aWantsUntrusted,
                                                     optional_argc);
   }
   using nsDOMEventTargetHelper::AddEventListener;
 
-  virtual JSContext* GetJSContextForEventHandlers() { return mCx; }
-  virtual nsIPrincipal* GetPrincipal() { return mPrincipal; }
+  virtual JSContext* GetJSContextForEventHandlers() MOZ_OVERRIDE { return mCx; }
+  virtual nsIPrincipal* GetPrincipal() MOZ_OVERRIDE { return mPrincipal; }
   void LoadFrameScript(const nsAString& aURL);
   void Disconnect();
   void SendMessageToParent(const nsString& aMessage, bool aSync,
                            const nsString& aJSON,
                            nsTArray<nsString>* aJSONRetVal);
   nsFrameMessageManager* GetInnerManager()
   {
     return static_cast<nsFrameMessageManager*>(mMessageManager.get());
@@ -111,17 +112,17 @@ public:
   }
   void SetChromeMessageManager(nsFrameMessageManager* aParent)
   {
     mChromeMessageManager = aParent;
   }
 
   void DelayedDisconnect();
 
-  virtual JSObject* GetGlobalJSObject() {
+  virtual JSObject* GetGlobalJSObject() MOZ_OVERRIDE {
     if (!mGlobal) {
       return nullptr;
     }
 
     return mGlobal->GetJSObject();
   }
 protected:
   nsresult Init();
--- a/content/base/src/nsMappedAttributeElement.h
+++ b/content/base/src/nsMappedAttributeElement.h
@@ -7,16 +7,17 @@
 /**
  * nsMappedAttributeElement is the base for elements supporting style mapped
  * attributes via nsMappedAttributes (HTML and MathML).
  */
 
 #ifndef NS_MAPPEDATTRIBUTEELEMENT_H_
 #define NS_MAPPEDATTRIBUTEELEMENT_H_
 
+#include "mozilla/Attributes.h"
 #include "nsStyledElement.h"
 
 class nsMappedAttributes;
 struct nsRuleData;
 
 typedef void (*nsMapRuleToAttributesFunc)(const nsMappedAttributes* aAttributes, 
                                           nsRuleData* aData);
 
@@ -32,16 +33,16 @@ protected:
   {}
 
 public:
   virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const;
 
   static void MapNoAttributesInto(const nsMappedAttributes* aAttributes, 
                                   nsRuleData* aRuleData);
 
-  NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker);
+  NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker) MOZ_OVERRIDE;
   virtual bool SetMappedAttribute(nsIDocument* aDocument,
                                     nsIAtom* aName,
                                     nsAttrValue& aValue,
-                                    nsresult* aRetval);
+                                    nsresult* aRetval) MOZ_OVERRIDE;
 };
 
 #endif // NS_MAPPEDATTRIBUTEELEMENT_H_
--- a/content/base/src/nsMappedAttributes.h
+++ b/content/base/src/nsMappedAttributes.h
@@ -67,19 +67,19 @@ public:
   // Remove the attr at position aPos.  The value of the attr is placed in
   // aValue; any value that was already in aValue is destroyed.
   void RemoveAttrAt(uint32_t aPos, nsAttrValue& aValue);
   const nsAttrName* GetExistingAttrNameFromQName(const nsAString& aName) const;
   int32_t IndexOfAttr(nsIAtom* aLocalName) const;
   
 
   // nsIStyleRule 
-  virtual void MapRuleInfoInto(nsRuleData* aRuleData);
+  virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
 #ifdef DEBUG
-  virtual void List(FILE* out = stdout, int32_t aIndent = 0) const;
+  virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
 #endif
 
   size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
 
 private:
   nsMappedAttributes(const nsMappedAttributes& aCopy);
   ~nsMappedAttributes();
 
--- a/content/base/src/nsNodeInfo.h
+++ b/content/base/src/nsNodeInfo.h
@@ -8,33 +8,34 @@
  * Class that represents a prefix/namespace/localName triple; a single
  * nodeinfo is shared by all elements in a document that have that
  * prefix, namespace, and localName.
  */
 
 #ifndef nsNodeInfo_h___
 #define nsNodeInfo_h___
 
+#include "mozilla/Attributes.h"
 #include "nsINodeInfo.h"
 #include "nsNodeInfoManager.h"
 #include "plhash.h"
 #include "nsIAtom.h"
 #include "nsCOMPtr.h"
 #include "nsIDOMNode.h"
 #include "nsGkAtoms.h"
 
 class nsNodeInfo : public nsINodeInfo
 {
 public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_CLASS(nsNodeInfo)
 
   // nsINodeInfo
   virtual void GetNamespaceURI(nsAString& aNameSpaceURI) const;
-  virtual bool NamespaceEquals(const nsAString& aNamespaceURI) const;
+  virtual bool NamespaceEquals(const nsAString& aNamespaceURI) const MOZ_OVERRIDE;
 
   // nsNodeInfo
 public:
   /*
    * aName and aOwnerManager may not be null.
    */
   nsNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, int32_t aNamespaceID,
              uint16_t aNodeType, nsIAtom *aExtraName,
--- a/content/base/src/nsObjectLoadingContent.h
+++ b/content/base/src/nsObjectLoadingContent.h
@@ -8,16 +8,17 @@
  * A base class implementing nsIObjectLoadingContent for use by
  * various content nodes that want to provide plugin/document/image
  * loading functionality (eg <embed>, <object>, <applet>, etc).
  */
 
 #ifndef NSOBJECTLOADINGCONTENT_H_
 #define NSOBJECTLOADINGCONTENT_H_
 
+#include "mozilla/Attributes.h"
 #include "nsImageLoadingContent.h"
 #include "nsIStreamListener.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIChannelEventSink.h"
 #include "nsIObjectLoadingContent.h"
 #include "nsIRunnable.h"
 #include "nsPluginInstanceOwner.h"
 #include "nsIThreadInternal.h"
@@ -443,17 +444,17 @@ class nsObjectLoadingContent : public ns
     class SetupProtoChainRunner MOZ_FINAL : public nsIRunnable
     {
     public:
       NS_DECL_ISUPPORTS
 
       SetupProtoChainRunner(nsIScriptContext* scriptContext,
                             nsObjectLoadingContent* aContent);
 
-      NS_IMETHOD Run();
+      NS_IMETHOD Run() MOZ_OVERRIDE;
 
     private:
       nsCOMPtr<nsIScriptContext> mContext;
       // We store an nsIObjectLoadingContent because we can
       // unambiguously refcount that.
       nsRefPtr<nsIObjectLoadingContent> mContent;
     };
 
--- a/content/base/src/nsPlainTextSerializer.h
+++ b/content/base/src/nsPlainTextSerializer.h
@@ -7,16 +7,17 @@
  * nsIContentSerializer implementation that can be used with an
  * nsIDocumentEncoder to convert a DOM into plaintext in a nice way
  * (eg for copy/paste as plaintext).
  */
 
 #ifndef nsPlainTextSerializer_h__
 #define nsPlainTextSerializer_h__
 
+#include "mozilla/Attributes.h"
 #include "nsAutoPtr.h"
 #include "nsCOMPtr.h"
 #include "nsIAtom.h"
 #include "nsIContentSerializer.h"
 #include "nsIDocumentEncoder.h"
 #include "nsILineBreaker.h"
 #include "nsString.h"
 #include "nsTArray.h"
@@ -35,40 +36,40 @@ public:
   nsPlainTextSerializer();
   virtual ~nsPlainTextSerializer();
 
   NS_DECL_ISUPPORTS
 
   // nsIContentSerializer
   NS_IMETHOD Init(uint32_t flags, uint32_t aWrapColumn,
                   const char* aCharSet, bool aIsCopying,
-                  bool aIsWholeDocument);
+                  bool aIsWholeDocument) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendText(nsIContent* aText, int32_t aStartOffset,
-                        int32_t aEndOffset, nsAString& aStr);
+                        int32_t aEndOffset, nsAString& aStr) MOZ_OVERRIDE;
   NS_IMETHOD AppendCDATASection(nsIContent* aCDATASection,
                                 int32_t aStartOffset, int32_t aEndOffset,
-                                nsAString& aStr);
+                                nsAString& aStr) MOZ_OVERRIDE;
   NS_IMETHOD AppendProcessingInstruction(nsIContent* aPI,
                                          int32_t aStartOffset,
                                          int32_t aEndOffset,
-                                         nsAString& aStr)  { return NS_OK; }
+                                         nsAString& aStr) MOZ_OVERRIDE  { return NS_OK; }
   NS_IMETHOD AppendComment(nsIContent* aComment, int32_t aStartOffset,
-                           int32_t aEndOffset, nsAString& aStr)  { return NS_OK; }
+                           int32_t aEndOffset, nsAString& aStr) MOZ_OVERRIDE  { return NS_OK; }
   NS_IMETHOD AppendDoctype(nsIContent *aDoctype,
-                           nsAString& aStr)  { return NS_OK; }
+                           nsAString& aStr) MOZ_OVERRIDE  { return NS_OK; }
   NS_IMETHOD AppendElementStart(mozilla::dom::Element* aElement,
                                 mozilla::dom::Element* aOriginalElement,
-                                nsAString& aStr); 
+                                nsAString& aStr) MOZ_OVERRIDE; 
   NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
-                              nsAString& aStr);
-  NS_IMETHOD Flush(nsAString& aStr);
+                              nsAString& aStr) MOZ_OVERRIDE;
+  NS_IMETHOD Flush(nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
-                                 nsAString& aStr);
+                                 nsAString& aStr) MOZ_OVERRIDE;
 
 protected:
   nsresult GetAttributeValue(nsIAtom* aName, nsString& aValueRet);
   void AddToLine(const PRUnichar* aStringToAdd, int32_t aLength);
   void EndLine(bool softlinebreak, bool aBreakBySpace = false);
   void EnsureVerticalSpace(int32_t noOfRows);
   void FlushLine();
   void OutputQuotesAndIndent(bool stripTrailingSpaces=false);
--- a/content/base/src/nsScriptElement.h
+++ b/content/base/src/nsScriptElement.h
@@ -1,12 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#include "mozilla/Attributes.h"
 #include "nsIScriptLoaderObserver.h"
 #include "nsIScriptElement.h"
 #include "nsStubMutationObserver.h"
 
 /**
  * Baseclass useful for script elements (such as <xhtml:script> and
  * <svg:script>). Currently the class assumes that only the 'src'
  * attribute and the children of the class affect what script to execute.
@@ -25,20 +26,20 @@ public:
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
 
   nsScriptElement(mozilla::dom::FromParser aFromParser)
     : nsIScriptElement(aFromParser)
   {
   }
 
-  virtual nsresult FireErrorEvent();
+  virtual nsresult FireErrorEvent() MOZ_OVERRIDE;
 
 protected:
   // Internal methods
 
   /**
    * Check if this element contains any script, linked or inline
    */
   virtual bool HasScriptContent() = 0;
 
-  virtual bool MaybeProcessScript();
+  virtual bool MaybeProcessScript() MOZ_OVERRIDE;
 };
--- a/content/base/src/nsStyleLinkElement.h
+++ b/content/base/src/nsStyleLinkElement.h
@@ -8,16 +8,17 @@
  * A base class which implements nsIStyleSheetLinkingElement and can
  * be subclassed by various content nodes that want to load
  * stylesheets (<style>, <link>, processing instructions, etc).
  */
 
 #ifndef nsStyleLinkElement_h___
 #define nsStyleLinkElement_h___
 
+#include "mozilla/Attributes.h"
 #include "nsCOMPtr.h"
 #include "nsIDOMLinkStyle.h"
 #include "nsIStyleSheetLinkingElement.h"
 #include "nsCSSStyleSheet.h"
 #include "nsTArray.h"
 #include "mozilla/CORSMode.h"
 
 #define PREFETCH      0x00000001
@@ -31,35 +32,35 @@ class nsIURI;
 
 class nsStyleLinkElement : public nsIDOMLinkStyle,
                            public nsIStyleSheetLinkingElement
 {
 public:
   nsStyleLinkElement();
   virtual ~nsStyleLinkElement();
 
-  NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) = 0;
+  NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) MOZ_OVERRIDE = 0;
 
   // nsIDOMLinkStyle
   NS_DECL_NSIDOMLINKSTYLE
 
   nsCSSStyleSheet* GetSheet() const { return mStyleSheet; }
 
   // nsIStyleSheetLinkingElement  
-  NS_IMETHOD SetStyleSheet(nsCSSStyleSheet* aStyleSheet);
-  NS_IMETHOD GetStyleSheet(nsIStyleSheet*& aStyleSheet);
-  NS_IMETHOD InitStyleLinkElement(bool aDontLoadStyle);
+  NS_IMETHOD SetStyleSheet(nsCSSStyleSheet* aStyleSheet) MOZ_OVERRIDE;
+  NS_IMETHOD GetStyleSheet(nsIStyleSheet*& aStyleSheet) MOZ_OVERRIDE;
+  NS_IMETHOD InitStyleLinkElement(bool aDontLoadStyle) MOZ_OVERRIDE;
   NS_IMETHOD UpdateStyleSheet(nsICSSLoaderObserver* aObserver,
                               bool* aWillNotify,
-                              bool* aIsAlternate);
-  NS_IMETHOD SetEnableUpdates(bool aEnableUpdates);
-  NS_IMETHOD GetCharset(nsAString& aCharset);
+                              bool* aIsAlternate) MOZ_OVERRIDE;
+  NS_IMETHOD SetEnableUpdates(bool aEnableUpdates) MOZ_OVERRIDE;
+  NS_IMETHOD GetCharset(nsAString& aCharset) MOZ_OVERRIDE;
 
-  virtual void OverrideBaseURI(nsIURI* aNewBaseURI);
-  virtual void SetLineNumber(uint32_t aLineNumber);
+  virtual void OverrideBaseURI(nsIURI* aNewBaseURI) MOZ_OVERRIDE;
+  virtual void SetLineNumber(uint32_t aLineNumber) MOZ_OVERRIDE;
 
   static uint32_t ParseLinkTypes(const nsAString& aTypes);
   
   void UpdateStyleSheetInternal() { UpdateStyleSheetInternal(nullptr); }
 protected:
   /**
    * @param aOldDocument should be non-null only if we're updating because we
    *                     removed the node from the document.
--- a/content/base/src/nsStyledElement.h
+++ b/content/base/src/nsStyledElement.h
@@ -8,16 +8,17 @@
  * nsStyledElement is the base for elements supporting styling via the
  * id/class/style attributes; it is a common base for their support in HTML,
  * SVG and MathML.
  */
 
 #ifndef __NS_STYLEDELEMENT_H_
 #define __NS_STYLEDELEMENT_H_
 
+#include "mozilla/Attributes.h"
 #include "nsString.h"
 #include "mozilla/dom/Element.h"
 
 namespace mozilla {
 namespace css {
 class StyleRule;
 }
 }
@@ -30,30 +31,30 @@ class nsStyledElementNotElementCSSInline
 protected:
 
   inline nsStyledElementNotElementCSSInlineStyle(already_AddRefed<nsINodeInfo> aNodeInfo)
     : nsStyledElementBase(aNodeInfo)
   {}
 
 public:
   // nsIContent interface methods
-  virtual nsIAtom* GetClassAttributeName() const;
-  virtual nsIAtom* GetIDAttributeName() const;
-  virtual nsIAtom* DoGetID() const;
-  virtual const nsAttrValue* DoGetClasses() const;
+  virtual nsIAtom* GetClassAttributeName() const MOZ_OVERRIDE;
+  virtual nsIAtom* GetIDAttributeName() const MOZ_OVERRIDE;
+  virtual nsIAtom* DoGetID() const MOZ_OVERRIDE;
+  virtual const nsAttrValue* DoGetClasses() const MOZ_OVERRIDE;
 
   virtual mozilla::css::StyleRule* GetInlineStyleRule();
   virtual nsresult SetInlineStyleRule(mozilla::css::StyleRule* aStyleRule,
                                       const nsAString* aSerialized,
-                                      bool aNotify);
+                                      bool aNotify) MOZ_OVERRIDE;
 
   virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
-                             bool aNotify);
+                             bool aNotify) MOZ_OVERRIDE;
   virtual nsresult AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
-                                const nsAttrValue* aValue, bool aNotify);
+                                const nsAttrValue* aValue, bool aNotify) MOZ_OVERRIDE;
 
   nsICSSDeclaration* Style();
 
 protected:
 
   /**
    * Parse a style attr value into a CSS rulestruct (or, if there is no
    * document, leave it as a string) and return as nsAttrValue.
@@ -61,17 +62,17 @@ protected:
    * @param aValue the value to parse
    * @param aResult the resulting HTMLValue [OUT]
    */
   void ParseStyleAttribute(const nsAString& aValue,
                            nsAttrValue& aResult,
                            bool aForceInDataDoc);
 
   virtual bool ParseAttribute(int32_t aNamespaceID, nsIAtom* aAttribute,
-                                const nsAString& aValue, nsAttrValue& aResult);
+                                const nsAString& aValue, nsAttrValue& aResult) MOZ_OVERRIDE;
 
   friend class mozilla::dom::Element;
 
   /**
    * Create the style struct from the style attr.  Used when an element is
    * first put into a document.  Only has an effect if the old value is a
    * string.  If aForceInDataDoc is true, will reparse even if we're in a data
    * document.
--- a/content/base/src/nsTextNode.h
+++ b/content/base/src/nsTextNode.h
@@ -5,16 +5,17 @@
 
 #ifndef nsTextNode_h
 #define nsTextNode_h
 
 /*
  * Implementation of DOM Core's nsIDOMText node.
  */
 
+#include "mozilla/Attributes.h"
 #include "mozilla/dom/Text.h"
 #include "nsIDOMText.h"
 #include "nsDebug.h"
 
 class nsNodeInfoManager;
 
 /**
  * Class used to implement DOM text nodes
@@ -56,32 +57,32 @@ public:
 
   // nsIDOMText
   NS_FORWARD_NSIDOMTEXT(nsGenericDOMDataNode::)
 
   // nsINode
   virtual bool IsNodeOfType(uint32_t aFlags) const;
 
   virtual nsGenericDOMDataNode* CloneDataNode(nsINodeInfo *aNodeInfo,
-                                              bool aCloneText) const;
+                                              bool aCloneText) const MOZ_OVERRIDE;
 
   virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                               nsIContent* aBindingParent,
-                              bool aCompileEventHandlers);
+                              bool aCompileEventHandlers) MOZ_OVERRIDE;
   virtual void UnbindFromTree(bool aDeep = true,
-                              bool aNullParent = true);
+                              bool aNullParent = true) MOZ_OVERRIDE;
 
   nsresult AppendTextForNormalize(const PRUnichar* aBuffer, uint32_t aLength,
                                   bool aNotify, nsIContent* aNextSibling);
 
-  virtual nsIDOMNode* AsDOMNode() { return this; }
+  virtual nsIDOMNode* AsDOMNode() MOZ_OVERRIDE { return this; }
 
 #ifdef DEBUG
-  virtual void List(FILE* out, int32_t aIndent) const;
-  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const;
+  virtual void List(FILE* out, int32_t aIndent) const MOZ_OVERRIDE;
+  virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const MOZ_OVERRIDE;
 #endif
 
 protected:
   virtual JSObject* WrapNode(JSContext *aCx,
                              JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 };
 
 #endif // nsTextNode_h
--- a/content/base/src/nsXHTMLContentSerializer.h
+++ b/content/base/src/nsXHTMLContentSerializer.h
@@ -7,92 +7,93 @@
  * nsIContentSerializer implementation that can be used with an
  * nsIDocumentEncoder to convert an XHTML (not HTML!) DOM to an XHTML
  * string that could be parsed into more or less the original DOM.
  */
 
 #ifndef nsXHTMLContentSerializer_h__
 #define nsXHTMLContentSerializer_h__
 
+#include "mozilla/Attributes.h"
 #include "nsXMLContentSerializer.h"
 #include "nsIEntityConverter.h"
 #include "nsString.h"
 #include "nsTArray.h"
 
 class nsIContent;
 class nsIAtom;
 
 class nsXHTMLContentSerializer : public nsXMLContentSerializer {
  public:
   nsXHTMLContentSerializer();
   virtual ~nsXHTMLContentSerializer();
 
   NS_IMETHOD Init(uint32_t flags, uint32_t aWrapColumn,
                   const char* aCharSet, bool aIsCopying,
-                  bool aRewriteEncodingDeclaration);
+                  bool aRewriteEncodingDeclaration) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendText(nsIContent* aText,
                         int32_t aStartOffset,
                         int32_t aEndOffset,
-                        nsAString& aStr);
+                        nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
-                                 nsAString& aStr);
+                                 nsAString& aStr) MOZ_OVERRIDE;
 
  protected:
 
 
   virtual bool CheckElementStart(nsIContent * aContent,
                           bool & aForceFormat,
-                          nsAString& aStr);
+                          nsAString& aStr) MOZ_OVERRIDE;
 
   virtual void AppendEndOfElementStart(nsIContent *aOriginalElement,
                                nsIAtom * aName,
                                int32_t aNamespaceID,
-                               nsAString& aStr);
+                               nsAString& aStr) MOZ_OVERRIDE;
 
   virtual void AfterElementStart(nsIContent * aContent,
                          nsIContent *aOriginalElement,
-                         nsAString& aStr);
+                         nsAString& aStr) MOZ_OVERRIDE;
 
   virtual bool CheckElementEnd(nsIContent * aContent,
                           bool & aForceFormat,
-                          nsAString& aStr);
+                          nsAString& aStr) MOZ_OVERRIDE;
 
   virtual void AfterElementEnd(nsIContent * aContent,
-                               nsAString& aStr);
+                               nsAString& aStr) MOZ_OVERRIDE;
 
-  virtual bool LineBreakBeforeOpen(int32_t aNamespaceID, nsIAtom* aName);
-  virtual bool LineBreakAfterOpen(int32_t aNamespaceID, nsIAtom* aName);
-  virtual bool LineBreakBeforeClose(int32_t aNamespaceID, nsIAtom* aName);
-  virtual bool LineBreakAfterClose(int32_t aNamespaceID, nsIAtom* aName);
+  virtual bool LineBreakBeforeOpen(int32_t aNamespaceID, nsIAtom* aName) MOZ_OVERRIDE;
+  virtual bool LineBreakAfterOpen(int32_t aNamespaceID, nsIAtom* aName) MOZ_OVERRIDE;
+  virtual bool LineBreakBeforeClose(int32_t aNamespaceID, nsIAtom* aName) MOZ_OVERRIDE;
+  virtual bool LineBreakAfterClose(int32_t aNamespaceID, nsIAtom* aName) MOZ_OVERRIDE;
 
   bool HasLongLines(const nsString& text, int32_t& aLastNewlineOffset);
 
   // functions to check if we enter in or leave from a preformated content
-  virtual void MaybeEnterInPreContent(nsIContent* aNode);
-  virtual void MaybeLeaveFromPreContent(nsIContent* aNode);
+  virtual void MaybeEnterInPreContent(nsIContent* aNode) MOZ_OVERRIDE;
+  virtual void MaybeLeaveFromPreContent(nsIContent* aNode) MOZ_OVERRIDE;
 
   virtual void SerializeAttributes(nsIContent* aContent,
                            nsIContent *aOriginalElement,
                            nsAString& aTagPrefix,
                            const nsAString& aTagNamespaceURI,
                            nsIAtom* aTagName,
                            nsAString& aStr,
                            uint32_t aSkipAttr,
-                           bool aAddNSAttr);
+                           bool aAddNSAttr) MOZ_OVERRIDE;
 
   bool IsFirstChildOfOL(nsIContent* aElement);
 
   void SerializeLIValueAttribute(nsIContent* aElement,
                                  nsAString& aStr);
   bool IsShorthandAttr(const nsIAtom* aAttrName,
                          const nsIAtom* aElementName);
   virtual void AppendAndTranslateEntities(const nsAString& aStr,
-                                          nsAString& aOutputStr);
+                                          nsAString& aOutputStr) MOZ_OVERRIDE;
   nsresult EscapeURI(nsIContent* aContent,
                      const nsAString& aURI,
                      nsAString& aEscapedURI);
 
   nsCOMPtr<nsIEntityConverter> mEntityConverter;
 
   /*
    * isHTMLParser should be set to true by the HTML parser which inherits from
--- a/content/base/src/nsXMLContentSerializer.h
+++ b/content/base/src/nsXMLContentSerializer.h
@@ -7,16 +7,17 @@
  * nsIContentSerializer implementation that can be used with an
  * nsIDocumentEncoder to convert an XML DOM to an XML string that
  * could be parsed into more or less the original DOM.
  */
 
 #ifndef nsXMLContentSerializer_h__
 #define nsXMLContentSerializer_h__
 
+#include "mozilla/Attributes.h"
 #include "nsIContentSerializer.h"
 #include "nsISupportsUtils.h"
 #include "nsCOMPtr.h"
 #include "nsTArray.h"
 #include "nsString.h"
 
 #define kIndentStr NS_LITERAL_STRING("  ")
 #define kEndTag NS_LITERAL_STRING("</")
@@ -29,47 +30,47 @@ class nsXMLContentSerializer : public ns
  public:
   nsXMLContentSerializer();
   virtual ~nsXMLContentSerializer();
 
   NS_DECL_ISUPPORTS
 
   NS_IMETHOD Init(uint32_t flags, uint32_t aWrapColumn,
                   const char* aCharSet, bool aIsCopying,
-                  bool aRewriteEncodingDeclaration);
+                  bool aRewriteEncodingDeclaration) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendText(nsIContent* aText, int32_t aStartOffset,
-                        int32_t aEndOffset, nsAString& aStr);
+                        int32_t aEndOffset, nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendCDATASection(nsIContent* aCDATASection,
                                 int32_t aStartOffset, int32_t aEndOffset,
-                                nsAString& aStr);
+                                nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendProcessingInstruction(nsIContent* aPI,
                                          int32_t aStartOffset,
                                          int32_t aEndOffset,
-                                         nsAString& aStr);
+                                         nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendComment(nsIContent* aComment, int32_t aStartOffset,
-                           int32_t aEndOffset, nsAString& aStr);
+                           int32_t aEndOffset, nsAString& aStr) MOZ_OVERRIDE;
   
   NS_IMETHOD AppendDoctype(nsIContent *aDoctype,
-                           nsAString& aStr);
+                           nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendElementStart(mozilla::dom::Element* aElement,
                                 mozilla::dom::Element* aOriginalElement,
-                                nsAString& aStr);
+                                nsAString& aStr) MOZ_OVERRIDE;
 
   NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
-                              nsAString& aStr);
+                              nsAString& aStr) MOZ_OVERRIDE;
 
-  NS_IMETHOD Flush(nsAString& aStr) { return NS_OK; }
+  NS_IMETHOD Flush(nsAString& aStr) MOZ_OVERRIDE { return NS_OK; }
 
   NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
-                                 nsAString& aStr);
+                                 nsAString& aStr) MOZ_OVERRIDE;
 
  protected:
 
   /**
    * Appends a PRUnichar character and increments the column position
    */
   void AppendToString(const PRUnichar aChar,
                       nsAString& aOutputStr);
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -778,18 +778,18 @@ nsXMLHttpRequest::CreateResponseParsedJS
 {
   if (!aCx) {
     return NS_ERROR_FAILURE;
   }
   RootJSResultObjects();
 
   // The Unicode converter has already zapped the BOM if there was one
   if (!JS_ParseJSON(aCx,
-                    static_cast<const jschar*>(mResponseText.get()),
-                    mResponseText.Length(), &mResultJSON)) {
+                    static_cast<const jschar*>(mResponseText.get()), mResponseText.Length(),
+                    JS::MutableHandle<JS::Value>::fromMarkedLocation(&mResultJSON))) {
     return NS_ERROR_FAILURE;
   }
 
   return NS_OK;
 }
 
 void
 nsXMLHttpRequest::CreatePartialBlob()
--- a/content/base/src/nsXMLHttpRequest.h
+++ b/content/base/src/nsXMLHttpRequest.h
@@ -2,16 +2,17 @@
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsXMLHttpRequest_h__
 #define nsXMLHttpRequest_h__
 
+#include "mozilla/Attributes.h"
 #include "nsIXMLHttpRequest.h"
 #include "nsISupportsUtils.h"
 #include "nsString.h"
 #include "nsIURI.h"
 #include "nsIHttpChannel.h"
 #include "nsIJARChannel.h"
 #include "nsIDocument.h"
 #include "nsIStreamListener.h"
@@ -468,17 +469,17 @@ public:
 
   void SetRequestObserver(nsIRequestObserver* aObserver);
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(nsXMLHttpRequest,
                                                                    nsXHREventTarget)
   bool AllowUploadProgress();
   void RootJSResultObjects();
 
-  virtual void DisconnectFromOwner();
+  virtual void DisconnectFromOwner() MOZ_OVERRIDE;
 
 protected:
   nsresult DetectCharset();
   nsresult AppendToResponseText(const char * aBuffer, uint32_t aBufferLen);
   static NS_METHOD StreamReaderFunc(nsIInputStream* in,
                 void* closure,
                 const char* fromRawSegment,
                 uint32_t toOffset,
@@ -716,17 +717,17 @@ class nsXMLHttpRequestXPCOMifier MOZ_FIN
 private:
   nsRefPtr<nsXMLHttpRequest> mXHR;
 };
 
 class nsXHRParseEndListener : public nsIDOMEventListener
 {
 public:
   NS_DECL_ISUPPORTS
-  NS_IMETHOD HandleEvent(nsIDOMEvent *event)
+  NS_IMETHOD HandleEvent(nsIDOMEvent *event) MOZ_OVERRIDE
   {
     nsCOMPtr<nsIXMLHttpRequest> xhr = do_QueryReferent(mXHR);
     if (xhr) {
       static_cast<nsXMLHttpRequest*>(xhr.get())->ChangeStateToDone();
     }
     mXHR = nullptr;
     return NS_OK;
   }
--- a/content/canvas/src/CanvasGradient.h
+++ b/content/canvas/src/CanvasGradient.h
@@ -1,15 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_CanvasGradient_h
 #define mozilla_dom_CanvasGradient_h
 
+#include "mozilla/Attributes.h"
 #include "nsTArray.h"
 #include "mozilla/RefPtr.h"
 #include "mozilla/dom/CanvasRenderingContext2DBinding.h"
 #include "mozilla/dom/CanvasRenderingContext2D.h"
 #include "mozilla/gfx/2D.h"
 #include "nsWrapperCache.h"
 
 #define NS_CANVASGRADIENTAZURE_PRIVATE_IID \
@@ -48,17 +49,17 @@ public:
     mStops = aRT->CreateGradientStops(mRawStops.Elements(), mRawStops.Length());
 
     return mStops;
   }
 
   // WebIDL
   void AddColorStop(float offset, const nsAString& colorstr, ErrorResult& rv);
 
-  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
+  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE
   {
     return CanvasGradientBinding::Wrap(aCx, aScope, this);
   }
 
   CanvasRenderingContext2D* GetParentObject()
   {
     return mContext;
   }
--- a/content/canvas/src/CanvasPattern.h
+++ b/content/canvas/src/CanvasPattern.h
@@ -1,15 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_CanvasPattern_h
 #define mozilla_dom_CanvasPattern_h
 
+#include "mozilla/Attributes.h"
 #include "mozilla/dom/CanvasRenderingContext2DBinding.h"
 #include "mozilla/dom/CanvasRenderingContext2D.h"
 #include "mozilla/RefPtr.h"
 #include "nsISupports.h"
 #include "nsWrapperCache.h"
 
 #define NS_CANVASPATTERNAZURE_PRIVATE_IID \
     {0xc9bacc25, 0x28da, 0x421e, {0x9a, 0x4b, 0xbb, 0xd6, 0x93, 0x05, 0x12, 0xbc}}
@@ -49,17 +50,17 @@ public:
     , mRepeat(aRepeat)
     , mPrincipal(principalForSecurityCheck)
     , mForceWriteOnly(forceWriteOnly)
     , mCORSUsed(CORSUsed)
   {
     SetIsDOMBinding();
   }
 
-  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
+  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE
   {
     return CanvasPatternBinding::Wrap(aCx, aScope, this);
   }
 
   CanvasRenderingContext2D* GetParentObject()
   {
     return mContext;
   }
--- a/content/canvas/src/CanvasRenderingContext2D.h
+++ b/content/canvas/src/CanvasRenderingContext2D.h
@@ -1,36 +1,37 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef CanvasRenderingContext2D_h
 #define CanvasRenderingContext2D_h
 
+#include "mozilla/Attributes.h"
 #include <vector>
 #include "nsIDOMCanvasRenderingContext2D.h"
 #include "nsICanvasRenderingContextInternal.h"
 #include "mozilla/RefPtr.h"
 #include "nsColor.h"
 #include "mozilla/dom/HTMLCanvasElement.h"
 #include "mozilla/dom/HTMLVideoElement.h"
 #include "CanvasUtils.h"
 #include "gfxFont.h"
 #include "mozilla/ErrorResult.h"
 #include "mozilla/dom/ImageData.h"
 #include "mozilla/dom/UnionTypes.h"
 #include "mozilla/dom/CanvasGradient.h"
 #include "mozilla/dom/CanvasRenderingContext2DBinding.h"
 #include "mozilla/dom/CanvasPattern.h"
+#include "mozilla/gfx/Rect.h"
 
 class nsXULElement;
 
 namespace mozilla {
 namespace gfx {
-struct Rect;
 class SourceSurface;
 }
 
 namespace dom {
 class TextMetrics;
 
 extern const mozilla::gfx::Float SIGMA_MAX;
 
@@ -355,41 +356,41 @@ public: