Merge m-c to b2g-inbound.
authorRyan VanderMeulen <ryanvm@gmail.com>
Tue, 01 Apr 2014 16:48:07 -0400
changeset 176634 3361a93b21f0c3e2e848fd3f59dd6073204d5126
parent 176633 ce9a329fc4a2a3d7cbc73cd128beef4bc0f957f6 (current diff)
parent 176531 0ff6afce0133cad913d1ffb453bcd35a4525698a (diff)
child 176635 62887431cb7108b197e35cd84cbabcabf2c148b1
push id26528
push usercbook@mozilla.com
push dateWed, 02 Apr 2014 13:58:11 +0000
treeherdermozilla-central@7bacc9e903b0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone31.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to b2g-inbound.
browser/themes/shared/devtools/images/metal.jpg
dom/events/nsDOMEventTargetHelper.cpp
dom/events/nsDOMEventTargetHelper.h
dom/events/nsDOMKeyNameList.h
dom/events/nsEventNameList.h
dom/events/nsEventStateManager.cpp
dom/events/nsEventStateManager.h
dom/events/nsVKList.h
gfx/gl/GLDrawRectHelper.cpp
gfx/gl/GLDrawRectHelper.h
js/src/builtin/TypeRepresentation.cpp
js/src/builtin/TypeRepresentation.h
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Bug 989137 - /experiments needed clobber to build on OSX
+Bug 988168 requires a clobber because of the location change for the linked libxul.
--- a/accessible/src/base/AccEvent.cpp
+++ b/accessible/src/base/AccEvent.cpp
@@ -6,17 +6,17 @@
 
 #include "AccEvent.h"
 
 #include "nsAccUtils.h"
 #include "DocAccessible.h"
 #include "xpcAccEvents.h"
 #include "States.h"
 
-#include "nsEventStateManager.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/Selection.h"
 
 using namespace mozilla;
 using namespace mozilla::a11y;
 
 static_assert(static_cast<bool>(eNoUserInput) == false &&
               static_cast<bool>(eFromUserInput) == true,
               "EIsFromUserInput cannot be casted to bool");
@@ -28,17 +28,17 @@ static_assert(static_cast<bool>(eNoUserI
 ////////////////////////////////////////////////////////////////////////////////
 // AccEvent constructors
 
 AccEvent::AccEvent(uint32_t aEventType, Accessible* aAccessible,
                    EIsFromUserInput aIsFromUserInput, EEventRule aEventRule) :
   mEventType(aEventType), mEventRule(aEventRule), mAccessible(aAccessible)
 {
   if (aIsFromUserInput == eAutoDetect)
-    mIsFromUserInput = nsEventStateManager::IsHandlingUserInput();
+    mIsFromUserInput = EventStateManager::IsHandlingUserInput();
   else
     mIsFromUserInput = aIsFromUserInput == eFromUserInput ? true : false;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // AccEvent cycle collection
 
 NS_IMPL_CYCLE_COLLECTION_1(AccEvent, mAccessible)
--- a/accessible/src/base/FocusManager.cpp
+++ b/accessible/src/base/FocusManager.cpp
@@ -7,22 +7,22 @@
 #include "Accessible-inl.h"
 #include "AccIterator.h"
 #include "DocAccessible-inl.h"
 #include "nsAccessibilityService.h"
 #include "nsAccUtils.h"
 #include "nsEventShell.h"
 #include "Role.h"
 
-#include "nsEventStateManager.h"
 #include "nsFocusManager.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/dom/Element.h"
 
-namespace dom = mozilla::dom;
-using namespace mozilla::a11y;
+namespace mozilla {
+namespace a11y {
 
 FocusManager::FocusManager()
 {
 }
 
 FocusManager::~FocusManager()
 {
 }
@@ -389,24 +389,28 @@ FocusManager::FocusedDOMNode() const
 {
   nsFocusManager* DOMFocusManager = nsFocusManager::GetFocusManager();
   nsIContent* focusedElm = DOMFocusManager->GetFocusedContent();
 
   // No focus on remote target elements like xul:browser having DOM focus and
   // residing in chrome process because it means an element in content process
   // keeps the focus.
   if (focusedElm) {
-    if (nsEventStateManager::IsRemoteTarget(focusedElm))
+    if (EventStateManager::IsRemoteTarget(focusedElm)) {
       return nullptr;
+    }
     return focusedElm;
   }
 
   // Otherwise the focus can be on DOM document.
   nsPIDOMWindow* focusedWnd = DOMFocusManager->GetFocusedWindow();
   return focusedWnd ? focusedWnd->GetExtantDoc() : nullptr;
 }
 
 nsIDocument*
 FocusManager::FocusedDOMDocument() const
 {
   nsINode* focusedNode = FocusedDOMNode();
   return focusedNode ? focusedNode->OwnerDoc() : nullptr;
 }
+
+} // namespace a11y
+} // namespace mozilla
--- a/accessible/src/base/nsCoreUtils.cpp
+++ b/accessible/src/base/nsCoreUtils.cpp
@@ -14,21 +14,21 @@
 #include "nsIDOMHTMLElement.h"
 #include "nsRange.h"
 #include "nsIBoxObject.h"
 #include "nsIDOMXULElement.h"
 #include "nsIDocShell.h"
 #include "nsIPresShell.h"
 #include "nsPresContext.h"
 #include "nsIScrollableFrame.h"
-#include "nsEventStateManager.h"
 #include "nsISelectionPrivate.h"
 #include "nsISelectionController.h"
 #include "mozilla/dom/TouchEvent.h"
 #include "mozilla/EventListenerManager.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/TouchEvents.h"
 #include "nsView.h"
 #include "nsGkAtoms.h"
 
 #include "nsComponentManagerUtils.h"
 
 #include "nsITreeBoxObject.h"
@@ -157,29 +157,29 @@ nsCoreUtils::DispatchTouchEvent(uint32_t
   aPresShell->HandleEventWithTarget(&event, aFrame, aContent, &status);
 }
 
 uint32_t
 nsCoreUtils::GetAccessKeyFor(nsIContent* aContent)
 {
   // Accesskeys are registered by @accesskey attribute only. At first check
   // whether it is presented on the given element to avoid the slow
-  // nsEventStateManager::GetRegisteredAccessKey() method.
+  // EventStateManager::GetRegisteredAccessKey() method.
   if (!aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::accesskey))
     return 0;
 
   nsIPresShell* presShell = aContent->OwnerDoc()->GetShell();
   if (!presShell)
     return 0;
 
   nsPresContext *presContext = presShell->GetPresContext();
   if (!presContext)
     return 0;
 
-  nsEventStateManager *esm = presContext->EventStateManager();
+  EventStateManager *esm = presContext->EventStateManager();
   if (!esm)
     return 0;
 
   return esm->GetRegisteredAccessKey(aContent);
 }
 
 nsIContent *
 nsCoreUtils::GetDOMElementFor(nsIContent *aContent)
--- a/accessible/src/base/nsCoreUtils.h
+++ b/accessible/src/base/nsCoreUtils.h
@@ -73,17 +73,17 @@ public:
    * @param aRootWidget  [in] the root widget of the element
    */
   static void DispatchTouchEvent(uint32_t aEventType, int32_t aX, int32_t aY,
                                  nsIContent* aContent, nsIFrame* aFrame,
                                  nsIPresShell* aPresShell, nsIWidget* aRootWidget);
 
   /**
    * Return an accesskey registered on the given element by
-   * nsEventStateManager or 0 if there is no registered accesskey.
+   * EventStateManager or 0 if there is no registered accesskey.
    *
    * @param aContent - the given element.
    */
   static uint32_t GetAccessKeyFor(nsIContent *aContent);
 
   /**
    * Return DOM element related with the given node, i.e.
    * a) itself if it is DOM element
--- a/accessible/src/generic/ARIAGridAccessible.cpp
+++ b/accessible/src/generic/ARIAGridAccessible.cpp
@@ -351,17 +351,17 @@ ARIAGridAccessible::SelectedRowIndices(n
 }
 
 void
 ARIAGridAccessible::SelectRow(uint32_t aRowIdx)
 {
   AccIterator rowIter(this, filters::GetRow);
 
   Accessible* row = nullptr;
-  for (int32_t rowIdx = 0; (row = rowIter.Next()); rowIdx++) {
+  for (uint32_t rowIdx = 0; (row = rowIter.Next()); rowIdx++) {
     DebugOnly<nsresult> rv = SetARIASelected(row, rowIdx == aRowIdx);
     NS_ASSERTION(NS_SUCCEEDED(rv), "SetARIASelected() Shouldn't fail!");
   }
 }
 
 void
 ARIAGridAccessible::SelectCol(uint32_t aColIdx)
 {
--- a/accessible/src/generic/DocAccessible.cpp
+++ b/accessible/src/generic/DocAccessible.cpp
@@ -23,17 +23,16 @@
 #include "nsIDOMAttr.h"
 #include "nsIDOMCharacterData.h"
 #include "nsIDOMDocument.h"
 #include "nsIDOMXULDocument.h"
 #include "nsIDOMMutationEvent.h"
 #include "nsPIDOMWindow.h"
 #include "nsIDOMXULPopupElement.h"
 #include "nsIEditingSession.h"
-#include "nsEventStateManager.h"
 #include "nsIFrame.h"
 #include "nsIInterfaceRequestorUtils.h"
 #include "nsImageFrame.h"
 #include "nsIPersistentProperties2.h"
 #include "nsIPresShell.h"
 #include "nsIServiceManager.h"
 #include "nsViewManager.h"
 #include "nsIScrollableFrame.h"
--- a/accessible/src/xul/XULMenuAccessible.cpp
+++ b/accessible/src/xul/XULMenuAccessible.cpp
@@ -149,17 +149,17 @@ XULMenuitemAccessible::Description(nsStr
 
 KeyBinding
 XULMenuitemAccessible::AccessKey() const
 {
   // Return menu accesskey: N or Alt+F.
   static int32_t gMenuAccesskeyModifier = -1;  // magic value of -1 indicates unitialized state
 
   // We do not use nsCoreUtils::GetAccesskeyFor() because accesskeys for
-  // menu are't registered by nsEventStateManager.
+  // menu are't registered by EventStateManager.
   nsAutoString accesskey;
   mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::accesskey,
                     accesskey);
   if (accesskey.IsEmpty())
     return KeyBinding();
 
   uint32_t modifierKey = 0;
 
--- a/addon-sdk/source/test/test-content-events.js
+++ b/addon-sdk/source/test/test-content-events.js
@@ -111,25 +111,21 @@ exports["test nested frames"] = function
       assert.fail(Error(reason))
     }).then(function() {
       loader.unload();
       off(events, "data", handler);
       done();
     });
 };
 
-// ignore about:blank pages and *-document-global-created
-// events that are not very consistent.
-// ignore http:// requests, as Fennec's `about:home` page
-// displays add-ons a user could install
-// ignore local `searchplugins` files loaded
+// ignore *-document-global-created events that are not very consistent.
+// only allow data uris that we create to ignore unwanted events, e.g.,
+// about:blank, http:// requests from Fennec's `about:`home page that displays
+// add-ons a user could install, local `searchplugins`, other chrome uris
 // Calls callback if passes filter
 function eventFilter (type, target, callback) {
-  if (target.URL !== "about:blank" &&
-    target.URL !== "about:home" &&
-    !target.URL.match(/^https?:\/\//i) &&
-    !target.URL.match(/searchplugins/) &&
+  if (target.URL.startsWith("data:text/html,") &&
     type !== "chrome-document-global-created" &&
     type !== "content-document-global-created")
   
     callback();
 }
 require("test").run(exports);
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -260,17 +260,17 @@ pref("ui.infotext", "#686868");
 pref("ui.window", "#ffffff");
 pref("ui.windowtext", "#000000");
 pref("ui.highlight", "#b2f2ff");
 
 // replace newlines with spaces on paste into single-line text boxes
 pref("editor.singleLine.pasteNewlines", 2);
 
 // threshold where a tap becomes a drag, in 1/240" reference pixels
-// The names of the preferences are to be in sync with nsEventStateManager.cpp
+// The names of the preferences are to be in sync with EventStateManager.cpp
 pref("ui.dragThresholdX", 25);
 pref("ui.dragThresholdY", 25);
 
 // Layers Acceleration.  We can only have nice things on gonk, because
 // they're not maintained anywhere else.
 pref("layers.offmainthreadcomposition.enabled", true);
 #ifndef MOZ_WIDGET_GONK
 pref("dom.ipc.tabs.disabled", true);
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1203,19 +1203,16 @@ pref("devtools.styleeditor.source-maps-e
 pref("devtools.styleeditor.autocompletion-enabled", true);
 
 // Enable the Shader Editor.
 pref("devtools.shadereditor.enabled", false);
 
 // Enable the Canvas Debugger.
 pref("devtools.canvasdebugger.enabled", false);
 
-// Enable tools for Chrome development.
-pref("devtools.chrome.enabled", false);
-
 // Default theme ("dark" or "light")
 pref("devtools.theme", "light");
 
 // Display the introductory text
 pref("devtools.gcli.hideIntro", false);
 
 // How eager are we to show help: never=1, sometimes=2, always=3
 pref("devtools.gcli.eagerHelper", 2);
--- a/browser/base/content/browser-fullZoom.js
+++ b/browser/base/content/browser-fullZoom.js
@@ -15,17 +15,17 @@ var FullZoom = {
 
   // browser.zoom.siteSpecific preference cache
   _siteSpecificPref: undefined,
 
   // browser.zoom.updateBackgroundTabs preference cache
   updateBackgroundTabs: undefined,
 
   // One of the possible values for the mousewheel.* preferences.
-  // From nsEventStateManager.h.
+  // From EventStateManager.h.
   ACTION_ZOOM: 3,
 
   // This maps the browser to monotonically increasing integer
   // tokens. _browserTokenMap[browser] is increased each time the zoom is
   // changed in the browser. See _getBrowserToken and _ignorePendingZoomAccesses.
   _browserTokenMap: new WeakMap(),
 
   get siteSpecific() {
@@ -79,17 +79,17 @@ var FullZoom = {
       case "DOMMouseScroll":
         this._handleMouseScrolled(event);
         break;
     }
   },
 
   _handleMouseScrolled: function FullZoom__handleMouseScrolled(event) {
     // Construct the "mousewheel action" pref key corresponding to this event.
-    // Based on nsEventStateManager::WheelPrefs::GetBasePrefName().
+    // Based on EventStateManager::WheelPrefs::GetBasePrefName().
     var pref = "mousewheel.";
 
     var pressedModifierCount = event.shiftKey + event.ctrlKey + event.altKey +
                                  event.metaKey + event.getModifierState("OS");
     if (pressedModifierCount != 1) {
       pref += "default.";
     } else if (event.shiftKey) {
       pref += "with_shift.";
@@ -114,17 +114,17 @@ var FullZoom = {
       return;
 
     // XXX Lazily cache all the possible action prefs so we don't have to get
     // them anew from the pref service for every scroll event?  We'd have to
     // make sure to observe them so we can update the cache when they change.
 
     // We have to call _applyZoomToPref in a timeout because we handle the
     // event before the event state manager has a chance to apply the zoom
-    // during nsEventStateManager::PostHandleEvent.
+    // during EventStateManager::PostHandleEvent.
     let browser = gBrowser.selectedBrowser;
     let token = this._getBrowserToken(browser);
     window.setTimeout(function () {
       if (token.isCurrent)
         this._applyZoomToPref(browser);
     }.bind(this), 0);
   },
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -3990,20 +3990,22 @@ var CombinedStopReload = {
   }
 };
 
 var TabsProgressListener = {
   onStateChange: function (aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
     // Collect telemetry data about tab load times.
     if (aWebProgress.isTopLevel) {
       if (aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW) {
-        if (aStateFlags & Ci.nsIWebProgressListener.STATE_START)
+        if (aStateFlags & Ci.nsIWebProgressListener.STATE_START) {
           TelemetryStopwatch.start("FX_PAGE_LOAD_MS", aBrowser);
-        else if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)
+          Services.telemetry.getHistogramById("FX_TOTAL_TOP_VISITS").add(true);
+        } else if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP) {
           TelemetryStopwatch.finish("FX_PAGE_LOAD_MS", aBrowser);
+        }
       } else if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
                  aStatus == Cr.NS_BINDING_ABORTED) {
         TelemetryStopwatch.cancel("FX_PAGE_LOAD_MS", aBrowser);
       }
     }
 
     // Attach a listener to watch for "click" events bubbling up from error
     // pages and other similar pages (like about:newtab). This lets us fix bugs
--- a/browser/base/content/newtab/newTab.css
+++ b/browser/base/content/newtab/newTab.css
@@ -202,8 +202,21 @@ input[type=button] {
  * 0.01 so that the core code detects that it's in fact a visible element.
  */
 .newtab-drag {
   width: 1px;
   height: 1px;
   background-color: #fff;
   opacity: 0.01;
 }
+
+/* PANEL */
+#sponsored-panel {
+  width: 330px;
+}
+
+#sponsored-panel description {
+  margin: 0;
+}
+
+#sponsored-panel .text-link {
+  margin: 12px 0 0;
+}
--- a/browser/base/content/newtab/newTab.xul
+++ b/browser/base/content/newtab/newTab.xul
@@ -12,16 +12,24 @@
   <!ENTITY % newTabDTD SYSTEM "chrome://browser/locale/newTab.dtd">
   %newTabDTD;
 ]>
 
 <xul:window id="newtab-window" xmlns="http://www.w3.org/1999/xhtml"
             xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
             title="&newtab.pageTitle;">
 
+  <xul:panel id="sponsored-panel" orient="vertical" type="arrow">
+    <xul:description>&newtab.panel.message;</xul:description>
+    <xul:label class="text-link"
+               href="&newtab.panel.link.url;"
+               onclick="this.parentNode.hidePopup();"
+               value="&newtab.panel.link.text;" />
+  </xul:panel>
+
   <div id="newtab-scrollbox">
 
     <div id="newtab-vertical-margin">
       <div id="newtab-margin-top">
         <div id="newtab-undo-container" undo-disabled="true">
           <xul:label id="newtab-undo-label"
                      value="&newtab.undo.removedLabel;" />
           <xul:button id="newtab-undo-button" tabindex="-1"
--- a/browser/base/content/newtab/page.js
+++ b/browser/base/content/newtab/page.js
@@ -18,16 +18,19 @@ let gPage = {
 
     // Listen for 'unload' to unregister this page.
     addEventListener("unload", this, false);
 
     // Listen for toggle button clicks.
     let button = document.getElementById("newtab-toggle");
     button.addEventListener("click", this, false);
 
+    // Initialize sponsored panel
+    this._sponsoredPanel = document.getElementById("sponsored-panel");
+
     // Check if the new tab feature is enabled.
     let enabled = gAllPages.enabled;
     if (enabled)
       this._init();
 
     this._updateAttributes(enabled);
   },
 
@@ -76,16 +79,31 @@ let gPage = {
     let skipUpdate = aOnlyIfHidden && this.allowBackgroundCaptures;
     // The grid might not be ready yet as we initialize it asynchronously.
     if (gGrid.ready && !skipUpdate) {
       gGrid.refresh();
     }
   },
 
   /**
+   * Shows sponsored panel
+   */
+  showSponsoredPanel: function Page_showSponsoredPanel(aTarget) {
+    if (this._sponsoredPanel.state == "closed") {
+      let self = this;
+      this._sponsoredPanel.addEventListener("popuphidden", function onPopupHidden(aEvent) {
+        self._sponsoredPanel.removeEventListener("popuphidden", onPopupHidden, false);
+        aTarget.removeAttribute("panelShown");
+      });
+    }
+    aTarget.setAttribute("panelShown", "true");
+    this._sponsoredPanel.openPopup(aTarget);
+  },
+
+  /**
    * Internally initializes the page. This runs only when/if the feature
    * is/gets enabled.
    */
   _init: function Page_init() {
     if (this._initialized)
       return;
 
     this._initialized = true;
--- a/browser/base/content/newtab/sites.js
+++ b/browser/base/content/newtab/sites.js
@@ -219,16 +219,18 @@ Site.prototype = {
         target.parentElement.classList.contains("newtab-link")) {
       this._recordSiteClicked(this.cell.index);
       return;
     }
 
     aEvent.preventDefault();
     if (aEvent.target.classList.contains("newtab-control-block"))
       this.block();
+    else if (target.classList.contains("newtab-control-sponsored"))
+      gPage.showSponsoredPanel(target);
     else if (this.isPinned())
       this.unpin();
     else
       this.pin();
   },
 
   /**
    * Handles all site events.
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -1663,17 +1663,17 @@ nsContextMenu.prototype = {
     if (this.onImage)
       return this.mediaURL;
     return "";
   },
 
   // Formats the 'Search <engine> for "<selection or link text>"' context menu.
   formatSearchContextItem: function() {
     var menuItem = document.getElementById("context-searchselect");
-    var selectedText = this.onLink ? this.linkText() : this.textSelected;
+    var selectedText = this.isTextSelected ? this.textSelected : this.linkText();
 
     // Store searchTerms in context menu item so we know what to search onclick
     menuItem.searchTerms = selectedText;
 
     if (selectedText.length > 15)
       selectedText = selectedText.substr(0,15) + this.ellipsis;
 
     // Use the current engine if the search bar is visible, the default
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -224,16 +224,17 @@ skip-if = true # browser_drag.js is disa
 [browser_getshortcutoruri.js]
 [browser_hide_removing.js]
 [browser_homeDrop.js]
 [browser_identity_UI.js]
 [browser_keywordBookmarklets.js]
 [browser_keywordSearch.js]
 [browser_keywordSearch_postData.js]
 [browser_lastAccessedTab.js]
+skip-if = toolkit == "windows" # Disabled on Windows due to frequent failures (bug 969405)
 [browser_locationBarCommand.js]
 skip-if = os == "linux" # Intermittent failures, bug 917535
 [browser_locationBarExternalLoad.js]
 [browser_menuButtonFitts.js]
 skip-if = os != "win" # The Fitts Law menu button is only supported on Windows (bug 969376)
 [browser_middleMouse_inherit.js]
 [browser_minimize.js]
 [browser_mixedcontent_securityflags.js]
--- a/browser/base/content/test/general/browser_bug970746.js
+++ b/browser/base/content/test/general/browser_bug970746.js
@@ -1,27 +1,27 @@
 /* Make sure context menu includes option to search hyperlink text on search engine */
 
 function test() {
   waitForExplicitFinish();
 
   gBrowser.selectedTab = gBrowser.addTab();
-  
+
   gBrowser.selectedBrowser.addEventListener("load", function() {
     gBrowser.selectedBrowser.removeEventListener("load", arguments.callee, true);
 
     let doc = gBrowser.contentDocument;
     let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
     let ellipsis = "\u2026";
 
     // Tests if the "Search <engine> for '<some terms>'" context menu item is shown for the
     // given query string of an element. Tests to make sure label includes the proper search terms.
     //
     // Options:
-    // 
+    //
     //   id: The id of the element to test.
     //   isSelected: Flag to enable selection (text hilight) the contents of the element
     //   shouldBeShown: The display state of the menu item
     //   expectedLabelContents: The menu item label should contain a portion of this string.
     //                          Will only be tested if shouldBeShown is true.
 
     let testElement = function(opts) {
       let element = doc.getElementById(opts.id);
@@ -89,16 +89,30 @@ function test() {
       expectedLabelContents: "I'm some text, " + ellipsis,
     });
     testElement({
       id: "mixedContent",
       isSelected: false,
       shouldBeShown: false,
     });
 
+    testElement({
+      id: "partialLink",
+      isSelected: true,
+      shouldBeShown: true,
+      expectedLabelContents: "link selection",
+    });
+
+    testElement({
+      id: "partialLink",
+      isSelected: false,
+      shouldBeShown: true,
+      expectedLabelContents: "A partial link " + ellipsis,
+    });
+
     // cleanup
     document.popupNode = null;
     gBrowser.removeCurrentTab();
     finish();
   }, true);
 
   content.location = "http://mochi.test:8888/browser/browser/base/content/test/general/browser_bug970746.xhtml";
-}
\ No newline at end of file
+}
--- a/browser/base/content/test/general/browser_bug970746.xhtml
+++ b/browser/base/content/test/general/browser_bug970746.xhtml
@@ -5,10 +5,12 @@
 		<a href="http://mozilla.org" id="longLink">I'm a really long link and I should be truncated.</a>
 
 		<span id="plainText">
 			Right clicking me when I'm selected should show the menu item.
 		</span>
 		<span id="mixedContent">
 			I'm some text, and <a href="http://mozilla.org">I'm a link!</a>
 		</span>
+
+		<a href="http://mozilla.org">A partial <span id="partialLink">link selection</span></a>
 	</body>
-</html>
\ No newline at end of file
+</html>
--- a/browser/base/content/test/newtab/browser.ini
+++ b/browser/base/content/test/newtab/browser.ini
@@ -16,12 +16,13 @@ skip-if = os == "mac" # Intermittent fai
 [browser_newtab_bug876313.js]
 [browser_newtab_disable.js]
 [browser_newtab_drag_drop.js]
 [browser_newtab_drag_drop_ext.js]
 [browser_newtab_drop_preview.js]
 [browser_newtab_focus.js]
 [browser_newtab_perwindow_private_browsing.js]
 [browser_newtab_reset.js]
+[browser_newtab_sponsored_icon_click.js]
 [browser_newtab_tabsync.js]
 [browser_newtab_undo.js]
 [browser_newtab_unpin.js]
 [browser_newtab_update.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function runTests() {
+  yield setLinks("0");
+  yield addNewTabPageTab();
+
+  let site = getCell(0).node.querySelector(".newtab-site");
+  site.setAttribute("type", "sponsored");
+
+  let sponsoredPanel = getContentDocument().getElementById("sponsored-panel");
+  is(sponsoredPanel.state, "closed", "Sponsored panel must be closed");
+
+  function continueOnceOn(event) {
+    sponsoredPanel.addEventListener(event, function listener() {
+      sponsoredPanel.removeEventListener(event, listener);
+      executeSoon(TestRunner.next);
+    });
+  }
+
+  // test sponsoredPanel appearing upon a click
+  continueOnceOn("popupshown");
+  let sponsoredButton = site.querySelector(".newtab-control-sponsored");
+  yield EventUtils.synthesizeMouseAtCenter(sponsoredButton, {}, getContentWindow());
+  is(sponsoredPanel.state, "open", "Sponsored panel opens on click");
+  ok(sponsoredButton.hasAttribute("panelShown"), "Sponsored button has panelShown attribute");
+
+  // test sponsoredPanel hiding
+  continueOnceOn("popuphidden");
+  yield sponsoredPanel.hidePopup();
+  is(sponsoredPanel.state, "closed", "Sponsored panel correctly closed/hidden");
+  ok(!sponsoredButton.hasAttribute("panelShown"), "Sponsored button does not have panelShown attribute");
+}
--- a/browser/devtools/framework/toolbox-options.xul
+++ b/browser/devtools/framework/toolbox-options.xul
@@ -26,20 +26,20 @@
                class="options-citation-label theme-comment"
                value="&options.toolNotSupported.label;"/>
 
       </vbox>
       <vbox class="options-vertical-pane" flex="1">
         <label value="&options.selectDevToolsTheme.label;"/>
         <radiogroup id="devtools-theme-box"
                     class="options-groupbox"
+                    data-pref="devtools.theme"
                     orient="horizontal">
-          <radio checked="true" value="light" label="Metal"/>
-          <radio checked="false" disabled="true" value="light" label="&options.lightTheme.label;"/>
-          <radio checked="false" disabled="true" value="dark" label="&options.darkTheme.label;"/>
+          <radio value="light" label="&options.lightTheme.label;"/>
+          <radio value="dark" label="&options.darkTheme.label;"/>
         </radiogroup>
         <label value="&options.commonPrefs.label;"/>
         <vbox id="commonprefs-options" class="options-groupbox">
           <checkbox label="&options.enablePersistentLogging.label;"
                     tooltiptext="&options.enablePersistentLogging.tooltip;"
                     data-pref="devtools.webconsole.persistlog"/>
         </vbox>
         <label value="&options.context.inspector;"/>
--- a/browser/devtools/scratchpad/scratchpad.xul
+++ b/browser/devtools/scratchpad/scratchpad.xul
@@ -109,16 +109,21 @@
        command="sp-cmd-errorConsole"
        modifiers="accel,shift"/>
   <key id="sp-key-hideSidebar"
        keycode="VK_ESCAPE"
        command="sp-cmd-hideSidebar"/>
   <key id="key_openHelp"
        keycode="VK_F1"
        command="sp-cmd-documentationLink"/>
+  <key id="key_gotoLine"
+       key="&gotoLineCmd.key;"
+       command="key_gotoLine"
+       modifiers="accel"/>
+
 </keyset>
 
 <menubar id="sp-menubar">
   <menu id="sp-file-menu" label="&fileMenu.label;" accesskey="&fileMenu.accesskey;">
     <menupopup id="sp-menu-filepopup">
       <menuitem id="sp-menu-newscratchpad"
                 label="&newWindowCmd.label;"
                 accesskey="&newWindowCmd.accesskey;"
--- a/browser/devtools/shared/theme-switching.js
+++ b/browser/devtools/shared/theme-switching.js
@@ -74,15 +74,15 @@
   const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
   Cu.import("resource://gre/modules/Services.jsm");
   Cu.import("resource:///modules/devtools/gDevTools.jsm");
   const {devtools} = Components.utils.import("resource://gre/modules/devtools/Loader.jsm", {});
   const StylesheetUtils = devtools.require("sdk/stylesheet/utils");
 
   let theme = Services.prefs.getCharPref("devtools.theme");
-  switchTheme("light");
+  switchTheme(theme);
 
   gDevTools.on("pref-changed", handlePrefChange);
   window.addEventListener("unload", function() {
     gDevTools.off("pref-changed", handlePrefChange);
   });
 })();
--- a/browser/devtools/styleeditor/StyleEditorUI.jsm
+++ b/browser/devtools/styleeditor/StyleEditorUI.jsm
@@ -10,22 +10,23 @@ this.EXPORTED_SYMBOLS = ["StyleEditorUI"
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cu = Components.utils;
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/PluralForm.jsm");
 Cu.import("resource://gre/modules/NetUtil.jsm");
 Cu.import("resource://gre/modules/osfile.jsm");
-let promise = Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js").Promise;
+Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/devtools/event-emitter.js");
 Cu.import("resource:///modules/devtools/gDevTools.jsm");
 Cu.import("resource:///modules/devtools/StyleEditorUtil.jsm");
 Cu.import("resource:///modules/devtools/SplitView.jsm");
 Cu.import("resource:///modules/devtools/StyleSheetEditor.jsm");
+const { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {});
 
 const require = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools.require;
 const { PrefObserver, PREF_ORIG_SOURCES } = require("devtools/styleeditor/utils");
 
 const LOAD_ERROR = "error-load";
 const STYLE_EDITOR_TEMPLATE = "stylesheet";
 
 /**
@@ -424,94 +425,107 @@ StyleEditorUI.prototype = {
 
         summary.addEventListener("focus", function onSummaryFocus(event) {
           if (event.target == summary) {
             // autofocus the stylesheet name
             summary.querySelector(".stylesheet-name").focus();
           }
         }, false);
 
-        // autofocus if it's a new user-created stylesheet
-        if (editor.isNew) {
-          this._selectEditor(editor);
-        }
+        Task.spawn(function* () {
+          // autofocus if it's a new user-created stylesheet
+          if (editor.isNew) {
+            yield this._selectEditor(editor);
+          }
 
-        if (this._styleSheetToSelect
-            && this._styleSheetToSelect.href == editor.styleSheet.href) {
-          this.switchToSelectedSheet();
-        }
+          if (this._styleSheetToSelect
+              && this._styleSheetToSelect.href == editor.styleSheet.href) {
+            yield this.switchToSelectedSheet();
+          }
 
-        // If this is the first stylesheet and there is no pending request to
-        // select a particular style sheet, select this sheet.
-        if (!this.selectedEditor && !this._styleSheetBoundToSelect
-            && editor.styleSheet.styleSheetIndex == 0) {
-          this._selectEditor(editor);
-        }
+          // If this is the first stylesheet and there is no pending request to
+          // select a particular style sheet, select this sheet.
+          if (!this.selectedEditor && !this._styleSheetBoundToSelect
+              && editor.styleSheet.styleSheetIndex == 0) {
+            yield this._selectEditor(editor);
+          }
 
-        this.emit("editor-added", editor);
+          this.emit("editor-added", editor);
+        }.bind(this)).then(null, Cu.reportError);
       }.bind(this),
 
       onShow: function(summary, details, data) {
         let editor = data.editor;
         this.selectedEditor = editor;
 
-        if (!editor.sourceEditor) {
-          // only initialize source editor when we switch to this view
-          let inputElement = details.querySelector(".stylesheet-editor-input");
-          editor.load(inputElement);
-        }
-        editor.onShow();
+        Task.spawn(function* () {
+          if (!editor.sourceEditor) {
+            // only initialize source editor when we switch to this view
+            let inputElement = details.querySelector(".stylesheet-editor-input");
+            yield editor.load(inputElement);
+          }
 
-        this.emit("editor-selected", editor);
+          editor.onShow();
+
+          this.emit("editor-selected", editor);
+        }.bind(this)).then(null, Cu.reportError);
       }.bind(this)
     });
   },
 
   /**
    * Switch to the editor that has been marked to be selected.
+   *
+   * @return {Promise}
+   *         Promise that will resolve when the editor is selected.
    */
   switchToSelectedSheet: function() {
     let sheet = this._styleSheetToSelect;
 
-    for each (let editor in this.editors) {
+    for (let editor of this.editors) {
       if (editor.styleSheet.href == sheet.href) {
         // The _styleSheetBoundToSelect will always hold the latest pending
         // requested style sheet (with line and column) which is not yet
         // selected by the source editor. Only after we select that particular
         // editor and go the required line and column, it will become null.
         this._styleSheetBoundToSelect = this._styleSheetToSelect;
-        this._selectEditor(editor, sheet.line, sheet.col);
         this._styleSheetToSelect = null;
-        return;
+        return this._selectEditor(editor, sheet.line, sheet.col);
       }
     }
+
+    return promise.resolve();
   },
 
   /**
    * Select an editor in the UI.
    *
    * @param  {StyleSheetEditor} editor
    *         Editor to switch to.
    * @param  {number} line
    *         Line number to jump to
    * @param  {number} col
    *         Column number to jump to
+   * @return {Promise}
+   *         Promise that will resolve when the editor is selected.
    */
   _selectEditor: function(editor, line, col) {
     line = line || 0;
     col = col || 0;
 
-    editor.getSourceEditor().then(() => {
+    let editorPromise = editor.getSourceEditor().then(() => {
       editor.sourceEditor.setCursor({line: line, ch: col});
       this._styleSheetBoundToSelect = null;
     });
 
-    this.getEditorSummary(editor).then((summary) => {
+    let summaryPromise = this.getEditorSummary(editor).then((summary) => {
       this._view.activeSummary = summary;
-    })
+    });
+
+    return promise.all([editorPromise, summaryPromise]);
   },
 
   getEditorSummary: function(editor) {
     if (editor.summary) {
       return promise.resolve(editor.summary);
     }
 
     let deferred = promise.defer();
--- a/browser/devtools/styleeditor/StyleSheetEditor.jsm
+++ b/browser/devtools/styleeditor/StyleSheetEditor.jsm
@@ -8,17 +8,17 @@
 this.EXPORTED_SYMBOLS = ["StyleSheetEditor"];
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cu = Components.utils;
 
 const require = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools.require;
 const Editor  = require("devtools/sourceeditor/editor");
-const promise = require("sdk/core/promise");
+const {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
 const {CssLogic} = require("devtools/styleinspector/css-logic");
 const AutoCompleter = require("devtools/sourceeditor/autocomplete");
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/FileUtils.jsm");
 Cu.import("resource://gre/modules/NetUtil.jsm");
 Cu.import("resource://gre/modules/osfile.jsm");
 Cu.import("resource://gre/modules/devtools/event-emitter.js");
@@ -241,32 +241,37 @@ StyleSheetEditor.prototype = {
   _onError: function(event, errorCode) {
     this.emit("error", errorCode);
   },
 
   /**
    * Create source editor and load state into it.
    * @param  {DOMElement} inputElement
    *         Element to load source editor in
+   *
+   * @return {Promise}
+   *         Promise that will resolve when the style editor is loaded.
    */
   load: function(inputElement) {
     this._inputElement = inputElement;
 
     let config = {
       value: this._state.text,
       lineNumbers: true,
       mode: Editor.modes.css,
       readOnly: false,
       autoCloseBrackets: "{}()[]",
       extraKeys: this._getKeyBindings(),
       contextMenu: "sourceEditorContextMenu"
     };
     let sourceEditor = new Editor(config);
 
-    sourceEditor.appendTo(inputElement).then(() => {
+    sourceEditor.on("dirty-change", this._onPropertyChange);
+
+    return sourceEditor.appendTo(inputElement).then(() => {
       if (Services.prefs.getBoolPref(AUTOCOMPLETION_PREF)) {
         sourceEditor.extend(AutoCompleter);
         sourceEditor.setupAutoCompletion(this.walker);
       }
       sourceEditor.on("save", () => {
         this.saveToFile();
       });
 
@@ -284,18 +289,16 @@ StyleSheetEditor.prototype = {
       }
 
       sourceEditor.setFirstVisibleLine(this._state.topIndex);
       sourceEditor.setSelection(this._state.selection.start,
                                 this._state.selection.end);
 
       this.emit("source-editor-load");
     });
-
-    sourceEditor.on("dirty-change", this._onPropertyChange);
   },
 
   /**
    * Get the source editor for this editor.
    *
    * @return {Promise}
    *         Promise that will resolve with the editor.
    */
--- a/browser/devtools/styleeditor/styleeditor-panel.js
+++ b/browser/devtools/styleeditor/styleeditor-panel.js
@@ -4,17 +4,17 @@
  * 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, Ci, Cu, Cr} = require("chrome");
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 
-let promise = require("sdk/core/promise");
+let {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
 let EventEmitter = require("devtools/toolkit/event-emitter");
 
 Cu.import("resource:///modules/devtools/StyleEditorUI.jsm");
 Cu.import("resource:///modules/devtools/StyleEditorUtil.jsm");
 
 loader.lazyGetter(this, "StyleSheetsFront",
   () => require("devtools/server/actors/stylesheets").StyleSheetsFront);
 
--- a/browser/devtools/styleeditor/test/browser_styleeditor_autocomplete.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_autocomplete.js
@@ -83,26 +83,24 @@ let TEST_CASES = [
 let gEditor;
 let gPopup;
 let index = 0;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    panel.UI.on("editor-added", testEditorAdded);
-  });
+  addTabAndOpenStyleEditors(1, testEditorAdded);
 
   content.location = TESTCASE_URI;
 }
 
-function testEditorAdded(aEvent, aEditor) {
+function testEditorAdded(panel) {
   info("Editor added, getting the source editor and starting tests");
-  aEditor.getSourceEditor().then(editor => {
+  panel.UI.editors[0].getSourceEditor().then(editor => {
     info("source editor found, starting tests.");
     gEditor = editor.sourceEditor;
     gPopup = gEditor.getAutocompletionPopup();
     waitForFocus(testState, gPanelWindow);
   });
 }
 
 function testState() {
@@ -179,26 +177,24 @@ function checkState() {
 
 function testAutocompletionDisabled() {
   gBrowser.removeCurrentTab();
 
   index = 0;
   info("Starting test to check if autocompletion is disabled correctly.")
   Services.prefs.setBoolPref(AUTOCOMPLETION_PREF, false);
 
-  addTabAndOpenStyleEditor(function(panel) {
-    panel.UI.on("editor-added", testEditorAddedDisabled);
-  });
+  addTabAndOpenStyleEditors(1, testEditorAddedDisabled);
 
   content.location = TESTCASE_URI;
 }
 
-function testEditorAddedDisabled(aEvent, aEditor) {
+function testEditorAddedDisabled(panel) {
   info("Editor added, getting the source editor and starting tests");
-  aEditor.getSourceEditor().then(editor => {
+  panel.UI.editors[0].getSourceEditor().then(editor => {
     ok(!editor.sourceEditor.getAutocompletionPopup,
        "Autocompletion popup does not exist");
     cleanup();
   });
 }
 
 function cleanup() {
   Services.prefs.clearUserPref(AUTOCOMPLETION_PREF);
--- a/browser/devtools/styleeditor/test/browser_styleeditor_bug_740541_iframes.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_bug_740541_iframes.js
@@ -65,26 +65,14 @@ function test()
                                 [])]),
      makeDocument([SIMPLE], []),
      SIMPLE_DOCUMENT
     ]);
 
   const EXPECTED_STYLE_SHEET_COUNT = 12;
 
   waitForExplicitFinish();
-  let styleSheetCount = 0;
-  addTabAndOpenStyleEditor(function (aPanel) {
-    aPanel.UI.on("editor-added", function () {
-      ++styleSheetCount;
-      info(styleSheetCount+" out of "+
-           EXPECTED_STYLE_SHEET_COUNT+" style sheets loaded");
-      if (styleSheetCount == EXPECTED_STYLE_SHEET_COUNT) {
-        ok(true, "all style sheets loaded");
-        // The right number of events have been received; check that
-        // they actually show up in the style editor UI.
-        is(aPanel.UI.editors.length, EXPECTED_STYLE_SHEET_COUNT,
-           "UI elements present");
-        finish();
-      }
-    });
-  });
+
+  // Wait for events until the right number of editors has been opened.
+  addTabAndOpenStyleEditors(EXPECTED_STYLE_SHEET_COUNT, () => finish());
+
   content.location = TESTCASE_URI;
 }
--- a/browser/devtools/styleeditor/test/browser_styleeditor_bug_851132_middle_click.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_bug_851132_middle_click.js
@@ -3,34 +3,26 @@
 
 const TESTCASE_URI = TEST_BASE + "four.html";
 
 let gUI;
 
 function test() {
   waitForExplicitFinish();
 
-  let count = 0;
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", function(event, editor) {
-      count++;
-      if (count == 4) {
-        info("all editors added");
-        runTests();
-      }
-    })
-  });
+  addTabAndOpenStyleEditors(4, runTests);
 
   content.location = TESTCASE_URI;
 }
 
 let timeoutID;
 
-function runTests() {
+function runTests(panel) {
+  gUI = panel.UI;
+
   gBrowser.tabContainer.addEventListener("TabOpen", onTabAdded, false);
   gUI.editors[0].getSourceEditor().then(onEditor0Attach);
   gUI.editors[1].getSourceEditor().then(onEditor1Attach);
 }
 
 function getStylesheetNameLinkFor(aEditor) {
   return aEditor.summary.querySelector(".stylesheet-name");
 }
@@ -45,26 +37,29 @@ function onEditor0Attach(aEditor) {
       {button: 0},
       gPanelWindow);
   }, gPanelWindow);
 }
 
 function onEditor1Attach(aEditor) {
   info("second editor selected");
 
-  ok(aEditor.sourceEditor.hasFocus(),
-     "left mouse click has given editor 1 focus");
+  // Wait for the focus to be set.
+  executeSoon(function () {
+    ok(aEditor.sourceEditor.hasFocus(),
+       "left mouse click has given editor 1 focus");
 
-  // right mouse click should not open a new tab
-  EventUtils.synthesizeMouseAtCenter(
-    getStylesheetNameLinkFor(gUI.editors[2]),
-    {button: 1},
-    gPanelWindow);
+    // right mouse click should not open a new tab
+    EventUtils.synthesizeMouseAtCenter(
+      getStylesheetNameLinkFor(gUI.editors[2]),
+      {button: 1},
+      gPanelWindow);
 
-  setTimeout(finish, 0);
+    setTimeout(finish, 0);
+  });
 }
 
 function onTabAdded() {
   ok(false, "middle mouse click has opened a new tab");
   finish();
 }
 
 registerCleanupFunction(function () {
--- a/browser/devtools/styleeditor/test/browser_styleeditor_bug_870339.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_bug_870339.js
@@ -13,17 +13,17 @@ function test()
              '  <link rel="stylesheet" type="text/css" href="'+SIMPLE+'">',
              " </head>",
              " <body>",
              " </body>",
              "</html>"
             ].join("\n"));
 
   waitForExplicitFinish();
-  addTabAndOpenStyleEditor(function (aPanel) {
+  addTabAndOpenStyleEditors(1, function (aPanel) {
     let UI = aPanel.UI;
 
     // Spam the _onNewDocument callback multiple times before the
     // StyleEditorActor has a chance to respond to the first one.
     const SPAM_COUNT = 2;
     for (let i=0; i<SPAM_COUNT; ++i) {
       UI._onNewDocument();
     }
--- a/browser/devtools/styleeditor/test/browser_styleeditor_enabled.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_enabled.js
@@ -5,26 +5,21 @@
 // https rather than chrome to improve coverage
 const TESTCASE_URI = TEST_BASE_HTTPS + "simple.html";
 
 function test()
 {
   waitForExplicitFinish();
 
   let count = 0;
-  addTabAndOpenStyleEditor(function(panel) {
+  addTabAndOpenStyleEditors(2, function(panel) {
+    // we test against first stylesheet after all are ready
     let UI = panel.UI;
-    UI.on("editor-added", function(event, editor) {
-      count++;
-      if (count == 2) {
-        // we test against first stylesheet after all are ready
-        let editor = UI.editors[0];
-        editor.getSourceEditor().then(runTests.bind(this, UI, editor));
-      }
-    })
+    let editor = UI.editors[0];
+    editor.getSourceEditor().then(runTests.bind(this, UI, editor));
   });
 
   content.location = TESTCASE_URI;
 }
 
 function runTests(UI, editor)
 {
   testEnabledToggle(UI, editor);
--- a/browser/devtools/styleeditor/test/browser_styleeditor_filesave.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_filesave.js
@@ -15,25 +15,20 @@ let FileUtils = tempScope.FileUtils;
 let NetUtil = tempScope.NetUtil;
 
 function test()
 {
   waitForExplicitFinish();
 
   copy(TESTCASE_URI_HTML, "simple.html", function(htmlFile) {
     copy(TESTCASE_URI_CSS, "simple.css", function(cssFile) {
-      addTabAndOpenStyleEditor(function(panel) {
+      addTabAndOpenStyleEditors(1, function(panel) {
         let UI = panel.UI;
-        UI.on("editor-added", function(event, editor) {
-          if (editor.styleSheet.styleSheetIndex != 0) {
-            return;  // we want to test against the first stylesheet
-          }
-          let editor = UI.editors[0];
-          editor.getSourceEditor().then(runTests.bind(this, editor));
-        })
+        let editor = UI.editors[0];
+        editor.getSourceEditor().then(runTests.bind(this, editor));
       });
 
       let uri = Services.io.newFileURI(htmlFile);
       let filePath = uri.resolve("");
       content.location = filePath;
     });
   });
 }
--- a/browser/devtools/styleeditor/test/browser_styleeditor_import.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_import.js
@@ -14,20 +14,17 @@ const SOURCE = "body{background:red;}";
 
 
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", testEditorAdded);
-  });
+  addTabAndCheckOnStyleEditorAdded(panel => gUI = panel.UI, testEditorAdded);
 
   content.location = TESTCASE_URI;
 }
 
 function testImport()
 {
   // create file to import first
   let file = FileUtils.getFile("ProfD", [FILENAME]);
@@ -48,17 +45,17 @@ function testImport()
       ok(importButton, "import button exists");
 
       EventUtils.synthesizeMouseAtCenter(importButton, {}, gPanelWindow);
     }, gPanelWindow);
   });
 }
 
 let gAddedCount = 0;
-function testEditorAdded(aEvent, aEditor)
+function testEditorAdded(aEditor)
 {
   if (++gAddedCount == 2) {
     // test import after the 2 initial stylesheets have been loaded
     gUI.editors[0].getSourceEditor().then(function() {
       testImport();
     });
   }
 
--- a/browser/devtools/styleeditor/test/browser_styleeditor_import_rule.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_import_rule.js
@@ -6,30 +6,24 @@
 const TESTCASE_URI = TEST_BASE_HTTP + "import.html";
 
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", onEditorAdded);
-  });
+  addTabAndOpenStyleEditors(3, onEditorAdded);
 
   content.location = TESTCASE_URI;
 }
 
-let gAddedCount = 0;
-function onEditorAdded()
+function onEditorAdded(panel)
 {
-  if (++gAddedCount != 3) {
-    return;
-  }
+  gUI = panel.UI;
 
   is(gUI.editors.length, 3,
     "there are 3 stylesheets after loading @imports");
 
   is(gUI.editors[0].styleSheet.href, TEST_BASE_HTTP + "simple.css",
     "stylesheet 1 is simple.css");
 
   is(gUI.editors[1].styleSheet.href, TEST_BASE_HTTP + "import.css",
--- a/browser/devtools/styleeditor/test/browser_styleeditor_init.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_init.js
@@ -5,26 +5,23 @@
 const TESTCASE_URI = TEST_BASE + "simple.html";
 
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", testEditorAdded);
-  });
+  addTabAndCheckOnStyleEditorAdded(panel => gUI = panel.UI, testEditorAdded);
 
   content.location = TESTCASE_URI;
 }
 
 let gEditorAddedCount = 0;
-function testEditorAdded(aEvent, aEditor)
+function testEditorAdded(aEditor)
 {
   if (aEditor.styleSheet.styleSheetIndex == 0) {
     gEditorAddedCount++;
     testFirstStyleSheetEditor(aEditor);
   }
   if (aEditor.styleSheet.styleSheetIndex == 1) {
     gEditorAddedCount++;
     testSecondStyleSheetEditor(aEditor);
--- a/browser/devtools/styleeditor/test/browser_styleeditor_inline_friendly_names.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_inline_friendly_names.js
@@ -7,25 +7,24 @@ let gUI;
 const FIRST_TEST_PAGE = TEST_BASE + "inline-1.html"
 const SECOND_TEST_PAGE = TEST_BASE + "inline-2.html"
 const SAVE_PATH = "test.css";
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
+  addTabAndOpenStyleEditors(2, function(panel) {
     gUI = panel.UI;
 
     // First test that identifiers are correcly generated. If not other tests
     // are likely to fail.
     testIndentifierGeneration();
 
-    waitForEditors(2)
-    .then(saveFirstInlineStyleSheet)
+    saveFirstInlineStyleSheet()
     .then(testFriendlyNamesAfterSave)
     .then(reloadPage)
     .then(testFriendlyNamesAfterSave)
     .then(navigateToAnotherPage)
     .then(testFriendlyNamesAfterNavigation)
     .then(finishTests);
   });
 
@@ -88,20 +87,19 @@ function reloadPage() {
 
 function navigateToAnotherPage() {
   info("Navigating to another page.");
   let deferred = promise.defer();
   gBrowser.removeCurrentTab();
 
   gUI = null;
 
-  addTabAndOpenStyleEditor(function(panel) {
+  addTabAndOpenStyleEditors(2, function(panel) {
     gUI = panel.UI;
-
-    waitForEditors(2).then(deferred.resolve);
+    deferred.resolve();
   });
 
   content.location = SECOND_TEST_PAGE;
   return deferred.promise;
 }
 
 function testFriendlyNamesAfterNavigation() {
   let firstEditor = gUI.editors[0];
--- a/browser/devtools/styleeditor/test/browser_styleeditor_loading.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_loading.js
@@ -9,21 +9,19 @@ function test()
 {
   waitForExplicitFinish();
 
   // launch Style Editor right when the tab is created (before load)
   // this checks that the Style Editor still launches correctly when it is opened
   // *while* the page is still loading. The Style Editor should not signal that
   // it is loaded until the accompanying content page is loaded.
 
-  addTabAndOpenStyleEditor(function(panel) {
-    panel.UI.on("editor-added", testEditorAdded);
-
+  addTabAndCheckOnStyleEditorAdded(function(panel) {
     content.location = TESTCASE_URI;
-  });
+  }, testEditorAdded);
 }
 
 function testEditorAdded(event, editor)
 {
   let root = gPanelWindow.document.querySelector(".splitview-root");
   ok(!root.classList.contains("loading"),
      "style editor root element does not have 'loading' class name anymore");
 
--- a/browser/devtools/styleeditor/test/browser_styleeditor_new.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_new.js
@@ -8,34 +8,31 @@ let TRANSITION_CLASS = "moz-styleeditor-
 let TESTCASE_CSS_SOURCE = "body{background-color:red;";
 
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", testEditorAdded);
-  });
+  addTabAndCheckOnStyleEditorAdded(panel => gUI = panel.UI, testEditorAdded);
 
   content.location = TESTCASE_URI;
 }
 
 let gAddedCount = 0;  // to add new stylesheet after the 2 initial stylesheets
 let gNewEditor;       // to make sure only one new stylesheet got created
 let gOriginalHref;
 
 let checksCompleted = 0;
 
-function testEditorAdded(aEvent, aEditor)
+function testEditorAdded(aEditor)
 {
-  gAddedCount++;
-  if (gAddedCount == 2) {
+  info("added " + gAddedCount + " editors");
+  if (++gAddedCount == 2) {
     waitForFocus(function () {// create a new style sheet
       let newButton = gPanelWindow.document.querySelector(".style-editor-newButton");
       ok(newButton, "'new' button exists");
 
       EventUtils.synthesizeMouseAtCenter(newButton, {}, gPanelWindow);
     }, gPanelWindow);
   }
   if (gAddedCount < 3) {
--- a/browser/devtools/styleeditor/test/browser_styleeditor_nostyle.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_nostyle.js
@@ -9,21 +9,21 @@ function test()
 {
   waitForExplicitFinish();
 
   // launch Style Editor right when the tab is created (before load)
   // this checks that the Style Editor still launches correctly when it is opened
   // *while* the page is still loading. The Style Editor should not signal that
   // it is loaded until the accompanying content page is loaded.
 
-  addTabAndOpenStyleEditor(function(panel) {
+  addTabAndCheckOnStyleEditorAdded(function(panel) {
     panel.UI.once("stylesheets-reset", testDocumentLoad);
 
     content.location = TESTCASE_URI;
-  });
+  }, () => {});
 }
 
 function testDocumentLoad(event)
 {
   let root = gPanelWindow.document.querySelector(".splitview-root");
   ok(!root.classList.contains("loading"),
      "style editor root element does not have 'loading' class name anymore");
 
--- a/browser/devtools/styleeditor/test/browser_styleeditor_pretty.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_pretty.js
@@ -5,22 +5,19 @@
 const TESTCASE_URI = TEST_BASE + "minified.html";
 
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", function(event, editor) {
-      editor.getSourceEditor().then(function() {
-        testEditor(editor);
-      });
+  addTabAndCheckOnStyleEditorAdded(panel => gUI = panel.UI, editor => {
+    editor.getSourceEditor().then(function() {
+      testEditor(editor);
     });
   });
 
   content.location = TESTCASE_URI;
 }
 
 let editorTestedCount = 0;
 function testEditor(aEditor)
--- a/browser/devtools/styleeditor/test/browser_styleeditor_reload.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_reload.js
@@ -10,28 +10,20 @@ const COL_NO = 3;
 
 let gContentWin;
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
+  addTabAndOpenStyleEditors(2, function(panel) {
     gContentWin = gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject;
     gUI = panel.UI;
-
-    let count = 0;
-    gUI.on("editor-added", function editorAdded(event, editor) {
-      if (++count == 2) {
-        info("all editors added to UI");
-        gUI.off("editor-added", editorAdded);
-        gUI.editors[0].getSourceEditor().then(runTests);
-      }
-    })
+    gUI.editors[0].getSourceEditor().then(runTests);
   });
 
   content.location = TESTCASE_URI;
 }
 
 function runTests()
 {
   let count = 0;
--- a/browser/devtools/styleeditor/test/browser_styleeditor_selectstylesheet.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_selectstylesheet.js
@@ -10,27 +10,20 @@ const COL_NO  = 0;
 
 let gContentWin;
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
+  addTabAndOpenStyleEditors(2, function(panel) {
     gContentWin = gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject;
     gUI = panel.UI;
-
-    let count = 0;
-    gUI.on("editor-added", function editorAdded(event, editor) {
-      if (++count == 2) {
-        gUI.off("editor-added", editorAdded);
-        gUI.editors[0].getSourceEditor().then(runTests);
-      }
-    })
+    gUI.editors[0].getSourceEditor().then(runTests);
   });
 
   content.location = TESTCASE_URI;
 }
 
 function runTests()
 {
   let count = 0;
--- a/browser/devtools/styleeditor/test/browser_styleeditor_sourcemap_watching.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_sourcemap_watching.js
@@ -66,36 +66,29 @@ function test()
 
     info("wrote to CSS file");
   })
 }
 
 function openEditor(testcaseURI) {
   let deferred = promise.defer();
 
-  addTabAndOpenStyleEditor((panel) => {
-    info("style editor panel opened");
-
+  addTabAndOpenStyleEditors(3, panel => {
     let UI = panel.UI;
-    let count = 0;
 
-    UI.on("editor-added", (event, editor) => {
-      if (++count == 3) {
-        // wait for 3 editors - 1 for first style sheet, 1 for the
-        // generated style sheet, and 1 for original source after it
-        // loads and replaces the generated style sheet.
-        let editor = UI.editors[1];
+    // wait for 3 editors - 1 for first style sheet, 1 for the
+    // generated style sheet, and 1 for original source after it
+    // loads and replaces the generated style sheet.
+    let editor = UI.editors[1];
 
-        let link = getStylesheetNameLinkFor(editor);
-        link.click();
+    let link = getStylesheetNameLinkFor(editor);
+    link.click();
 
-        editor.getSourceEditor().then(deferred.resolve);
-      }
-    });
-  })
+    editor.getSourceEditor().then(deferred.resolve);
+  });
   content.location = testcaseURI;
 
   return deferred.promise;
 }
 
 function editSCSS(editor) {
   let deferred = promise.defer();
 
--- a/browser/devtools/styleeditor/test/browser_styleeditor_sourcemaps.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_sourcemaps.js
@@ -7,28 +7,20 @@ const TESTCASE_URI = TEST_BASE_HTTPS + "
 const PREF = "devtools.styleeditor.source-maps-enabled";
 
 function test()
 {
   waitForExplicitFinish();
 
   Services.prefs.setBoolPref(PREF, true);
 
-  let count = 0;
-  addTabAndOpenStyleEditor(function(panel) {
-    let UI = panel.UI;
-    UI.on("editor-added", (event, editor) => {
-      if (++count == 3) {
-        // wait for 3 editors - 1 for first style sheet, 1 for the
-        // generated style sheet, and 1 for original source after it
-        // loads and replaces the generated style sheet.
-        runTests(UI);
-      }
-    })
-  });
+  // wait for 3 editors - 1 for first style sheet, 1 for the
+  // generated style sheet, and 1 for original source after it
+  // loads and replaces the generated style sheet.
+  addTabAndOpenStyleEditors(3, panel => runTests(panel.UI));
 
   content.location = TESTCASE_URI;
 }
 
 function runTests(UI)
 {
   is(UI.editors.length, 2);
 
--- a/browser/devtools/styleeditor/test/browser_styleeditor_sv_keynav.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_sv_keynav.js
@@ -5,30 +5,24 @@
 const TESTCASE_URI = TEST_BASE + "four.html";
 
 let gUI;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    gUI = panel.UI;
-    gUI.on("editor-added", function(event, editor) {
-      if (editor == gUI.editors[3]) {
-        runTests();
-      }
-    });
-  });
+  addTabAndOpenStyleEditors(4, runTests);
 
   content.location = TESTCASE_URI;
 }
 
-function runTests()
+function runTests(panel)
 {
+  gUI = panel.UI;
   gUI.editors[0].getSourceEditor().then(onEditor0Attach);
   gUI.editors[2].getSourceEditor().then(onEditor2Attach);
 }
 
 function getStylesheetNameLinkFor(aEditor)
 {
   return aEditor.summary.querySelector(".stylesheet-name");
 }
@@ -65,14 +59,17 @@ function onEditor0Attach(aEditor)
 
     EventUtils.synthesizeKey("VK_RETURN", {}, gPanelWindow);
     // this will attach and give focus editor 2
   }, gPanelWindow);
 }
 
 function onEditor2Attach(aEditor)
 {
-  ok(aEditor.sourceEditor.hasFocus(),
-     "editor 2 has focus");
+  // Wait for the focus to be set.
+  executeSoon(function () {
+    ok(aEditor.sourceEditor.hasFocus(),
+       "editor 2 has focus");
 
-  gUI = null;
-  finish();
+    gUI = null;
+    finish();
+  });
 }
--- a/browser/devtools/styleeditor/test/browser_styleeditor_sv_resize.js
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_sv_resize.js
@@ -6,25 +6,17 @@ const TESTCASE_URI = TEST_BASE + "simple
 
 let gOriginalWidth; // these are set by runTests()
 let gOriginalHeight;
 
 function test()
 {
   waitForExplicitFinish();
 
-  addTabAndOpenStyleEditor(function(panel) {
-    let UI = panel.UI;
-    UI.on("editor-added", function(event, editor) {
-      if (editor == UI.editors[1]) {
-        // wait until both editors are added
-        runTests(UI);
-      }
-    });
-  });
+  addTabAndOpenStyleEditors(2, panel => runTests(panel.UI));
 
   content.location = TESTCASE_URI;
 }
 
 function runTests(aUI)
 {
   is(aUI.editors.length, 2,
      "there is 2 stylesheets initially");
--- a/browser/devtools/styleeditor/test/head.js
+++ b/browser/devtools/styleeditor/test/head.js
@@ -31,21 +31,42 @@ SimpleTest.registerCleanupFunction(() =>
 function cleanup()
 {
   gPanelWindow = null;
   while (gBrowser.tabs.length > 1) {
     gBrowser.removeCurrentTab();
   }
 }
 
-function addTabAndOpenStyleEditor(callback) {
+function addTabAndOpenStyleEditors(count, callback) {
+  let currentCount = 0;
+  let panel;
+  addTabAndCheckOnStyleEditorAdded(p => panel = p, function () {
+    currentCount++;
+    info(currentCount + " of " + count + " editors opened");
+    if (currentCount == count) {
+      callback(panel);
+    }
+  });
+}
+
+function addTabAndCheckOnStyleEditorAdded(callbackOnce, callbackOnAdded) {
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
     gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
-    openStyleEditorInWindow(window, callback);
+    openStyleEditorInWindow(window, function (panel) {
+      // Execute the individual callback with the panel argument.
+      callbackOnce(panel);
+      // Report editors that already opened while loading.
+      for (let editor of panel.UI.editors) {
+        callbackOnAdded(editor);
+      }
+      // Report new editors added afterwards.
+      panel.UI.on("editor-added", (event, editor) => callbackOnAdded(editor));
+    });
   }, true);
 }
 
 function openStyleEditorInWindow(win, callback) {
   let target = TargetFactory.forTab(win.gBrowser.selectedTab);
   win.gDevTools.showToolbox(target, "styleeditor").then(function(toolbox) {
     let panel = toolbox.getCurrentPanel();
     gPanelWindow = panel._panelWin;
--- a/browser/devtools/styleinspector/computed-view.js
+++ b/browser/devtools/styleinspector/computed-view.js
@@ -4,17 +4,17 @@
  * 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, Ci, Cu} = require("chrome");
 
 const ToolDefinitions = require("main").Tools;
 const {CssLogic} = require("devtools/styleinspector/css-logic");
 const {ELEMENT_STYLE} = require("devtools/server/actors/styles");
-const promise = require("sdk/core/promise");
+const {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
 const {EventEmitter} = require("devtools/toolkit/event-emitter");
 const {OutputParser} = require("devtools/output-parser");
 const {Tooltip} = require("devtools/shared/widgets/Tooltip");
 const {PrefObserver, PREF_ORIG_SOURCES} = require("devtools/styleeditor/utils");
 const {gDevTools} = Cu.import("resource:///modules/devtools/gDevTools.jsm", {});
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/PluralForm.jsm");
--- a/browser/devtools/styleinspector/rule-view.js
+++ b/browser/devtools/styleinspector/rule-view.js
@@ -2,17 +2,17 @@
 /* vim: set ts=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/. */
 
 "use strict";
 
 const {Cc, Ci, Cu} = require("chrome");
-const promise = require("sdk/core/promise");
+const {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
 const {CssLogic} = require("devtools/styleinspector/css-logic");
 const {InplaceEditor, editableField, editableItem} = require("devtools/shared/inplace-editor");
 const {ELEMENT_STYLE, PSEUDO_ELEMENTS} = require("devtools/server/actors/styles");
 const {gDevTools} = Cu.import("resource:///modules/devtools/gDevTools.jsm", {});
 const {Tooltip, SwatchColorPickerTooltip} = require("devtools/shared/widgets/Tooltip");
 const {OutputParser} = require("devtools/output-parser");
 const {PrefObserver, PREF_ORIG_SOURCES} = require("devtools/styleeditor/utils");
 const {parseSingleValue, parseDeclarations} = require("devtools/styleinspector/css-parsing-utils");
@@ -124,39 +124,42 @@ function ElementStyle(aElement, aStore, 
   // if it doesn't already exist.
   if (!("userProperties" in this.store)) {
     this.store.userProperties = new UserProperties();
   }
 
   if (!("disabled" in this.store)) {
     this.store.disabled = new WeakMap();
   }
-
-  // To figure out how shorthand properties are interpreted by the
-  // engine, we will set properties on a dummy element and observe
-  // how their .style attribute reflects them as computed values.
-  this.dummyElementPromise = createDummyDocument().then(document => {
-    this.dummyElement = document.createElementNS(this.element.namespaceURI,
-                                                 this.element.tagName);
-    document.documentElement.appendChild(this.dummyElement);
-    return this.dummyElement;
-  }).then(null, promiseWarn);
 }
 
 // We're exporting _ElementStyle for unit tests.
 exports._ElementStyle = ElementStyle;
 
 ElementStyle.prototype = {
   // The element we're looking at.
   element: null,
 
   // Empty, unconnected element of the same type as this node, used
   // to figure out how shorthand properties will be parsed.
   dummyElement: null,
 
+  init: function()
+  {
+    // To figure out how shorthand properties are interpreted by the
+    // engine, we will set properties on a dummy element and observe
+    // how their .style attribute reflects them as computed values.
+    return this.dummyElementPromise = createDummyDocument().then(document => {
+      this.dummyElement = document.createElementNS(this.element.namespaceURI,
+                                                   this.element.tagName);
+      document.documentElement.appendChild(this.dummyElement);
+      return this.dummyElement;
+    }).then(null, promiseWarn);
+  },
+
   destroy: function() {
     this.dummyElement = null;
     this.dummyElementPromise.then(dummyElement => {
       if (dummyElement.parentNode) {
         dummyElement.parentNode.removeChild(dummyElement);
       }
       this.dummyElementPromise = null;
     });
@@ -1378,17 +1381,19 @@ CssRuleView.prototype = {
 
     this._viewedElement = aElement;
     if (!this._viewedElement) {
       this._showEmpty();
       return promise.resolve(undefined);
     }
 
     this._elementStyle = new ElementStyle(aElement, this.store, this.pageStyle);
-    return this._populate().then(() => {
+    return this._elementStyle.init().then(() => {
+      return this._populate();
+    }).then(() => {
       // A new node may already be selected, in which this._elementStyle will
       // be null.
       if (this._elementStyle) {
         this._elementStyle.onChanged = () => {
           this._changed();
         };
       }
     }).then(null, console.error);
--- a/browser/devtools/styleinspector/test/head.js
+++ b/browser/devtools/styleinspector/test/head.js
@@ -18,17 +18,17 @@ let gDevTools = tempScope.gDevTools;
 Cu.import("resource://gre/modules/devtools/Loader.jsm", tempScope);
 let devtools = tempScope.devtools;
 
 let TargetFactory = devtools.TargetFactory;
 let {CssHtmlTree} = devtools.require("devtools/styleinspector/computed-view");
 let {CssRuleView, _ElementStyle} = devtools.require("devtools/styleinspector/rule-view");
 let {CssLogic, CssSelector} = devtools.require("devtools/styleinspector/css-logic");
 
-let promise = devtools.require("sdk/core/promise");
+let {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
 
 gDevTools.testing = true;
 SimpleTest.registerCleanupFunction(() => {
   gDevTools.testing = false;
 });
 
 SimpleTest.registerCleanupFunction(() => {
   // Services.prefs.clearUserPref("devtools.debugger.log");
--- a/browser/locales/en-US/chrome/browser/newTab.dtd
+++ b/browser/locales/en-US/chrome/browser/newTab.dtd
@@ -3,8 +3,11 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!-- These strings are used in the about:newtab page -->
 <!ENTITY newtab.pageTitle "New Tab">
 <!ENTITY newtab.undo.removedLabel "Thumbnail removed.">
 <!ENTITY newtab.undo.undoButton "Undo.">
 <!ENTITY newtab.undo.restoreButton "Restore All.">
 <!ENTITY newtab.undo.closeTooltip "Hide">
+<!ENTITY newtab.panel.message "This site is being suggested because it has sponsored Mozilla, helping us promote openness, innovation and opportunity on the Web.">
+<!ENTITY newtab.panel.link.url "https://support.mozilla.org/kb/how-do-sponsored-tiles-work">
+<!ENTITY newtab.panel.link.text "Learn moreā€¦">
--- a/browser/metro/profile/metro.js
+++ b/browser/metro/profile/metro.js
@@ -546,17 +546,17 @@ pref("services.sync.prefs.sync.devtools.
 pref("services.sync.prefs.sync.lightweightThemes.isThemeSelected", true);
 pref("services.sync.prefs.sync.lightweightThemes.usedThemes", true);
 pref("services.sync.prefs.sync.privacy.donottrackheader.enabled", true);
 pref("services.sync.prefs.sync.privacy.donottrackheader.value", true);
 pref("services.sync.prefs.sync.signon.rememberSignons", true);
 #endif
 
 // threshold where a tap becomes a drag, in 1/240" reference pixels
-// The names of the preferences are to be in sync with nsEventStateManager.cpp
+// The names of the preferences are to be in sync with EventStateManager.cpp
 pref("ui.dragThresholdX", 50);
 pref("ui.dragThresholdY", 50);
 
 // prevent tooltips from showing up
 pref("browser.chrome.toolbar_tips", false);
 
 #ifdef NIGHTLY_BUILD
 // Completely disable pdf.js as an option to preview pdfs within firefox.
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -171,17 +171,16 @@ browser.jar:
   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)
 * skin/classic/browser/devtools/common.css            (../shared/devtools/common.css)
 * skin/classic/browser/devtools/dark-theme.css        (../shared/devtools/dark-theme.css)
 * skin/classic/browser/devtools/light-theme.css       (../shared/devtools/light-theme.css)
-  skin/classic/browser/devtools/metal.jpg             (../shared/devtools/images/metal.jpg)
   skin/classic/browser/devtools/filters.svg          (../shared/devtools/filters.svg)
   skin/classic/browser/devtools/controls.png          (../shared/devtools/images/controls.png)
   skin/classic/browser/devtools/controls@2x.png       (../shared/devtools/images/controls@2x.png)
 * skin/classic/browser/devtools/widgets.css           (devtools/widgets.css)
   skin/classic/browser/devtools/commandline-icon.png  (devtools/commandline-icon.png)
   skin/classic/browser/devtools/command-paintflashing.png     (../shared/devtools/images/command-paintflashing.png)
   skin/classic/browser/devtools/command-paintflashing@2x.png  (../shared/devtools/images/command-paintflashing@2x.png)
   skin/classic/browser/devtools/command-responsivemode.png    (../shared/devtools/images/command-responsivemode.png)
--- a/browser/themes/linux/newtab/newTab.css
+++ b/browser/themes/linux/newtab/newTab.css
@@ -178,8 +178,12 @@
 
 .newtab-control-sponsored {
   background-position: -249px -1px;
 }
 
 .newtab-control-sponsored:hover {
   background-position: -265px -1px;
 }
+
+.newtab-control-sponsored[panelShown] {
+  background-position: -281px -1px;
+}
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -2760,18 +2760,18 @@ toolbarbutton.chevron > .toolbarbutton-m
  *
  * Because of Bug 941309, we make sure this pseudoelement always exists,
  * but we only make it visible when we need it.
  */
 #navigator-toolbox::before {
   content: '';
   display: block;
   -moz-appearance: toolbar;
-  height: calc(@tabHeight@ + 1px);
-  margin-bottom: calc(-1px - @tabHeight@);
+  height: @tabHeight@;
+  margin-bottom: -@tabHeight@;
   visibility: hidden;
 }
 
 #main-window:not(:-moz-any([privatebrowsingmode=temporary],[customizing])) #navigator-toolbox[inFullscreen]:not(:-moz-lwtheme)::before,
 #main-window:not(:-moz-any([privatebrowsingmode=temporary],[customizing],[tabsintitlebar])) #navigator-toolbox:not(:-moz-lwtheme)::before {
   visibility: visible;
 }
 
@@ -3896,29 +3896,27 @@ toolbarbutton.chevron > .toolbarbutton-m
   border-left-style: solid;
   border-top-left-radius: .3em;
   margin-left: 1em;
 }
 
 /* Lion Fullscreen window styling */
 @media (-moz-mac-lion-theme) {
   #navigator-toolbox[inFullscreen]:not(:-moz-lwtheme)::before {
-    height: calc(@tabHeight@ + 11px) !important;
+    /* Adjust by the full element height of #titlebar, since that element is
+     * not displayed in native full-screen.
+     * Also add the height of the tabs, since we're calculating the
+     * total height of this pseudo-element, not just the top-padding. */
+    height: calc(@tabHeight@ + @spaceAboveTabbar@) !important;
   }
   #main-window[inFullscreen][privatebrowsingmode=temporary],
   #main-window[inFullscreen]:-moz-lwtheme {
-    /* This additional padding matches the change in height in the pseudo-element
-     * above. */
-    padding-top: 11px;
-  }
-  #main-window[inFullscreen]:not([privatebrowsingmode=temporary]):-moz-lwtheme {
-    /* In combination with the previous rule, forces the top 22px of the
-     * background image to be hidden, so the image doesn't jump around with
-     * the loss of the titlebar. */
-    background-position: right -11px;
+    /* Adjust by the full element height of #titlebar, since that element is
+     * not displayed in native full-screen. */
+    padding-top: @spaceAboveTabbar@;
   }
 }
 
 #full-screen-warning-message {
   background-image: url("chrome://browser/skin/fullscreen-darknoise.png");
   color: white;
   border-radius: 4px;
   margin-top: 30px;
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -292,17 +292,16 @@ browser.jar:
   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)
 * skin/classic/browser/devtools/common.css                  (../shared/devtools/common.css)
 * skin/classic/browser/devtools/dark-theme.css              (../shared/devtools/dark-theme.css)
 * skin/classic/browser/devtools/light-theme.css             (../shared/devtools/light-theme.css)
-  skin/classic/browser/devtools/metal.jpg                   (../shared/devtools/images/metal.jpg)
   skin/classic/browser/devtools/filters.svg                 (../shared/devtools/filters.svg)
   skin/classic/browser/devtools/controls.png                (../shared/devtools/images/controls.png)
   skin/classic/browser/devtools/controls@2x.png             (../shared/devtools/images/controls@2x.png)
 * skin/classic/browser/devtools/widgets.css                 (devtools/widgets.css)
   skin/classic/browser/devtools/commandline-icon.png        (devtools/commandline-icon.png)
   skin/classic/browser/devtools/command-paintflashing.png     (../shared/devtools/images/command-paintflashing.png)
   skin/classic/browser/devtools/command-paintflashing@2x.png  (../shared/devtools/images/command-paintflashing@2x.png)
   skin/classic/browser/devtools/command-responsivemode.png    (../shared/devtools/images/command-responsivemode.png)
--- a/browser/themes/osx/newtab/newTab.css
+++ b/browser/themes/osx/newtab/newTab.css
@@ -189,8 +189,12 @@
 
 .newtab-control-sponsored {
   background-position: -249px -1px;
 }
 
 .newtab-control-sponsored:hover {
   background-position: -265px -1px;
 }
+
+.newtab-control-sponsored[panelShown] {
+  background-position: -281px -1px;
+}
deleted file mode 100644
index 9123ddc839af9850455ec862e5fd92c162568f3b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/shared/devtools/light-theme.css
+++ b/browser/themes/shared/devtools/light-theme.css
@@ -130,17 +130,16 @@
 }
 
 .theme-toolbar,
 .devtools-toolbar,
 .devtools-sidebar-tabs > tabs { /* General toolbar styling */
   color: #585959;
   background-color: #f0f1f2;
   border-color: #aaa;
-  background-image: url("chrome://browser/skin/devtools/metal.jpg");
 }
 
 .ruleview-colorswatch,
 .computedview-colorswatch,
 .markupview-colorswatch {
   box-shadow: 0 0 0 1px #EFEFEF;
 }
 
--- a/browser/themes/shared/devtools/toolbars.inc.css
+++ b/browser/themes/shared/devtools/toolbars.inc.css
@@ -10,17 +10,16 @@
 %define solidSeparatorLight linear-gradient(#aaa, #aaa)
 
 
 .devtools-toolbar {
   -moz-appearance: none;
   padding: 4px 3px;
   border-bottom-width: 1px;
   border-bottom-style: solid;
-  font: 3mm "comic sans ms", Purisa, message-box !important;
 }
 
 .devtools-menulist,
 .devtools-toolbarbutton {
   -moz-appearance: none;
   -moz-box-align: center;
   min-width: 78px;
   min-height: 22px;
@@ -611,23 +610,21 @@
 /* Tabs */
 
 .devtools-tabbar {
   -moz-appearance: none;
   min-height: 28px;
   border: 0px solid;
   border-bottom-width: 1px;
   padding: 0;
-  font: 3mm "comic sans ms", Purisa, message-box !important;
 }
 
 .theme-light .devtools-tabbar {
   box-shadow: 0 -2px 0 rgba(170,170,170,.1) inset;
   background: #ebeced;
-  background-image: url("chrome://browser/skin/devtools/metal.jpg");
   border-bottom-color: #aaa;
 }
 
 .theme-dark .devtools-tabbar {
   box-shadow: 0 -2px 0 rgba(0,0,0,.1) inset;
   background: #252c33;
   border-bottom-color: #000;
 }
--- a/browser/themes/shared/devtools/widgets.inc.css
+++ b/browser/themes/shared/devtools/widgets.inc.css
@@ -156,17 +156,17 @@
 
 .theme-light #breadcrumb-separator-before,
 .theme-light #breadcrumb-separator-after:after {
   background: #4c9ed9; /* Select Highlight Blue */
 }
 
 .theme-light #breadcrumb-separator-after,
 .theme-light #breadcrumb-separator-before:after {
-  background: url("chrome://browser/skin/devtools/metal.jpg"); /* Toolbars */
+  background: #f0f1f2; /* Toolbars */
 }
 
 /* This chevron arrow cannot be replicated easily in CSS, so we are using
  * a background image for it (still keeping it in a separate element so
  * we can handle RTL support with a CSS transform).
  */
 #breadcrumb-separator-normal {
   background: url(breadcrumbs-divider@2x.png) no-repeat center right;
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -204,17 +204,16 @@ browser.jar:
         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-inverted.png           (tabview/tabview-inverted.png)
         skin/classic/browser/tabview/tabview.css                    (tabview/tabview.css)
 *       skin/classic/browser/devtools/common.css                    (../shared/devtools/common.css)
 *       skin/classic/browser/devtools/dark-theme.css                (../shared/devtools/dark-theme.css)
 *       skin/classic/browser/devtools/light-theme.css               (../shared/devtools/light-theme.css)
-        skin/classic/browser/devtools/metal.jpg                     (../shared/devtools/images/metal.jpg)
         skin/classic/browser/devtools/filters.svg                   (../shared/devtools/filters.svg)
         skin/classic/browser/devtools/controls.png                  (../shared/devtools/images/controls.png)
         skin/classic/browser/devtools/controls@2x.png               (../shared/devtools/images/controls@2x.png)
 *       skin/classic/browser/devtools/widgets.css                   (devtools/widgets.css)
         skin/classic/browser/devtools/commandline-icon.png          (devtools/commandline-icon.png)
         skin/classic/browser/devtools/alerticon-warning.png         (devtools/alerticon-warning.png)
         skin/classic/browser/devtools/ruleview.css                  (devtools/ruleview.css)
         skin/classic/browser/devtools/commandline.css               (devtools/commandline.css)
@@ -553,17 +552,16 @@ browser.jar:
         skin/classic/aero/browser/tabview/search.png                 (tabview/search.png)
         skin/classic/aero/browser/tabview/stack-expander.png         (tabview/stack-expander.png)
         skin/classic/aero/browser/tabview/tabview.png                (tabview/tabview.png)
         skin/classic/aero/browser/tabview/tabview-inverted.png       (tabview/tabview-inverted.png)
         skin/classic/aero/browser/tabview/tabview.css                (tabview/tabview.css)
 *       skin/classic/aero/browser/devtools/common.css                (../shared/devtools/common.css)
 *       skin/classic/aero/browser/devtools/dark-theme.css            (../shared/devtools/dark-theme.css)
 *       skin/classic/aero/browser/devtools/light-theme.css           (../shared/devtools/light-theme.css)
-        skin/classic/aero/browser/devtools/metal.jpg                 (../shared/devtools/images/metal.jpg)
         skin/classic/aero/browser/devtools/filters.svg               (../shared/devtools/filters.svg)
         skin/classic/aero/browser/devtools/controls.png              (../shared/devtools/images/controls.png)
         skin/classic/aero/browser/devtools/controls@2x.png           (../shared/devtools/images/controls@2x.png)
 *       skin/classic/aero/browser/devtools/widgets.css               (devtools/widgets.css)
         skin/classic/aero/browser/devtools/commandline-icon.png      (devtools/commandline-icon.png)
         skin/classic/aero/browser/devtools/command-paintflashing.png    (../shared/devtools/images/command-paintflashing.png)
         skin/classic/aero/browser/devtools/command-paintflashing@2x.png (../shared/devtools/images/command-paintflashing@2x.png)
         skin/classic/aero/browser/devtools/command-responsivemode.png    (../shared/devtools/images/command-responsivemode.png)
--- a/browser/themes/windows/newtab/newTab.css
+++ b/browser/themes/windows/newtab/newTab.css
@@ -181,8 +181,12 @@
 
 .newtab-control-sponsored {
   background-position: -249px -1px;
 }
 
 .newtab-control-sponsored:hover {
   background-position: -265px -1px;
 }
+
+.newtab-control-sponsored[panelShown] {
+  background-position: -281px -1px;
+}
--- a/caps/include/moz.build
+++ b/caps/include/moz.build
@@ -1,10 +1,11 @@
 # -*- 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/.
 
 EXPORTS += [
     'nsJSPrincipals.h',
+    'nsNullPrincipal.h',
 ]
 
--- a/caps/include/nsNullPrincipal.h
+++ b/caps/include/nsNullPrincipal.h
@@ -10,17 +10,16 @@
  */
 
 #ifndef nsNullPrincipal_h__
 #define nsNullPrincipal_h__
 
 #include "nsIPrincipal.h"
 #include "nsJSPrincipals.h"
 #include "nsCOMPtr.h"
-#include "nsPrincipal.h"
 #include "nsIContentSecurityPolicy.h"
 
 class nsIURI;
 
 #define NS_NULLPRINCIPAL_CID \
 { 0xdd156d62, 0xd26f, 0x4441, \
  { 0x9c, 0xdb, 0xe8, 0xf0, 0x91, 0x07, 0xc2, 0x73 } }
 #define NS_NULLPRINCIPAL_CONTRACTID "@mozilla.org/nullprincipal;1"
--- a/caps/src/nsNullPrincipal.cpp
+++ b/caps/src/nsNullPrincipal.cpp
@@ -16,16 +16,17 @@
 #include "nsMemory.h"
 #include "nsIUUIDGenerator.h"
 #include "nsID.h"
 #include "nsNetUtil.h"
 #include "nsIClassInfoImpl.h"
 #include "nsNetCID.h"
 #include "nsError.h"
 #include "nsIScriptSecurityManager.h"
+#include "nsPrincipal.h"
 #include "nsScriptSecurityManager.h"
 #include "pratom.h"
 
 using namespace mozilla;
 
 NS_IMPL_CLASSINFO(nsNullPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY,
                   NS_NULLPRINCIPAL_CID)
 NS_IMPL_QUERY_INTERFACE2_CI(nsNullPrincipal,
--- a/client.py
+++ b/client.py
@@ -1,19 +1,16 @@
 #!/usr/bin/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/.
 
 
 LIBFFI_DIRS = (('js/ctypes/libffi', 'libffi'),)
-WEBIDLPARSER_DIR = 'dom/bindings/parser'
-WEBIDLPARSER_REPO = 'https://hg.mozilla.org/users/khuey_mozilla.com/webidl-parser'
 HG_EXCLUSIONS = ['.hg', '.hgignore', '.hgtags']
-WEBIDLPARSER_EXCLUSIONS = HG_EXCLUSIONS + ['.gitignore', 'ply']
 
 CVSROOT_LIBFFI = ':pserver:anoncvs@sources.redhat.com:/cvs/libffi'
 
 import os
 import sys
 import datetime
 import shutil
 import glob
@@ -115,17 +112,17 @@ def update_nspr_or_nss(tag, depfile, des
   new_state = get_trailing_blank_line_state(depfile)
   print "new state of %s is: %s" % (depfile, new_state)
   if old_state == new_state:
     print "toggling blank line in: ", depfile
     toggle_trailing_blank_line(depfile)
   tag_file = destination + "/TAG-INFO"
   print >>file(tag_file, "w"), tag
 
-o = OptionParser(usage="client.py [options] update_nspr tagname | update_nss tagname | update_libffi tagname | update_webidlparser tagname")
+o = OptionParser(usage="client.py [options] update_nspr tagname | update_nss tagname | update_libffi tagname")
 o.add_option("--skip-mozilla", dest="skip_mozilla",
              action="store_true", default=False,
              help="Obsolete")
 
 o.add_option("--cvs", dest="cvs", default=os.environ.get('CVS', 'cvs'),
              help="The location of the cvs binary")
 o.add_option("--cvsroot", dest="cvsroot",
              help="The CVSROOT for libffi (default : %s)" % CVSROOT_LIBFFI)
@@ -156,14 +153,11 @@ elif action in ('update_nss'):
     if not options.repo:
 	    options.repo = 'https://hg.mozilla.org/projects/nss'
     update_nspr_or_nss(tag, depfile, 'security/nss', options.repo)
 elif action in ('update_libffi'):
     tag, = args[1:]
     if not options.cvsroot:
         options.cvsroot = CVSROOT_LIBFFI
     do_cvs_export(LIBFFI_DIRS, tag, options.cvsroot, options.cvs)
-elif action in ('update_webidlparser'):
-    tag, = args[1:]
-    do_hg_replace(WEBIDLPARSER_DIR, WEBIDLPARSER_REPO, tag, WEBIDLPARSER_EXCLUSIONS, options.hg)
 else:
     o.print_help()
     sys.exit(2)
--- a/config/config.mk
+++ b/config/config.mk
@@ -335,28 +335,28 @@ endif
 #
 # Build using PIC by default
 #
 _ENABLE_PIC=1
 
 # Determine if module being compiled is destined
 # to be merged into libxul
 
-ifneq (,$(filter xul,$(FINAL_LIBRARY) $(LIBRARY_NAME)))
+ifneq (,$(filter xul xul-%,$(FINAL_LIBRARY) $(LIBRARY_NAME)))
   ifdef LIBXUL_LIBRARY
     $(error LIBRARY_NAME or FINAL_LIBRARY is "xul", LIBXUL_LIBRARY is implied)
   endif
   LIBXUL_LIBRARY := 1
 endif
 
 ifdef LIBXUL_LIBRARY
 ifdef IS_COMPONENT
 $(error IS_COMPONENT is set, but is not compatible with LIBXUL_LIBRARY)
 endif
-ifneq (xul,$(LIBRARY_NAME))
+ifeq (,$(filter xul xul-%,$(LIBRARY_NAME)))
 FORCE_STATIC_LIB=1
 endif
 endif
 
 # If we are building this component into an extension/xulapp, it cannot be
 # statically linked. In the future we may want to add a xulapp meta-component
 # build option.
 
--- a/content/base/public/Element.h
+++ b/content/base/public/Element.h
@@ -46,17 +46,16 @@ class nsINodeInfo;
 class nsIControllers;
 class nsEventChainVisitor;
 class nsIScrollableFrame;
 class nsAttrValueOrString;
 class ContentUnbinder;
 class nsContentList;
 class nsDOMTokenList;
 struct nsRect;
-class nsEventStateManager;
 class nsFocusManager;
 class nsGlobalWindow;
 class nsICSSDeclaration;
 class nsISMILAttr;
 
 already_AddRefed<nsContentList>
 NS_GetContentList(nsINode* aRootNode,
                   int32_t  aMatchNameSpaceId,
@@ -101,16 +100,17 @@ enum {
 // Make sure we have space for our bits
 ASSERT_NODE_FLAGS_SPACE(ELEMENT_TYPE_SPECIFIC_BITS_OFFSET);
 
 namespace mozilla {
 class EventChainPostVisitor;
 class EventChainPreVisitor;
 class EventChainVisitor;
 class EventListenerManager;
+class EventStateManager;
 
 namespace dom {
 
 class Link;
 class UndoManager;
 class DOMRect;
 class DOMRectList;
 
@@ -369,17 +369,17 @@ protected:
    */
   void RemoveStatesSilently(nsEventStates aStates) {
     mState &= ~aStates;
   }
 
 private:
   // Need to allow the ESM, nsGlobalWindow, and the focus manager to
   // set our state
-  friend class ::nsEventStateManager;
+  friend class mozilla::EventStateManager;
   friend class ::nsGlobalWindow;
   friend class ::nsFocusManager;
 
   // Also need to allow Link to call UpdateLinkState.
   friend class Link;
 
   void NotifyStateChange(nsEventStates aStates);
 
--- a/content/base/public/nsContentUtils.h
+++ b/content/base/public/nsContentUtils.h
@@ -1876,17 +1876,17 @@ public:
   /**
    * Returns true if aWin and the current pointer lock document
    * have common scriptable top window.
    */
   static bool IsInPointerLockContext(nsIDOMWindow* aWin);
 
   /**
    * Returns the time limit on handling user input before
-   * nsEventStateManager::IsHandlingUserInput() stops returning true.
+   * EventStateManager::IsHandlingUserInput() stops returning true.
    * This enables us to detect long running user-generated event handlers.
    */
   static TimeDuration HandlingUserInputTimeout();
 
   static void GetShiftText(nsAString& text);
   static void GetControlText(nsAString& text);
   static void GetMetaText(nsAString& text);
   static void GetOSText(nsAString& text);
--- a/content/base/public/nsIFrameLoader.idl
+++ b/content/base/public/nsIFrameLoader.idl
@@ -220,17 +220,17 @@ interface nsIFrameLoader : nsISupports
    * the platform hands over control of scroll offset to the user.
    */
   const unsigned long RENDER_MODE_ASYNC_SCROLL   = 0x00000001;
 
   attribute unsigned long renderMode;
 
   /**
    * The default event mode automatically forwards the events
-   * handled in nsEventStateManager::HandleCrossProcessEvent to
+   * handled in EventStateManager::HandleCrossProcessEvent to
    * the child content process when these events are targeted to
    * the remote browser element.
    *
    * Used primarly for input events (mouse, keyboard)
    */
   const unsigned long EVENT_MODE_NORMAL_DISPATCH = 0x00000000;
 
   /**
--- a/content/base/public/nsINode.h
+++ b/content/base/public/nsINode.h
@@ -1775,17 +1775,17 @@ public:
      Note that we include DOCUMENT_ONLY_EVENT events here so that we
      can forward all the document stuff to this implementation.
   */
 #define EVENT(name_, id_, type_, struct_)                             \
   mozilla::dom::EventHandlerNonNull* GetOn##name_();                  \
   void SetOn##name_(mozilla::dom::EventHandlerNonNull* listener);
 #define TOUCH_EVENT EVENT
 #define DOCUMENT_ONLY_EVENT EVENT
-#include "nsEventNameList.h"
+#include "mozilla/EventNameList.h"
 #undef DOCUMENT_ONLY_EVENT
 #undef TOUCH_EVENT
 #undef EVENT
 
 protected:
   static bool Traverse(nsINode *tmp, nsCycleCollectionTraversalCallback &cb);
   static void Unlink(nsINode *tmp);
 
--- a/content/base/src/Element.cpp
+++ b/content/base/src/Element.cpp
@@ -29,17 +29,16 @@
 #include "nsNetUtil.h"
 #include "nsIFrame.h"
 #include "nsIAnonymousContentCreator.h"
 #include "nsIPresShell.h"
 #include "nsPresContext.h"
 #include "nsStyleConsts.h"
 #include "nsString.h"
 #include "nsUnicharUtils.h"
-#include "nsEventStateManager.h"
 #include "nsIDOMEvent.h"
 #include "nsDOMCID.h"
 #include "nsIServiceManager.h"
 #include "nsIDOMCSSStyleDeclaration.h"
 #include "nsDOMCSSAttrDeclaration.h"
 #include "nsNameSpaceManager.h"
 #include "nsContentList.h"
 #include "nsDOMTokenList.h"
@@ -47,16 +46,17 @@
 #include "nsError.h"
 #include "nsDOMString.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIDOMMutationEvent.h"
 #include "mozilla/AsyncEventDispatcher.h"
 #include "mozilla/ContentEvents.h"
 #include "mozilla/EventDispatcher.h"
 #include "mozilla/EventListenerManager.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/InternalMutationEvent.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/TextEvents.h"
 #include "nsNodeUtils.h"
 #include "mozilla/dom/DirectionalityUtils.h"
 #include "nsDocument.h"
 #include "nsAttrValueOrString.h"
 #include "nsAttrValueInlines.h"
@@ -2425,17 +2425,17 @@ Element::PostHandleEventForLinks(EventCh
           nsIFocusManager* fm = nsFocusManager::GetFocusManager();
           if (fm) {
             aVisitor.mEvent->mFlags.mMultipleActionsPrevented = true;
             nsCOMPtr<nsIDOMElement> elem = do_QueryInterface(this);
             fm->SetFocus(elem, nsIFocusManager::FLAG_BYMOUSE |
                                nsIFocusManager::FLAG_NOSCROLL);
           }
 
-          nsEventStateManager::SetActiveManager(
+          EventStateManager::SetActiveManager(
             aVisitor.mPresContext->EventStateManager(), this);
         }
       }
     }
     break;
 
   case NS_MOUSE_CLICK: {
     WidgetMouseEvent* mouseEvent = aVisitor.mEvent->AsMouseEvent();
--- a/content/base/src/EventSource.cpp
+++ b/content/base/src/EventSource.cpp
@@ -2,16 +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/. */
 
 #include "mozilla/dom/EventSource.h"
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/DebugOnly.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/dom/EventSourceBinding.h"
 #include "mozilla/dom/MessageEvent.h"
 
 #include "js/OldDebugAPI.h"
 #include "nsNetUtil.h"
 #include "nsMimeTypes.h"
 #include "nsIPromptFactory.h"
 #include "nsIWindowWatcher.h"
@@ -28,17 +29,16 @@
 #include "nsIChannelPolicy.h"
 #include "nsIContentSecurityPolicy.h"
 #include "nsContentUtils.h"
 #include "nsCxPusher.h"
 #include "mozilla/Preferences.h"
 #include "xpcpublic.h"
 #include "nsCrossSiteListenerProxy.h"
 #include "nsWrapperCacheInlines.h"
-#include "nsDOMEventTargetHelper.h"
 #include "mozilla/Attributes.h"
 #include "nsError.h"
 
 namespace mozilla {
 namespace dom {
 
 #define REPLACEMENT_CHAR     (char16_t)0xFFFD
 #define BOM_CHAR             (char16_t)0xFEFF
@@ -51,17 +51,17 @@ namespace dom {
 
 // Reconnection time related values in milliseconds. The default one is equal
 // to the default value of the pref dom.server-events.default-reconnection-time
 #define MIN_RECONNECTION_TIME_VALUE       500
 #define DEFAULT_RECONNECTION_TIME_VALUE   5000
 #define MAX_RECONNECTION_TIME_VALUE       PR_IntervalToMilliseconds(DELAY_INTERVAL_LIMIT)
 
 EventSource::EventSource(nsPIDOMWindow* aOwnerWindow) :
-  nsDOMEventTargetHelper(aOwnerWindow),
+  DOMEventTargetHelper(aOwnerWindow),
   mStatus(PARSE_STATE_OFF),
   mFrozen(false),
   mErrorLoadOnRedirect(false),
   mGoingToDispatchAllMessages(false),
   mWithCredentials(false),
   mWaitingForOnStopRequest(false),
   mInterrupted(false),
   mLastConvertionResult(NS_OK),
@@ -100,50 +100,51 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_
   return tmp->IsBlack();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
 
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(EventSource)
   return tmp->IsBlack();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
 
 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(EventSource,
-                                               nsDOMEventTargetHelper)
+                                               DOMEventTargetHelper)
 NS_IMPL_CYCLE_COLLECTION_TRACE_END
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(EventSource,
-                                                  nsDOMEventTargetHelper)
+                                                  DOMEventTargetHelper)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSrc)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNotificationCallbacks)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLoadGroup)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChannelEventSink)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHttpChannel)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTimer)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mUnicodeDecoder)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
-NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(EventSource, nsDOMEventTargetHelper)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(EventSource,
+                                                DOMEventTargetHelper)
   tmp->Close();
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(EventSource)
   NS_INTERFACE_MAP_ENTRY(nsIObserver)
   NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
   NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
   NS_INTERFACE_MAP_ENTRY(nsIChannelEventSink)
   NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
   NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
-NS_IMPL_ADDREF_INHERITED(EventSource, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(EventSource, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(EventSource, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(EventSource, DOMEventTargetHelper)
 
 void
 EventSource::DisconnectFromOwner()
 {
-  nsDOMEventTargetHelper::DisconnectFromOwner();
+  DOMEventTargetHelper::DisconnectFromOwner();
   Close();
 }
 
 void
 EventSource::Close()
 {
   if (mReadyState == CLOSED) {
     return;
--- a/content/base/src/EventSource.h
+++ b/content/base/src/EventSource.h
@@ -9,17 +9,17 @@
  * 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 "mozilla/DOMEventTargetHelper.h"
 #include "nsIObserver.h"
 #include "nsIStreamListener.h"
 #include "nsIChannelEventSink.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsITimer.h"
 #include "nsIHttpChannel.h"
 #include "nsWeakReference.h"
 #include "nsDeque.h"
@@ -31,31 +31,31 @@ namespace mozilla {
 
 class ErrorResult;
 
 namespace dom {
 
 class AsyncVerifyRedirectCallbackFwr;
 struct EventSourceInit;
 
-class EventSource : public nsDOMEventTargetHelper
+class EventSource : public DOMEventTargetHelper
                   , public nsIObserver
                   , public nsIStreamListener
                   , public nsIChannelEventSink
                   , public nsIInterfaceRequestor
                   , public nsSupportsWeakReference
 {
 friend class AsyncVerifyRedirectCallbackFwr;
 
 public:
   EventSource(nsPIDOMWindow* aOwnerWindow);
   virtual ~EventSource();
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(EventSource,
-                                                                   nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(
+    EventSource, DOMEventTargetHelper)
 
   NS_DECL_NSIOBSERVER
   NS_DECL_NSISTREAMLISTENER
   NS_DECL_NSIREQUESTOBSERVER
   NS_DECL_NSICHANNELEVENTSINK
   NS_DECL_NSIINTERFACEREQUESTOR
 
   // nsWrapperCache
--- a/content/base/src/FileIOObject.cpp
+++ b/content/base/src/FileIOObject.cpp
@@ -15,36 +15,36 @@
 #define ABORT_STR "abort"
 #define PROGRESS_STR "progress"
 
 namespace mozilla {
 namespace dom {
 
 const uint64_t kUnknownSize = uint64_t(-1);
 
-NS_IMPL_ADDREF_INHERITED(FileIOObject, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(FileIOObject, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(FileIOObject, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(FileIOObject, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FileIOObject)
   NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
   NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
   NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(FileIOObject)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(FileIOObject,
-                                                  nsDOMEventTargetHelper)
+                                                  DOMEventTargetHelper)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mProgressNotifier)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mError)
   // Can't traverse mChannel because it's a multithreaded object.
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(FileIOObject,
-                                                nsDOMEventTargetHelper)
+                                                DOMEventTargetHelper)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mProgressNotifier)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mError)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mChannel)
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
  
 NS_IMPL_EVENT_HANDLER(FileIOObject, abort)
 NS_IMPL_EVENT_HANDLER(FileIOObject, error)
 NS_IMPL_EVENT_HANDLER(FileIOObject, progress)
--- a/content/base/src/FileIOObject.h
+++ b/content/base/src/FileIOObject.h
@@ -1,17 +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 FileIOObject_h__
 #define FileIOObject_h__
 
-#include "nsDOMEventTargetHelper.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "nsIChannel.h"
 #include "nsIFile.h"
 #include "nsIDOMFile.h"
 #include "nsIStreamListener.h"
 #include "nsITimer.h"
 #include "nsCOMPtr.h"
 
 #include "mozilla/dom/DOMError.h"
@@ -23,17 +23,17 @@ namespace mozilla {
 class ErrorResult;
 
 namespace dom {
 
 extern const uint64_t kUnknownSize;
 
 // A common base class for FileReader and FileSaver
 
-class FileIOObject : public nsDOMEventTargetHelper,
+class FileIOObject : public DOMEventTargetHelper,
                      public nsIStreamListener,
                      public nsITimerCallback
 {
 public:
   FileIOObject();
 
   NS_DECL_ISUPPORTS_INHERITED
 
@@ -60,18 +60,17 @@ public:
   IMPL_EVENT_HANDLER(progress)
 
   NS_DECL_NSITIMERCALLBACK
 
   NS_DECL_NSISTREAMLISTENER
 
   NS_DECL_NSIREQUESTOBSERVER
 
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(FileIOObject,
-                                           nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(FileIOObject, DOMEventTargetHelper)
 
 protected:
   // Implemented by the derived class to do whatever it needs to do for abort
   virtual void DoAbort(nsAString& aEvent) = 0;
   // for onStartRequest (this has a default impl since FileReader doesn't need
   // special handling
   NS_IMETHOD DoOnStartRequest(nsIRequest *aRequest, nsISupports *aContext);
   // for onStopRequest
--- a/content/base/src/FragmentOrElement.cpp
+++ b/content/base/src/FragmentOrElement.cpp
@@ -35,17 +35,16 @@
 #include "nsNetUtil.h"
 #include "nsIFrame.h"
 #include "nsIAnonymousContentCreator.h"
 #include "nsIPresShell.h"
 #include "nsPresContext.h"
 #include "nsStyleConsts.h"
 #include "nsString.h"
 #include "nsUnicharUtils.h"
-#include "nsEventStateManager.h"
 #include "nsIDOMEvent.h"
 #include "nsDOMCID.h"
 #include "nsIServiceManager.h"
 #include "nsIDOMCSSStyleDeclaration.h"
 #include "nsDOMCSSAttrDeclaration.h"
 #include "nsNameSpaceManager.h"
 #include "nsContentList.h"
 #include "nsDOMTokenList.h"
@@ -1761,22 +1760,31 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_
       classes.AppendLiteral(" class='");
       nsAutoString classString;
       classAttrValue->ToString(classString);
       classString.ReplaceChar(char16_t('\n'), char16_t(' '));
       classes.Append(classString);
       classes.AppendLiteral("'");
     }
 
+    nsAutoCString orphan;
+    if (!tmp->IsInDoc() &&
+        // Ignore xbl:content, which is never in the document and hence always
+        // appears to be orphaned.
+        !tmp->NodeInfo()->Equals(nsGkAtoms::content, kNameSpaceID_XBL)) {
+      orphan.AppendLiteral(" (orphan)");
+    }
+
     const char* nsuri = nsid < ArrayLength(kNSURIs) ? kNSURIs[nsid] : "";
-    PR_snprintf(name, sizeof(name), "FragmentOrElement%s %s%s%s %s",
+    PR_snprintf(name, sizeof(name), "FragmentOrElement%s %s%s%s%s %s",
                 nsuri,
                 localName.get(),
                 NS_ConvertUTF16toUTF8(id).get(),
                 NS_ConvertUTF16toUTF8(classes).get(),
+                orphan.get(),
                 uri.get());
     cb.DescribeRefCountedNode(tmp->mRefCnt.get(), name);
   }
   else {
     NS_IMPL_CYCLE_COLLECTION_DESCRIBE(FragmentOrElement, tmp->mRefCnt.get())
   }
 
   // Always need to traverse script objects, so do that before we check
--- a/content/base/src/WebSocket.cpp
+++ b/content/base/src/WebSocket.cpp
@@ -5,16 +5,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "WebSocket.h"
 #include "mozilla/dom/WebSocketBinding.h"
 
 #include "jsapi.h"
 #include "jsfriendapi.h"
 #include "js/OldDebugAPI.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "nsIScriptGlobalObject.h"
 #include "nsIDOMWindow.h"
 #include "nsIDocument.h"
 #include "nsXPCOM.h"
 #include "nsIXPConnect.h"
 #include "nsContentUtils.h"
 #include "nsCxPusher.h"
 #include "nsError.h"
@@ -34,17 +35,16 @@
 #include "nsIScriptError.h"
 #include "nsNetUtil.h"
 #include "nsILoadGroup.h"
 #include "mozilla/Preferences.h"
 #include "xpcpublic.h"
 #include "nsContentPolicyUtils.h"
 #include "nsDOMFile.h"
 #include "nsWrapperCacheInlines.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsIObserverService.h"
 #include "nsIWebSocketChannel.h"
 #include "GeneratedEvents.h"
 
 namespace mozilla {
 namespace dom {
 
 #define UTF_8_REPLACEMENT_CHAR    static_cast<char16_t>(0xFFFD)
@@ -436,17 +436,17 @@ WebSocket::GetInterface(const nsIID& aII
   return QueryInterface(aIID, aResult);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // WebSocket
 ////////////////////////////////////////////////////////////////////////////////
 
 WebSocket::WebSocket(nsPIDOMWindow* aOwnerWindow)
-: nsDOMEventTargetHelper(aOwnerWindow),
+: DOMEventTargetHelper(aOwnerWindow),
   mKeepingAlive(false),
   mCheckMustKeepAlive(true),
   mOnCloseScheduled(false),
   mFailed(false),
   mDisconnected(false),
   mCloseEventWasClean(false),
   mCloseEventCode(nsIWebSocketChannel::CLOSE_ABNORMAL),
   mReadyState(WebSocket::CONNECTING),
@@ -590,49 +590,49 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_
   return tmp->IsBlack();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
 
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(WebSocket)
   return tmp->IsBlack();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
 
 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(WebSocket,
-                                               nsDOMEventTargetHelper)
+                                               DOMEventTargetHelper)
 NS_IMPL_CYCLE_COLLECTION_TRACE_END
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(WebSocket,
-                                                  nsDOMEventTargetHelper)
+                                                  DOMEventTargetHelper)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mURI)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChannel)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(WebSocket,
-                                                nsDOMEventTargetHelper)
+                                                DOMEventTargetHelper)
   tmp->Disconnect();
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mURI)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mChannel)
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(WebSocket)
   NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
   NS_INTERFACE_MAP_ENTRY(nsIWebSocketListener)
   NS_INTERFACE_MAP_ENTRY(nsIObserver)
   NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
   NS_INTERFACE_MAP_ENTRY(nsIRequest)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
-NS_IMPL_ADDREF_INHERITED(WebSocket, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(WebSocket, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(WebSocket, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(WebSocket, DOMEventTargetHelper)
 
 void
 WebSocket::DisconnectFromOwner()
 {
-  nsDOMEventTargetHelper::DisconnectFromOwner();
+  DOMEventTargetHelper::DisconnectFromOwner();
   CloseConnection(nsIWebSocketChannel::CLOSE_GOING_AWAY);
   DontKeepAliveAnyMore();
 }
 
 //-----------------------------------------------------------------------------
 // WebSocket:: initialization
 //-----------------------------------------------------------------------------
 
--- a/content/base/src/WebSocket.h
+++ b/content/base/src/WebSocket.h
@@ -5,21 +5,21 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef WebSocket_h__
 #define WebSocket_h__
 
 #include "mozilla/Attributes.h"
 #include "mozilla/dom/TypedArray.h"
 #include "mozilla/dom/WebSocketBinding.h" // for BinaryType
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/ErrorResult.h"
 #include "nsAutoPtr.h"
 #include "nsCOMPtr.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIObserver.h"
 #include "nsIRequest.h"
 #include "nsISupports.h"
 #include "nsISupportsUtils.h"
 #include "nsIWebSocketChannel.h"
 #include "nsIWebSocketListener.h"
 #include "nsString.h"
@@ -27,17 +27,17 @@
 #include "nsWrapperCache.h"
 
 #define DEFAULT_WS_SCHEME_PORT  80
 #define DEFAULT_WSS_SCHEME_PORT 443
 
 namespace mozilla {
 namespace dom {
 
-class WebSocket : public nsDOMEventTargetHelper,
+class WebSocket : public DOMEventTargetHelper,
                   public nsIInterfaceRequestor,
                   public nsIWebSocketListener,
                   public nsIObserver,
                   public nsSupportsWeakReference,
                   public nsIRequest
 {
 friend class CallDispatchConnectionCloseEvents;
 friend class nsAutoCloseWS;
@@ -47,18 +47,18 @@ public:
     CONNECTING = 0,
     OPEN       = 1,
     CLOSING    = 2,
     CLOSED     = 3
   };
 
 public:
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(WebSocket,
-                                                                   nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(
+    WebSocket, DOMEventTargetHelper)
   NS_DECL_NSIINTERFACEREQUESTOR
   NS_DECL_NSIWEBSOCKETLISTENER
   NS_DECL_NSIOBSERVER
   NS_DECL_NSIREQUEST
 
   // EventTarget
   virtual void EventListenerAdded(nsIAtom* aType) MOZ_OVERRIDE;
   virtual void EventListenerRemoved(nsIAtom* aType) MOZ_OVERRIDE;
--- a/content/base/src/nsContentUtils.cpp
+++ b/content/base/src/nsContentUtils.cpp
@@ -38,16 +38,17 @@
 #include "mozilla/dom/HTMLMediaElement.h"
 #include "mozilla/dom/HTMLTemplateElement.h"
 #include "mozilla/dom/HTMLContentElement.h"
 #include "mozilla/dom/TextDecoder.h"
 #include "mozilla/dom/TouchEvent.h"
 #include "mozilla/dom/ShadowRoot.h"
 #include "mozilla/EventDispatcher.h"
 #include "mozilla/EventListenerManager.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/IMEStateManager.h"
 #include "mozilla/InternalMutationEvent.h"
 #include "mozilla/Likely.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/Selection.h"
 #include "mozilla/TextEvents.h"
 #include "nsAString.h"
@@ -70,17 +71,16 @@
 #include "nsDataHashtable.h"
 #include "nsDocShellCID.h"
 #include "nsDocument.h"
 #include "nsDOMCID.h"
 #include "mozilla/dom/DataTransfer.h"
 #include "nsDOMJSUtils.h"
 #include "nsDOMMutationObserver.h"
 #include "nsError.h"
-#include "nsEventStateManager.h"
 #include "nsFocusManager.h"
 #include "nsGenericHTMLElement.h"
 #include "nsGenericHTMLFrameElement.h"
 #include "nsGkAtoms.h"
 #include "nsHostObjectProtocolHandler.h"
 #include "nsHtml5Module.h"
 #include "nsHtml5StringParser.h"
 #include "nsIAsyncVerifyRedirectCallback.h"
@@ -569,17 +569,17 @@ nsContentUtils::InitializeEventTable() {
   NS_ASSERTION(!sAtomEventTable, "EventTable already initialized!");
   NS_ASSERTION(!sStringEventTable, "EventTable already initialized!");
 
   static const EventNameMapping eventArray[] = {
 #define EVENT(name_,  _id, _type, _struct)          \
     { nsGkAtoms::on##name_, _id, _type, _struct },
 #define WINDOW_ONLY_EVENT EVENT
 #define NON_IDL_EVENT EVENT
-#include "nsEventNameList.h"
+#include "mozilla/EventNameList.h"
 #undef WINDOW_ONLY_EVENT
 #undef EVENT
     { nullptr }
   };
 
   sAtomEventTable = new nsDataHashtable<nsISupportsHashKey, EventNameMapping>(
       int(ArrayLength(eventArray) / 0.75) + 1);
   sStringEventTable = new nsDataHashtable<nsStringHashKey, EventNameMapping>(
@@ -601,17 +601,17 @@ nsContentUtils::InitializeTouchEventTabl
 {
   static bool sEventTableInitialized = false;
   if (!sEventTableInitialized && sAtomEventTable && sStringEventTable) {
     sEventTableInitialized = true;
     static const EventNameMapping touchEventArray[] = {
 #define EVENT(name_,  _id, _type, _struct)
 #define TOUCH_EVENT(name_,  _id, _type, _struct)      \
       { nsGkAtoms::on##name_, _id, _type, _struct },
-#include "nsEventNameList.h"
+#include "mozilla/EventNameList.h"
 #undef TOUCH_EVENT
 #undef EVENT
       { nullptr }
     };
     // Subtract one from the length because of the trailing null
     for (uint32_t i = 0; i < ArrayLength(touchEventArray) - 1; ++i) {
       sAtomEventTable->Put(touchEventArray[i].mAtom, touchEventArray[i]);
       sStringEventTable->Put(Substring(nsDependentAtomString(touchEventArray[i].mAtom), 2),
@@ -5026,17 +5026,17 @@ nsContentUtils::SetDataTransferInEvent(W
     aDragEvent->dataTransfer->GetEffectAllowedInt(&effectAllowed);
     aDragEvent->dataTransfer->SetDropEffectInt(FilterDropEffect(action, effectAllowed));
   }
   else if (aDragEvent->message == NS_DRAGDROP_DROP ||
            aDragEvent->message == NS_DRAGDROP_DRAGDROP ||
            aDragEvent->message == NS_DRAGDROP_END) {
     // For the drop and dragend events, set the drop effect based on the
     // last value that the dropEffect had. This will have been set in
-    // nsEventStateManager::PostHandleEvent for the last dragenter or
+    // EventStateManager::PostHandleEvent for the last dragenter or
     // dragover event.
     uint32_t dropEffect;
     initialDataTransfer->GetDropEffectInt(&dropEffect);
     aDragEvent->dataTransfer->SetDropEffectInt(dropEffect);
   }
 
   return NS_OK;
 }
@@ -5839,17 +5839,17 @@ nsContentUtils::IsSubDocumentTabbable(ns
 {
   nsIDocument* doc = aContent->GetCurrentDoc();
   if (!doc) {
     return false;
   }
 
   // If the subdocument lives in another process, the frame is
   // tabbable.
-  if (nsEventStateManager::IsRemoteTarget(aContent)) {
+  if (EventStateManager::IsRemoteTarget(aContent)) {
     return true;
   }
 
   // XXXbz should this use OwnerDoc() for GetSubDocumentFor?
   // sXBL/XBL2 issue!
   nsIDocument* subDoc = doc->GetSubDocumentFor(aContent);
   if (!subDoc) {
     return false;
@@ -6273,17 +6273,17 @@ nsContentUtils::IsFullScreenApiEnabled()
   return sIsFullScreenApiEnabled;
 }
 
 /* static */
 bool
 nsContentUtils::IsRequestFullScreenAllowed()
 {
   return !sTrustedFullScreenOnly ||
-         nsEventStateManager::IsHandlingUserInput() ||
+         EventStateManager::IsHandlingUserInput() ||
          IsCallerChrome();
 }
 
 /* static */
 bool
 nsContentUtils::IsFullscreenApiContentOnly()
 {
   return sFullscreenApiIsContentOnly;
@@ -6414,17 +6414,17 @@ nsContentUtils::GetFullscreenAncestor(ns
 bool
 nsContentUtils::IsInPointerLockContext(nsIDOMWindow* aWin)
 {
   if (!aWin) {
     return false;
   }
 
   nsCOMPtr<nsIDocument> pointerLockedDoc =
-    do_QueryReferent(nsEventStateManager::sPointerLockedDoc);
+    do_QueryReferent(EventStateManager::sPointerLockedDoc);
   if (!pointerLockedDoc || !pointerLockedDoc->GetWindow()) {
     return false;
   }
 
   nsCOMPtr<nsIDOMWindow> lockTop;
   pointerLockedDoc->GetWindow()->GetScriptableTop(getter_AddRefs(lockTop));
 
   nsCOMPtr<nsIDOMWindow> top;
--- a/content/base/src/nsDOMDataChannel.cpp
+++ b/content/base/src/nsDOMDataChannel.cpp
@@ -20,17 +20,17 @@ extern PRLogModuleInfo* GetDataChannelLo
 #define LOG(args) PR_LOG(GetDataChannelLog(), PR_LOG_DEBUG, args)
 
 
 #include "nsDOMDataChannelDeclarations.h"
 #include "nsDOMDataChannel.h"
 #include "nsIDOMFile.h"
 #include "nsIDOMDataChannel.h"
 #include "nsIDOMMessageEvent.h"
-#include "nsDOMEventTargetHelper.h"
+#include "mozilla/DOMEventTargetHelper.h"
 
 #include "nsError.h"
 #include "nsAutoPtr.h"
 #include "nsContentUtils.h"
 #include "nsCxPusher.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsIScriptObjectPrincipal.h"
 #include "nsNetUtil.h"
@@ -61,34 +61,34 @@ nsDOMDataChannel::~nsDOMDataChannel()
 nsDOMDataChannel::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
 {
   return DataChannelBinding::Wrap(aCx, aScope, this);
 }
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMDataChannel)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsDOMDataChannel,
-                                                  nsDOMEventTargetHelper)
+                                                  DOMEventTargetHelper)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsDOMDataChannel,
-                                                nsDOMEventTargetHelper)
+                                                DOMEventTargetHelper)
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
-NS_IMPL_ADDREF_INHERITED(nsDOMDataChannel, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(nsDOMDataChannel, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(nsDOMDataChannel, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(nsDOMDataChannel, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMDataChannel)
   NS_INTERFACE_MAP_ENTRY(nsIDOMDataChannel)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 nsDOMDataChannel::nsDOMDataChannel(already_AddRefed<mozilla::DataChannel>& aDataChannel,
                                    nsPIDOMWindow* aWindow)
-  : nsDOMEventTargetHelper(aWindow && aWindow->IsOuterWindow() ?
-                             aWindow->GetCurrentInnerWindow() : aWindow)
+  : DOMEventTargetHelper(aWindow && aWindow->IsOuterWindow() ?
+                           aWindow->GetCurrentInnerWindow() : aWindow)
   , mDataChannel(aDataChannel)
   , mBinaryType(DC_BINARY_TYPE_BLOB)
 {
 }
 
 nsresult
 nsDOMDataChannel::Init(nsPIDOMWindow* aDOMWindow)
 {
--- a/content/base/src/nsDOMDataChannel.h
+++ b/content/base/src/nsDOMDataChannel.h
@@ -3,46 +3,46 @@
 /* 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/DOMEventTargetHelper.h"
 #include "mozilla/dom/DataChannelBinding.h"
 #include "mozilla/dom/TypedArray.h"
 #include "mozilla/net/DataChannelListener.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsIDOMDataChannel.h"
 #include "nsIInputStream.h"
 
 
 namespace mozilla {
 class DataChannel;
 };
 
-class nsDOMDataChannel : public nsDOMEventTargetHelper,
+class nsDOMDataChannel : public mozilla::DOMEventTargetHelper,
                          public nsIDOMDataChannel,
                          public mozilla::DataChannelListener
 {
 public:
   nsDOMDataChannel(already_AddRefed<mozilla::DataChannel>& aDataChannel,
                    nsPIDOMWindow* aWindow);
   ~nsDOMDataChannel();
 
   nsresult Init(nsPIDOMWindow* aDOMWindow);
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_NSIDOMDATACHANNEL
 
-  NS_REALLY_FORWARD_NSIDOMEVENTTARGET(nsDOMEventTargetHelper)
+  NS_REALLY_FORWARD_NSIDOMEVENTTARGET(mozilla::DOMEventTargetHelper)
 
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMDataChannel,
-                                           nsDOMEventTargetHelper)
+                                           mozilla::DOMEventTargetHelper)
 
   virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
     MOZ_OVERRIDE;
   nsPIDOMWindow* GetParentObject() const
   {
     return GetOwner();
   }
 
--- a/content/base/src/nsDOMFileReader.cpp
+++ b/content/base/src/nsDOMFileReader.cpp
@@ -30,23 +30,23 @@
 #include "nsJSEnvironment.h"
 #include "nsIScriptGlobalObject.h"
 #include "nsCExternalHandlerService.h"
 #include "nsIStreamConverterService.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsIScriptObjectPrincipal.h"
 #include "nsHostObjectProtocolHandler.h"
 #include "mozilla/Base64.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/dom/EncodingUtils.h"
 #include "mozilla/dom/FileReaderBinding.h"
 #include "xpcpublic.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsDOMJSUtils.h"
-#include "nsDOMEventTargetHelper.h"
 
 #include "jsfriendapi.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 #define LOAD_STR "load"
 #define LOADSTART_STR "loadstart"
@@ -64,17 +64,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_IN
                                                 FileIOObject)
   tmp->mResultArrayBuffer = nullptr;
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mFile)
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 
 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(nsDOMFileReader,
-                                               nsDOMEventTargetHelper)
+                                               DOMEventTargetHelper)
   NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mResultArrayBuffer)
 NS_IMPL_CYCLE_COLLECTION_TRACE_END
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMFileReader)
   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
   NS_INTERFACE_MAP_ENTRY(nsIDOMFileReader)
   NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
   NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
--- a/content/base/src/nsDOMFileReader.h
+++ b/content/base/src/nsDOMFileReader.h
@@ -38,17 +38,17 @@ class nsDOMFileReader : public mozilla::
 public:
   nsDOMFileReader();
   virtual ~nsDOMFileReader();
 
   NS_DECL_ISUPPORTS_INHERITED
 
   NS_DECL_NSIDOMFILEREADER
 
-  NS_REALLY_FORWARD_NSIDOMEVENTTARGET(nsDOMEventTargetHelper)
+  NS_REALLY_FORWARD_NSIDOMEVENTTARGET(mozilla::DOMEventTargetHelper)
 
   // nsIInterfaceRequestor 
   NS_DECL_NSIINTERFACEREQUESTOR
 
   // FileIOObject overrides
   virtual void DoAbort(nsAString& aEvent) MOZ_OVERRIDE;
   NS_IMETHOD DoOnStopRequest(nsIRequest* aRequest, nsISupports* aContext,
                              nsresult aStatus, nsAString& aSuccessEvent,
--- a/content/base/src/nsDocument.cpp
+++ b/content/base/src/nsDocument.cpp
@@ -38,16 +38,17 @@
 #include "nsIDocShellTreeItem.h"
 #include "nsCOMArray.h"
 #include "nsDOMClassInfo.h"
 #include "nsCxPusher.h"
 
 #include "mozilla/AsyncEventDispatcher.h"
 #include "mozilla/BasicEvents.h"
 #include "mozilla/EventListenerManager.h"
+#include "mozilla/EventStateManager.h"
 #include "nsIDOMNodeFilter.h"
 
 #include "nsIDOMStyleSheet.h"
 #include "mozilla/dom/Attr.h"
 #include "nsIDOMDOMImplementation.h"
 #include "nsIDOMDocumentXBL.h"
 #include "mozilla/dom/Element.h"
 #include "nsGenericHTMLElement.h"
@@ -153,17 +154,16 @@
 #include "IPeerConnection.h"
 #endif // MOZ_WEBRTC
 
 #include "mozAutoDocUpdate.h"
 #include "nsGlobalWindow.h"
 #include "mozilla/dom/EncodingUtils.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "nsDOMNavigationTiming.h"
-#include "nsEventStateManager.h"
 
 #include "nsSMILAnimationController.h"
 #include "imgIContainer.h"
 #include "nsSVGUtils.h"
 #include "SVGElementFactory.h"
 
 #include "nsRefreshDriver.h"
 
@@ -10588,17 +10588,17 @@ ExitFullscreenInDocTree(nsIDocument* aMa
 }
 
 /* static */
 void
 nsDocument::ExitFullscreen(nsIDocument* aDoc)
 {
   // Unlock the pointer, if it's locked.
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (pointerLockedElement) {
     UnlockPointer();
   }
 
   if (aDoc)  {
     ExitFullscreenInDocTree(aDoc);
     return;
   }
@@ -10653,17 +10653,17 @@ nsDocument::RestorePreviousFullScreenSta
                "chrome document when fullscreen is content only");
 
   if (!IsFullScreenDoc() || !GetWindow() || FullscreenRoots::IsEmpty()) {
     return;
   }
 
   // If fullscreen mode is updated the pointer should be unlocked
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (pointerLockedElement) {
     UnlockPointer();
   }
 
   nsCOMPtr<nsIDocument> fullScreenDoc = GetFullscreenLeaf(this);
 
   // The fullscreen document may contain a <iframe mozbrowser> element which
   // has a cross process child. So send a notification so that its browser
@@ -10852,17 +10852,17 @@ nsDocument::CleanupFullscreenState()
 {
   if (!mFullScreenStack.IsEmpty()) {
     // The top element in the full-screen stack will have full-screen
     // style bits set on it and its ancestors. Remove the style bits.
     // Note the non-top elements won't have the style bits set.
     Element* top = FullScreenStackTop();
     NS_ASSERTION(top, "Should have a top when full-screen stack isn't empty");
     if (top) {
-      nsEventStateManager::SetFullScreenState(top, false);
+      EventStateManager::SetFullScreenState(top, false);
     }
     mFullScreenStack.Clear();
   }
   SetApprovedForFullscreen(false);
   RemoveFullscreenApprovedObserver();
   mFullscreenRoot = nullptr;
 }
 
@@ -10873,35 +10873,35 @@ nsDocument::FullScreenStackPush(Element*
   Element* top = FullScreenStackTop();
   if (top == aElement || !aElement) {
     return false;
   }
   if (top) {
     // We're pushing a new element onto the full-screen stack, so we must
     // remove the ancestor and full-screen styles from the former top of the
     // stack.
-    nsEventStateManager::SetFullScreenState(top, false);
-  }
-  nsEventStateManager::SetFullScreenState(aElement, true);
+    EventStateManager::SetFullScreenState(top, false);
+  }
+  EventStateManager::SetFullScreenState(aElement, true);
   nsWeakPtr weakElement = do_GetWeakReference(aElement);
   mFullScreenStack.AppendElement(weakElement);
   NS_ASSERTION(GetFullScreenElement() == aElement, "Should match");
   return true;
 }
 
 void
 nsDocument::FullScreenStackPop()
 {
   if (mFullScreenStack.IsEmpty()) {
     return;
   }
 
   // Remove styles from existing top element.
   Element* top = FullScreenStackTop();
-  nsEventStateManager::SetFullScreenState(top, false);
+  EventStateManager::SetFullScreenState(top, false);
 
   // Remove top element. Note the remaining top element in the stack
   // will not have full-screen style bits set, so we will need to restore
   // them on the new top element before returning.
   uint32_t last = mFullScreenStack.Length() - 1;
   mFullScreenStack.RemoveElementAt(last);
 
   // Pop from the stack null elements (references to elements which have
@@ -10912,17 +10912,17 @@ nsDocument::FullScreenStackPop()
     if (!element || !element->IsInDoc() || element->OwnerDoc() != this) {
       NS_ASSERTION(!element->IsFullScreenAncestor(),
                    "Should have already removed full-screen styles");
       uint32_t last = mFullScreenStack.Length() - 1;
       mFullScreenStack.RemoveElementAt(last);
     } else {
       // The top element of the stack is now an in-doc element. Apply the
       // full-screen styles and return.
-      nsEventStateManager::SetFullScreenState(element, true);
+      EventStateManager::SetFullScreenState(element, true);
       break;
     }
   }
 }
 
 Element*
 nsDocument::FullScreenStackTop()
 {
@@ -11089,17 +11089,17 @@ nsDocument::RequestFullScreen(Element* a
     // A document is already in fullscreen, unlock the mouse pointer
     // before setting a new document to fullscreen
     UnlockPointer();
   }
 
   // If a document is already in fullscreen, then unlock the mouse pointer
   // before setting a new document to fullscreen
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (pointerLockedElement) {
     UnlockPointer();
   }
 
   // Set the full-screen element. This sets the full-screen style on the
   // element, and the full-screen-ancestor styles on ancestors of the element
   // in this document.
   DebugOnly<bool> x = FullScreenStackPush(aElement);
@@ -11483,17 +11483,17 @@ nsPointerLockPermissionRequest::Allow(JS
     DispatchPointerLockError(d);
     return NS_OK;
   }
 
   // Mark handled here so that we don't need to call it everywhere below.
   Handled();
 
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (e == pointerLockedElement) {
     DispatchPointerLockChange(d);
     return NS_OK;
   }
 
   // Note, we must bypass focus change, so pass true as the last parameter!
   if (!d->ShouldLockPointer(e, pointerLockedElement, true)) {
     DispatchPointerLockError(d);
@@ -11502,20 +11502,20 @@ nsPointerLockPermissionRequest::Allow(JS
 
   if (!d->SetPointerLock(e, NS_STYLE_CURSOR_NONE)) {
     DispatchPointerLockError(d);
     return NS_OK;
   }
 
   d->mCancelledPointerLockRequests = 0;
   e->SetPointerLock();
-  nsEventStateManager::sPointerLockedElement = do_GetWeakReference(e);
-  nsEventStateManager::sPointerLockedDoc = do_GetWeakReference(doc);
-  NS_ASSERTION(nsEventStateManager::sPointerLockedElement &&
-               nsEventStateManager::sPointerLockedDoc,
+  EventStateManager::sPointerLockedElement = do_GetWeakReference(e);
+  EventStateManager::sPointerLockedDoc = do_GetWeakReference(doc);
+  NS_ASSERTION(EventStateManager::sPointerLockedElement &&
+               EventStateManager::sPointerLockedDoc,
                "aElement and this should support weak references!");
 
   DispatchPointerLockChange(d);
   return NS_OK;
 }
 
 void
 nsDocument::SetApprovedForFullscreen(bool aIsApproved)
@@ -11558,28 +11558,28 @@ nsDocument::Observe(nsISupports *aSubjec
 
 void
 nsDocument::RequestPointerLock(Element* aElement)
 {
   NS_ASSERTION(aElement,
     "Must pass non-null element to nsDocument::RequestPointerLock");
 
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (aElement == pointerLockedElement) {
     DispatchPointerLockChange(this);
     return;
   }
 
   if (!ShouldLockPointer(aElement, pointerLockedElement)) {
     DispatchPointerLockError(this);
     return;
   }
 
-  bool userInputOrChromeCaller = nsEventStateManager::IsHandlingUserInput() ||
+  bool userInputOrChromeCaller = EventStateManager::IsHandlingUserInput() ||
                                  nsContentUtils::IsCallerChrome();
 
   gPendingPointerLockRequest =
     new nsPointerLockPermissionRequest(aElement, userInputOrChromeCaller);
   nsCOMPtr<nsIRunnable> r = gPendingPointerLockRequest.get();
   NS_DispatchToMainThread(r);
 }
 
@@ -11689,49 +11689,49 @@ nsDocument::SetPointerLock(Element* aEle
   }
 
   if (aElement && (aElement->OwnerDoc() != this)) {
     NS_WARNING("SetPointerLock(): Element not in this document.");
     return false;
   }
 
   // Hide the cursor and set pointer lock for future mouse events
-  nsRefPtr<nsEventStateManager> esm = presContext->EventStateManager();
+  nsRefPtr<EventStateManager> esm = presContext->EventStateManager();
   esm->SetCursor(aCursorStyle, nullptr, false,
                  0.0f, 0.0f, widget, true);
   esm->SetPointerLock(widget, aElement);
 
   return true;
 }
 
 void
 nsDocument::UnlockPointer(nsIDocument* aDoc)
 {
-  if (!nsEventStateManager::sIsPointerLocked) {
+  if (!EventStateManager::sIsPointerLocked) {
     return;
   }
 
   nsCOMPtr<nsIDocument> pointerLockedDoc =
-    do_QueryReferent(nsEventStateManager::sPointerLockedDoc);
+    do_QueryReferent(EventStateManager::sPointerLockedDoc);
   if (!pointerLockedDoc || (aDoc && aDoc != pointerLockedDoc)) {
     return;
   }
   nsDocument* doc = static_cast<nsDocument*>(pointerLockedDoc.get());
   if (!doc->SetPointerLock(nullptr, NS_STYLE_CURSOR_AUTO)) {
     return;
   }
 
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (pointerLockedElement) {
     pointerLockedElement->ClearPointerLock();
   }
 
-  nsEventStateManager::sPointerLockedElement = nullptr;
-  nsEventStateManager::sPointerLockedDoc = nullptr;
+  EventStateManager::sPointerLockedElement = nullptr;
+  EventStateManager::sPointerLockedDoc = nullptr;
   static_cast<nsDocument*>(pointerLockedDoc.get())->mAllowRelocking = !!aDoc;
   gPendingPointerLockRequest = nullptr;
   DispatchPointerLockChange(pointerLockedDoc);
 }
 
 void
 nsIDocument::UnlockPointer(nsIDocument* aDoc)
 {
@@ -11753,24 +11753,24 @@ nsDocument::GetMozPointerLockElement(nsI
   retval.forget(aPointerLockedElement);
   return NS_OK;
 }
 
 Element*
 nsIDocument::GetMozPointerLockElement()
 {
   nsCOMPtr<Element> pointerLockedElement =
-    do_QueryReferent(nsEventStateManager::sPointerLockedElement);
+    do_QueryReferent(EventStateManager::sPointerLockedElement);
   if (!pointerLockedElement) {
     return nullptr;
   }
 
   // Make sure pointer locked element is in the same document.
   nsCOMPtr<nsIDocument> pointerLockedDoc =
-    do_QueryReferent(nsEventStateManager::sPointerLockedDoc);
+    do_QueryReferent(EventStateManager::sPointerLockedDoc);
   if (pointerLockedDoc != this) {
     return nullptr;
   }
 
   return pointerLockedElement;
 }
 
 void
--- a/content/base/src/nsFrameLoader.cpp
+++ b/content/base/src/nsFrameLoader.cpp
@@ -48,16 +48,17 @@
 #include "nsISHistory.h"
 #include "nsISHistoryInternal.h"
 #include "nsIDOMHTMLDocument.h"
 #include "nsIXULWindow.h"
 #include "nsIEditor.h"
 #include "nsIMozBrowserFrame.h"
 #include "nsIPermissionManager.h"
 #include "nsISHistory.h"
+#include "nsNullPrincipal.h"
 
 #include "nsLayoutUtils.h"
 #include "nsView.h"
 
 #include "nsIURI.h"
 #include "nsIURL.h"
 #include "nsNetUtil.h"
 
@@ -530,17 +531,27 @@ nsFrameLoader::ReallyStartLoadingInterna
     nsCOMPtr<nsIURI> baseURI = mOwnerContent->GetBaseURI();
     loadInfo->SetBaseURI(baseURI);
   }
   else {
     rv = mOwnerContent->NodePrincipal()->GetURI(getter_AddRefs(referrer));
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
-  loadInfo->SetReferrer(referrer);
+  // Use referrer as long as it is not an nsNullPrincipalURI.
+  // We could add a method such as GetReferrerURI to principals to make this
+  // cleaner, but given that we need to start using Source Browsing Context for
+  // referrer (see Bug 960639) this may be wasted effort at this stage.
+  if (referrer) {
+    bool isNullPrincipalScheme;
+    rv = referrer->SchemeIs(NS_NULLPRINCIPAL_SCHEME, &isNullPrincipalScheme);
+    if (NS_SUCCEEDED(rv) && !isNullPrincipalScheme) {
+      loadInfo->SetReferrer(referrer);
+    }
+  }
 
   // Default flags:
   int32_t flags = nsIWebNavigation::LOAD_FLAGS_NONE;
 
   // Flags for browser frame:
   if (OwnerIsBrowserFrame()) {
     flags = nsIWebNavigation::LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP |
             nsIWebNavigation::LOAD_FLAGS_DISALLOW_INHERIT_OWNER;
--- a/content/base/src/nsFrameMessageManager.cpp
+++ b/content/base/src/nsFrameMessageManager.cpp
@@ -1428,17 +1428,17 @@ nsFrameScriptExecutor::LoadFrameScriptIn
       if (!method) {
         return;
       }
       JS::Rooted<JS::Value> rval(cx);
       JS::Rooted<JS::Value> methodVal(cx, JS::ObjectValue(*method));
       ok = JS_CallFunctionValue(cx, global, methodVal,
                                 JS::HandleValueArray::empty(), &rval);
     } else if (script) {
-      ok = JS_ExecuteScript(cx, global, script, nullptr);
+      ok = JS_ExecuteScript(cx, global, script);
     }
 
     if (!ok) {
       nsJSUtils::ReportPendingException(cx);
     }
   }
 }
 
--- a/content/base/src/nsINode.cpp
+++ b/content/base/src/nsINode.cpp
@@ -35,17 +35,16 @@
 #include "mozilla/dom/Attr.h"
 #include "nsDOMAttributeMap.h"
 #include "nsDOMCID.h"
 #include "nsDOMCSSAttrDeclaration.h"
 #include "nsError.h"
 #include "nsDOMMutationObserver.h"
 #include "nsDOMString.h"
 #include "nsDOMTokenList.h"
-#include "nsEventStateManager.h"
 #include "nsFocusManager.h"
 #include "nsFrameManager.h"
 #include "nsFrameSelection.h"
 #include "nsGenericHTMLElement.h"
 #include "nsGkAtoms.h"
 #include "nsIAnonymousContentCreator.h"
 #include "nsIAtom.h"
 #include "nsIBaseWindow.h"
@@ -2255,17 +2254,17 @@ nsINode::SizeOfExcludingThis(MallocSizeO
   {                                                                          \
     EventListenerManager *elm = GetOrCreateListenerManager();                \
     if (elm) {                                                               \
       elm->SetEventHandler(nsGkAtoms::on##name_, EmptyString(), handler);    \
     }                                                                        \
   }
 #define TOUCH_EVENT EVENT
 #define DOCUMENT_ONLY_EVENT EVENT
-#include "nsEventNameList.h"
+#include "mozilla/EventNameList.h"
 #undef DOCUMENT_ONLY_EVENT
 #undef TOUCH_EVENT
 #undef EVENT
 
 bool
 nsINode::Contains(const nsINode* aOther) const
 {
   if (aOther == this) {
--- a/content/base/src/nsInProcessTabChildGlobal.cpp
+++ b/content/base/src/nsInProcessTabChildGlobal.cpp
@@ -139,34 +139,34 @@ nsInProcessTabChildGlobal::Init()
                    "Couldn't initialize nsInProcessTabChildGlobal");
   mMessageManager = new nsFrameMessageManager(this,
                                               nullptr,
                                               dom::ipc::MM_CHILD);
   return NS_OK;
 }
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED_2(nsInProcessTabChildGlobal,
-                                     nsDOMEventTargetHelper,
+                                     DOMEventTargetHelper,
                                      mMessageManager,
                                      mGlobal)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsInProcessTabChildGlobal)
   NS_INTERFACE_MAP_ENTRY(nsIMessageListenerManager)
   NS_INTERFACE_MAP_ENTRY(nsIMessageSender)
   NS_INTERFACE_MAP_ENTRY(nsISyncMessageSender)
   NS_INTERFACE_MAP_ENTRY(nsIContentFrameMessageManager)
   NS_INTERFACE_MAP_ENTRY(nsIInProcessContentFrameMessageManager)
   NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal)
   NS_INTERFACE_MAP_ENTRY(nsIGlobalObject)
   NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
   NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(ContentFrameMessageManager)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
-NS_IMPL_ADDREF_INHERITED(nsInProcessTabChildGlobal, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(nsInProcessTabChildGlobal, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(nsInProcessTabChildGlobal, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(nsInProcessTabChildGlobal, DOMEventTargetHelper)
 
 NS_IMETHODIMP
 nsInProcessTabChildGlobal::GetContent(nsIDOMWindow** aContent)
 {
   *aContent = nullptr;
   nsCOMPtr<nsIDOMWindow> window = do_GetInterface(mDocShell);
   window.swap(*aContent);
   return NS_OK;
@@ -212,17 +212,17 @@ nsInProcessTabChildGlobal::Disconnect()
 
 void
 nsInProcessTabChildGlobal::DelayedDisconnect()
 {
   // Don't let the event escape
   mOwner = nullptr;
 
   // Fire the "unload" event
-  nsDOMEventTargetHelper::DispatchTrustedEvent(NS_LITERAL_STRING("unload"));
+  DOMEventTargetHelper::DispatchTrustedEvent(NS_LITERAL_STRING("unload"));
 
   // Continue with the Disconnect cleanup
   nsCOMPtr<nsPIDOMWindow> win = do_GetInterface(mDocShell);
   if (win) {
     MOZ_ASSERT(win->IsOuterWindow());
     win->SetChromeEventHandler(win->GetChromeEventHandler());
   }
   mDocShell = nullptr;
--- a/content/base/src/nsInProcessTabChildGlobal.h
+++ b/content/base/src/nsInProcessTabChildGlobal.h
@@ -3,50 +3,50 @@
 /* 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 "mozilla/DOMEventTargetHelper.h"
 #include "nsCOMPtr.h"
 #include "nsFrameMessageManager.h"
 #include "nsIScriptContext.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsIScriptObjectPrincipal.h"
 #include "nsIScriptContext.h"
 #include "nsIClassInfo.h"
 #include "nsIDocShell.h"
 #include "nsIDOMElement.h"
 #include "nsCOMArray.h"
 #include "nsIRunnable.h"
 #include "nsIGlobalObject.h"
 #include "nsIScriptObjectPrincipal.h"
 #include "nsWeakReference.h"
 
 namespace mozilla {
 class EventChainPreVisitor;
 } // namespace mozilla
 
-class nsInProcessTabChildGlobal : public nsDOMEventTargetHelper,
+class nsInProcessTabChildGlobal : public mozilla::DOMEventTargetHelper,
                                   public nsFrameScriptExecutor,
                                   public nsIInProcessContentFrameMessageManager,
                                   public nsIGlobalObject,
                                   public nsIScriptObjectPrincipal,
                                   public nsSupportsWeakReference,
                                   public mozilla::dom::ipc::MessageManagerCallback
 {
 public:
   nsInProcessTabChildGlobal(nsIDocShell* aShell, nsIContent* aOwner,
                             nsFrameMessageManager* aChrome);
   virtual ~nsInProcessTabChildGlobal();
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsInProcessTabChildGlobal,
-                                           nsDOMEventTargetHelper)
+                                           mozilla::DOMEventTargetHelper)
   NS_FORWARD_SAFE_NSIMESSAGELISTENERMANAGER(mMessageManager)
   NS_FORWARD_SAFE_NSIMESSAGESENDER(mMessageManager)
   NS_IMETHOD SendSyncMessage(const nsAString& aMessageName,
                              JS::Handle<JS::Value> aObject,
                              JS::Handle<JS::Value> aRemote,
                              nsIPrincipal* aPrincipal,
                              JSContext* aCx,
                              uint8_t aArgc,
@@ -102,30 +102,31 @@ public:
 
   virtual nsresult PreHandleEvent(
                      mozilla::EventChainPreVisitor& 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);
+    return mozilla::DOMEventTargetHelper::AddEventListener(aType, aListener,
+                                                           aUseCapture, false,
+                                                           2);
   }
   NS_IMETHOD AddEventListener(const nsAString& aType,
                               nsIDOMEventListener* aListener,
                               bool aUseCapture, bool aWantsUntrusted,
                               uint8_t optional_argc) MOZ_OVERRIDE
   {
-    return nsDOMEventTargetHelper::AddEventListener(aType, aListener,
-                                                    aUseCapture,
-                                                    aWantsUntrusted,
-                                                    optional_argc);
+    return mozilla::DOMEventTargetHelper::AddEventListener(aType, aListener,
+                                                           aUseCapture,
+                                                           aWantsUntrusted,
+                                                           optional_argc);
   }
-  using nsDOMEventTargetHelper::AddEventListener;
+  using mozilla::DOMEventTargetHelper::AddEventListener;
 
   virtual JSContext* GetJSContextForEventHandlers() MOZ_OVERRIDE { return nsContentUtils::GetSafeJSContext(); }
   virtual nsIPrincipal* GetPrincipal() MOZ_OVERRIDE { return mPrincipal; }
   void LoadFrameScript(const nsAString& aURL, bool aRunInGlobalScope);
   void Disconnect();
   void SendMessageToParent(const nsString& aMessage, bool aSync,
                            const nsString& aJSON,
                            nsTArray<nsString>* aJSONRetVal);
--- a/content/base/src/nsScriptLoader.cpp
+++ b/content/base/src/nsScriptLoader.cpp
@@ -1083,19 +1083,17 @@ nsScriptLoader::EvaluateScript(nsScriptL
   context->SetProcessingScriptTag(true);
 
   // Update our current script.
   nsCOMPtr<nsIScriptElement> oldCurrent = mCurrentScript;
   mCurrentScript = aRequest->mElement;
 
   JS::CompileOptions options(entryScript.cx());
   FillCompileOptionsForRequest(aRequest, global, &options);
-  nsJSUtils::EvaluateOptions evalOptions;
-  nsresult rv = nsJSUtils::EvaluateString(entryScript.cx(), aScript, global,
-                                          options, evalOptions, nullptr,
+  nsresult rv = nsJSUtils::EvaluateString(entryScript.cx(), aScript, global, options,
                                           aOffThreadToken);
 
   // Put the old script back in case it wants to do anything else.
   mCurrentScript = oldCurrent;
 
   context->SetProcessingScriptTag(oldProcessingScriptTag);
   return rv;
 }
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -229,34 +229,34 @@ XMLHttpRequestAuthPrompt::PromptPassword
   return NS_OK;
 }
 
 /////////////////////////////////////////////
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(nsXHREventTarget)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsXHREventTarget,
-                                                  nsDOMEventTargetHelper)
+                                                  DOMEventTargetHelper)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsXHREventTarget,
-                                                nsDOMEventTargetHelper)
+                                                DOMEventTargetHelper)
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsXHREventTarget)
   NS_INTERFACE_MAP_ENTRY(nsIXMLHttpRequestEventTarget)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
-
-NS_IMPL_ADDREF_INHERITED(nsXHREventTarget, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(nsXHREventTarget, nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(nsXHREventTarget, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(nsXHREventTarget, DOMEventTargetHelper)
 
 void
 nsXHREventTarget::DisconnectFromOwner()
 {
-  nsDOMEventTargetHelper::DisconnectFromOwner();
+  DOMEventTargetHelper::DisconnectFromOwner();
 }
 
 /////////////////////////////////////////////
 
 NS_INTERFACE_MAP_BEGIN(nsXMLHttpRequestUpload)
   NS_INTERFACE_MAP_ENTRY(nsIXMLHttpRequestUpload)
 NS_INTERFACE_MAP_END_INHERITING(nsXHREventTarget)
 
@@ -445,17 +445,17 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(
       tmp->GetWrapper();
     }
     return true;
   }
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
 
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsXMLHttpRequest)
   return tmp->
-    IsBlackAndDoesNotNeedTracing(static_cast<nsDOMEventTargetHelper*>(tmp));
+    IsBlackAndDoesNotNeedTracing(static_cast<DOMEventTargetHelper*>(tmp));
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
 
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsXMLHttpRequest)
   return tmp->IsBlack();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsXMLHttpRequest,
                                                   nsXHREventTarget)
@@ -1405,17 +1405,17 @@ nsXMLHttpRequest::CreateReadystatechange
 
   // We assume anyone who managed to call CreateReadystatechangeEvent is trusted
   (*aDOMEvent)->SetTrusted(true);
 
   return NS_OK;
 }
 
 void
-nsXMLHttpRequest::DispatchProgressEvent(nsDOMEventTargetHelper* aTarget,
+nsXMLHttpRequest::DispatchProgressEvent(DOMEventTargetHelper* aTarget,
                                         const nsAString& aType,
                                         bool aLengthComputable,
                                         uint64_t aLoaded, uint64_t aTotal)
 {
   NS_ASSERTION(aTarget, "null target");
   NS_ASSERTION(!aType.IsEmpty(), "missing event type");
 
   if (NS_FAILED(CheckInnerWindowCorrectness()) ||
@@ -2015,17 +2015,17 @@ nsXMLHttpRequest::OnStartRequest(nsIRequ
     }
 
     // Create an empty document from it.  Here we have to cheat a little bit...
     // Setting the base URI to |baseURI| won't work if the document has a null
     // principal, so use mPrincipal when creating the document, then reset the
     // principal.
     const nsAString& emptyStr = EmptyString();
     nsCOMPtr<nsIDOMDocument> responseDoc;
-    nsIGlobalObject* global = nsDOMEventTargetHelper::GetParentObject();
+    nsIGlobalObject* global = DOMEventTargetHelper::GetParentObject();
     rv = NS_NewDOMDocument(getter_AddRefs(responseDoc),
                            emptyStr, emptyStr, nullptr, docURI,
                            baseURI, mPrincipal, true, global,
                            mIsHtml ? DocumentFlavorHTML :
                                      DocumentFlavorLegacyGuess);
     NS_ENSURE_SUCCESS(rv, rv);
     mResponseXML = do_QueryInterface(responseDoc);
     mResponseXML->SetPrincipal(documentPrincipal);
--- a/content/base/src/nsXMLHttpRequest.h
+++ b/content/base/src/nsXMLHttpRequest.h
@@ -20,22 +20,22 @@
 #include "nsIChannelEventSink.h"
 #include "nsIAsyncVerifyRedirectCallback.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIHttpHeaderVisitor.h"
 #include "nsIProgressEventSink.h"
 #include "nsJSUtils.h"
 #include "nsTArray.h"
 #include "nsITimer.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsIPrincipal.h"
 #include "nsIScriptObjectPrincipal.h"
 #include "nsISizeOfEventTarget.h"
 
 #include "mozilla/Assertions.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/MemoryReporting.h"
 #include "mozilla/dom/TypedArray.h"
 #include "mozilla/dom/XMLHttpRequestBinding.h"
 
 #ifdef Status
 /* Xlib headers insist on this for some reason... Nuke it because
    it'll override our member name */
 #undef Status
@@ -91,58 +91,58 @@ public:
 
 protected:
   static bool areOverlappingRegions(const uint8_t* aStart1, uint32_t aLength1,
                                     const uint8_t* aStart2, uint32_t aLength2);
 };
 
 } // namespace mozilla
 
-class nsXHREventTarget : public nsDOMEventTargetHelper,
+class nsXHREventTarget : public mozilla::DOMEventTargetHelper,
                          public nsIXMLHttpRequestEventTarget
 {
 protected:
-  nsXHREventTarget(nsDOMEventTargetHelper* aOwner)
-    : nsDOMEventTargetHelper(aOwner)
+  nsXHREventTarget(mozilla::DOMEventTargetHelper* aOwner)
+    : mozilla::DOMEventTargetHelper(aOwner)
   {
   }
 
   nsXHREventTarget()
   {
   }
 
 public:
   typedef mozilla::dom::XMLHttpRequestResponseType
           XMLHttpRequestResponseType;
   typedef mozilla::ErrorResult
           ErrorResult;
 
   virtual ~nsXHREventTarget() {}
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsXHREventTarget,
-                                           nsDOMEventTargetHelper)
+                                           mozilla::DOMEventTargetHelper)
   NS_DECL_NSIXMLHTTPREQUESTEVENTTARGET
-  NS_REALLY_FORWARD_NSIDOMEVENTTARGET(nsDOMEventTargetHelper)
+  NS_REALLY_FORWARD_NSIDOMEVENTTARGET(mozilla::DOMEventTargetHelper)
 
   IMPL_EVENT_HANDLER(loadstart)
   IMPL_EVENT_HANDLER(progress)
   IMPL_EVENT_HANDLER(abort)
   IMPL_EVENT_HANDLER(error)
   IMPL_EVENT_HANDLER(load)
   IMPL_EVENT_HANDLER(timeout)
   IMPL_EVENT_HANDLER(loadend)
   
   virtual void DisconnectFromOwner();
 };
 
 class nsXMLHttpRequestUpload MOZ_FINAL : public nsXHREventTarget,
                                          public nsIXMLHttpRequestUpload
 {
 public:
-  nsXMLHttpRequestUpload(nsDOMEventTargetHelper* aOwner)
+  nsXMLHttpRequestUpload(mozilla::DOMEventTargetHelper* aOwner)
     : nsXHREventTarget(aOwner)
   {
   }
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_FORWARD_NSIXMLHTTPREQUESTEVENTTARGET(nsXHREventTarget::)
   NS_REALLY_FORWARD_NSIDOMEVENTTARGET(nsXHREventTarget)
   NS_DECL_NSIXMLHTTPREQUESTUPLOAD
@@ -500,17 +500,17 @@ public:
   }
 
   // We need a GetInterface callable from JS for chrome JS
   JS::Value GetInterface(JSContext* aCx, nsIJSID* aIID, ErrorResult& aRv);
 
   // This creates a trusted readystatechange event, which is not cancelable and
   // doesn't bubble.
   nsresult CreateReadystatechangeEvent(nsIDOMEvent** aDOMEvent);
-  void DispatchProgressEvent(nsDOMEventTargetHelper* aTarget,
+  void DispatchProgressEvent(mozilla::DOMEventTargetHelper* aTarget,
                              const nsAString& aType,
                              bool aLengthComputable,
                              uint64_t aLoaded, uint64_t aTotal);
 
   // Dispatch the "progress" event on the XHR or XHR.upload object if we've
   // received data since the last "progress" event. Also dispatches
   // "uploadprogress" as needed.
   void MaybeDispatchProgressEvents(bool aFinalProgress);
--- a/content/base/test/browser_state_notifications.js
+++ b/content/base/test/browser_state_notifications.js
@@ -17,17 +17,17 @@ const Test = routine => () => {
         ok(false, error);
         finish();
       });
 };
 
 // Returns promise for the observer notification subject for
 // the given topic. If `receive("foo")` is called `n` times
 // nth promise is resolved on an `nth` "foo" notification.
-const receive = (topic, p) => {
+const receive = (topic, p, syncCallback) => {
   const { promise, resolve, reject } = Promise.defer();
   const { queue } = receive;
   const timeout = () => {
     queue.splice(queue.indexOf(resolve) - 1, 2);
     reject(new Error("Timeout"));
   };
 
   const observer = {
@@ -38,16 +38,20 @@ const receive = (topic, p) => {
       // If observer is a first one with a given `topic`
       // in a queue resolve promise and take it off the queue
       // otherwise keep waiting.
       const index = queue.indexOf(topic);
       if (queue.indexOf(resolve) === index + 1) {
         removeObserver(observer, topic);
         clearTimeout(id, reject);
         queue.splice(index, 2);
+        // Some tests need to be executed synchronously when the event is fired.
+        if (syncCallback) {
+          syncCallback(subject);
+        }
         resolve(subject);
       }
     }
   };
   const id = setTimeout(timeout, 90000);
   addObserver(observer, topic, false);
   queue.push(topic, resolve);
 
@@ -68,65 +72,73 @@ const isData = document => document.URL.
 const uri1 = "data:text/html;charset=utf-8,<h1>1</h1>";
 // For whatever reason going back on load event doesn't work so timeout it is :(
 const uri2 = "data:text/html;charset=utf-8,<h1>2</h1><script>setTimeout(back,100)</script>";
 const uri3 = "data:text/html;charset=utf-8,<h1>3</h1>";
 
 const uri4 = "chrome://browser/content/license.html";
 
 const test = Test(function*() {
-  let documentInteractive = receive("content-document-interactive", isData);
+  let documentInteractive = receive("content-document-interactive", isData, d => {
+    // This test is executed synchronously when the event is received.
+    is(d.readyState, "interactive", "document is interactive");
+    is(d.URL, uri1, "document.URL matches tab url");
+  });
   let documentLoaded = receive("content-document-loaded", isData);
   let pageShown = receive("content-page-shown", isData);
 
   info("open: uri#1");
   const tab1 = openTab(uri1);
   const browser1 = gBrowser.getBrowserForTab(tab1);
 
   let interactiveDocument1 = yield documentInteractive;
-  is(interactiveDocument1.readyState, "interactive", "document is interactive");
-  is(interactiveDocument1.URL, uri1, "document.URL matches tab url");
 
   let loadedDocument1 = yield documentLoaded;
   is(loadedDocument1.readyState, "complete", "document is loaded");
   is(interactiveDocument1, loadedDocument1, "interactive document is loaded");
 
   let shownPage = yield pageShown;
   is(interactiveDocument1, shownPage, "loaded document is shown");
 
   // Wait until history entry is created before loading new uri.
   yield receive("sessionstore-state-write-complete");
 
   info("load uri#2");
 
-  documentInteractive = receive("content-document-interactive", isData);
+  documentInteractive = receive("content-document-interactive", isData, d => {
+    // This test is executed synchronously when the event is received.
+    is(d.readyState, "interactive", "document is interactive");
+    is(d.URL, uri2, "document.URL matches URL loaded");
+  });
   documentLoaded = receive("content-document-loaded", isData);
   pageShown = receive("content-page-shown", isData);
   let pageHidden = receive("content-page-hidden", isData);
 
   browser1.loadURI(uri2);
 
   let hiddenPage = yield pageHidden;
   is(interactiveDocument1, hiddenPage, "loaded document is hidden");
 
   let interactiveDocument2 = yield documentInteractive;
-  is(interactiveDocument2.readyState, "interactive", "document is interactive");
-  is(interactiveDocument2.URL, uri2, "document.URL matches URL loaded");
 
   let loadedDocument2 = yield documentLoaded;
   is(loadedDocument2.readyState, "complete", "document is loaded");
   is(interactiveDocument2, loadedDocument2, "interactive document is loaded");
 
   shownPage = yield pageShown;
   is(interactiveDocument2, shownPage, "loaded document is shown");
 
   info("go back to uri#1");
 
 
-  documentInteractive = receive("content-document-interactive", isData);
+  documentInteractive = receive("content-document-interactive", isData, d => {
+    // This test is executed synchronously when the event is received.
+    is(d.readyState, "interactive", "document is interactive");
+    is(d.URL, uri3, "document.URL matches URL loaded");
+  });
   documentLoaded = receive("content-document-loaded", isData);
   pageShown = receive("content-page-shown", isData);
   pageHidden = receive("content-page-hidden", isData);
 
   hiddenPage = yield pageHidden;
   is(interactiveDocument2, hiddenPage, "new document is hidden");
 
   shownPage = yield pageShown;
@@ -134,38 +146,38 @@ const test = Test(function*() {
 
   info("load uri#3");
 
   browser1.loadURI(uri3);
 
   pageShown = receive("content-page-shown", isData);
 
   let interactiveDocument3 = yield documentInteractive;
-  is(interactiveDocument3.readyState, "interactive", "document is interactive");
-  is(interactiveDocument3.URL, uri3, "document.URL matches URL loaded");
 
   let loadedDocument3 = yield documentLoaded;
   is(loadedDocument3.readyState, "complete", "document is loaded");
   is(interactiveDocument3, loadedDocument3, "interactive document is loaded");
 
   shownPage = yield pageShown;
   is(interactiveDocument3, shownPage, "previous document is shown");
 
   gBrowser.removeTab(tab1);
 
   info("load chrome uri");
 
   const tab2 = openTab(uri4);
-  documentInteractive = receive("chrome-document-interactive");
+  documentInteractive = receive("chrome-document-interactive", null, d => {
+    // This test is executed synchronously when the event is received.
+    is(d.readyState, "interactive", "document is interactive");
+    is(d.URL, uri4, "document.URL matches URL loaded");
+  });
   documentLoaded = receive("chrome-document-loaded");
   pageShown = receive("chrome-page-shown");
 
   const interactiveDocument4 = yield documentInteractive;
-  is(interactiveDocument4.readyState, "interactive", "document is interactive");
-  is(interactiveDocument4.URL, uri4, "document.URL matches URL loaded");
 
   let loadedDocument4 = yield documentLoaded;
   is(loadedDocument4.readyState, "complete", "document is loaded");
   is(interactiveDocument4, loadedDocument4, "interactive document is loaded");
 
   shownPage = yield pageShown;
   is(interactiveDocument4, shownPage, "loaded chrome document is shown");
 
--- a/content/canvas/src/CanvasRenderingContext2D.cpp
+++ b/content/canvas/src/CanvasRenderingContext2D.cpp
@@ -4400,34 +4400,42 @@ CanvasPath::Constructor(const GlobalObje
 
   nsRefPtr<CanvasPath> path = new CanvasPath(aGlobal.GetAsSupports(), tempPath->CopyToBuilder());
   return path.forget();
 }
 
 void
 CanvasPath::ClosePath()
 {
+  EnsurePathBuilder();
+
   mPathBuilder->Close();
 }
 
 void
 CanvasPath::MoveTo(double x, double y)
 {
+  EnsurePathBuilder();
+
   mPathBuilder->MoveTo(Point(ToFloat(x), ToFloat(y)));
 }
 
 void
 CanvasPath::LineTo(double x, double y)
 {
+  EnsurePathBuilder();
+
   mPathBuilder->LineTo(Point(ToFloat(x), ToFloat(y)));
 }
 
 void
 CanvasPath::QuadraticCurveTo(double cpx, double cpy, double x, double y)
 {
+  EnsurePathBuilder();
+
   mPathBuilder->QuadraticBezierTo(gfx::Point(ToFloat(cpx), ToFloat(cpy)),
                                   gfx::Point(ToFloat(x), ToFloat(y)));
 }
 
 void
 CanvasPath::BezierCurveTo(double cp1x, double cp1y,
                           double cp2x, double cp2y,
                           double x, double y)
@@ -4522,48 +4530,75 @@ CanvasPath::Arc(double x, double y, doub
   }
 
   ArcToBezier(this, Point(x, y), Size(radius, radius), startAngle, endAngle, anticlockwise);
 }
 
 void
 CanvasPath::LineTo(const gfx::Point& aPoint)
 {
+  EnsurePathBuilder();
+
   mPathBuilder->LineTo(aPoint);
 }
 
 void
 CanvasPath::BezierTo(const gfx::Point& aCP1,
                      const gfx::Point& aCP2,
                      const gfx::Point& aCP3)
 {
+  EnsurePathBuilder();
+
   mPathBuilder->BezierTo(aCP1, aCP2, aCP3);
 }
 
 RefPtr<gfx::Path>
 CanvasPath::GetPath(const CanvasWindingRule& winding, const mozilla::RefPtr<mozilla::gfx::DrawTarget>& mTarget) const
 {
   FillRule fillRule = FillRule::FILL_WINDING;
   if (winding == CanvasWindingRule::Evenodd) {
     fillRule = FillRule::FILL_EVEN_ODD;
   }
 
-  RefPtr<Path> mTempPath = mPathBuilder->Finish();
-  if (!mTempPath)
-    return mTempPath;
+  if (mPath &&
+      (mPath->GetBackendType() == mTarget->GetType()) &&
+      (mPath->GetFillRule() == fillRule)) {
+    return mPath;
+  }
+
+  if (!mPath) {
+    // if there is no path, there must be a pathbuilder
+    MOZ_ASSERT(mPathBuilder);
+    mPath = mPathBuilder->Finish();
+    if (!mPath)
+      return mPath;
+
+    mPathBuilder = nullptr;
+  }
 
   // retarget our backend if we're used with a different backend
-  if (mTempPath->GetBackendType() != mTarget->GetType()) {
-    mPathBuilder = mTarget->CreatePathBuilder(fillRule);
-    mTempPath->StreamToSink(mPathBuilder);
-    mTempPath = mPathBuilder->Finish();
-  } else if (mTempPath->GetFillRule() != fillRule) {
-    mPathBuilder = mTempPath->CopyToBuilder(fillRule);
-    mTempPath = mPathBuilder->Finish();
-  }
-
-  mPathBuilder = mTempPath->CopyToBuilder();
-
-  return mTempPath;
+  if (mPath->GetBackendType() != mTarget->GetType()) {
+    RefPtr<PathBuilder> tmpPathBuilder = mTarget->CreatePathBuilder(fillRule);
+    mPath->StreamToSink(tmpPathBuilder);
+    mPath = tmpPathBuilder->Finish();
+  } else if (mPath->GetFillRule() != fillRule) {
+    RefPtr<PathBuilder> tmpPathBuilder = mPath->CopyToBuilder(fillRule);
+    mPath = tmpPathBuilder->Finish();
+  }
+
+  return mPath;
+}
+
+void
+CanvasPath::EnsurePathBuilder() const
+{
+  if (mPathBuilder) {
+    return;
+  }
+
+  // if there is not pathbuilder, there must be a path
+  MOZ_ASSERT(mPath);
+  mPathBuilder = mPath->CopyToBuilder();
+  mPath = nullptr;
 }
 
 }
 }
--- a/content/canvas/src/CanvasRenderingContext2D.h
+++ b/content/canvas/src/CanvasRenderingContext2D.h
@@ -91,17 +91,20 @@ public:
   CanvasPath(nsCOMPtr<nsISupports> aParent, RefPtr<gfx::PathBuilder> mPathBuilder);
   virtual ~CanvasPath() {}
 
 private:
 
   nsCOMPtr<nsISupports> mParent;
   static gfx::Float ToFloat(double aValue) { return gfx::Float(aValue); }
 
+  mutable RefPtr<gfx::Path> mPath;
   mutable RefPtr<gfx::PathBuilder> mPathBuilder;
+
+  void EnsurePathBuilder() const;
 };
 
 struct CanvasBidiProcessor;
 class CanvasRenderingContext2DUserData;
 
 /**
  ** CanvasRenderingContext2D
  **/
--- a/content/canvas/test/reftest/reftest.list
+++ b/content/canvas/test/reftest/reftest.list
@@ -12,150 +12,150 @@ pref(webgl.disabled,true)  == webgl-disa
 # Android 2.2 ARMv6 slaves can't seem to use WebGL, but we can't seem to
 # disable the ARMv6 runs without disabling ARMv7, which works fine.
 # For now, just mark versions <15 (<4.0) as random, so we still get
 # assert coverage.
 
 # Test: {aa, alpha, preserve, readback} = 16
                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?__&_____&________  wrapper.html?green.png
                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?aa&_____&________  wrapper.html?green.png
-fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?__&alpha&________  wrapper.html?green.png
-fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?aa&alpha&________  wrapper.html?green.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?__&alpha&________  wrapper.html?green.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?aa&alpha&________  wrapper.html?green.png
                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?__&_____&preserve  wrapper.html?green.png
                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?aa&_____&preserve  wrapper.html?green.png
-fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?__&alpha&preserve  wrapper.html?green.png
-fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?aa&alpha&preserve  wrapper.html?green.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?__&alpha&preserve  wrapper.html?green.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?aa&alpha&preserve  wrapper.html?green.png
 
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&__&_____&________  wrapper.html?green.png
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&aa&_____&________  wrapper.html?green.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&__&alpha&________  wrapper.html?green.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&aa&alpha&________  wrapper.html?green.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&__&alpha&________  wrapper.html?green.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&aa&alpha&________  wrapper.html?green.png
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&__&_____&preserve  wrapper.html?green.png
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&aa&_____&preserve  wrapper.html?green.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&__&alpha&preserve  wrapper.html?green.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&aa&alpha&preserve  wrapper.html?green.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&__&alpha&preserve  wrapper.html?green.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,91) random-if(Android&&AndroidVersion<15)  == webgl-clear-test.html?readback&aa&alpha&preserve  wrapper.html?green.png
 
 # Check that resize works:
 random-if(Android&&AndroidVersion<15)  == webgl-resize-test.html  wrapper.html?green.png
 
 # Check orientation:
                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?__&_____&________  wrapper.html?white-top-left.png
                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?aa&_____&________  wrapper.html?white-top-left.png
-fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?__&alpha&________  wrapper.html?white-top-left.png
-fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?aa&alpha&________  wrapper.html?white-top-left.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?__&alpha&________  wrapper.html?white-top-left.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?aa&alpha&________  wrapper.html?white-top-left.png
                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?__&_____&preserve  wrapper.html?white-top-left.png
                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?aa&_____&preserve  wrapper.html?white-top-left.png
-fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?__&alpha&preserve  wrapper.html?white-top-left.png
-fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?aa&alpha&preserve  wrapper.html?white-top-left.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?__&alpha&preserve  wrapper.html?white-top-left.png
+random-if(gtk2Widget) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?aa&alpha&preserve  wrapper.html?white-top-left.png
 
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&__&_____&________  wrapper.html?white-top-left.png
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&aa&_____&________  wrapper.html?white-top-left.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&__&alpha&________  wrapper.html?white-top-left.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&aa&alpha&________  wrapper.html?white-top-left.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&__&alpha&________  wrapper.html?white-top-left.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&aa&alpha&________  wrapper.html?white-top-left.png
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&__&_____&preserve  wrapper.html?white-top-left.png
 pref(webgl.force-layers-readback,true)                      random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&aa&_____&preserve  wrapper.html?white-top-left.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&__&alpha&preserve  wrapper.html?white-top-left.png
-pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&aa&alpha&preserve  wrapper.html?white-top-left.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&__&alpha&preserve  wrapper.html?white-top-left.png
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) fuzzy-if(B2G,256,90) random-if(Android&&AndroidVersion<15)  == webgl-orientation-test.html?readback&aa&alpha&preserve  wrapper.html?white-top-left.png
 
 # Does we draw the correct color in the correct places with all context creation options?
 # (Note that our context creation option matrix is 2^6 = 64)
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&_______&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&_______&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&_______&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&_______&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&premult&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&premult&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&premult&________&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&premult&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&________&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&________&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&________&_______  wrapper.html?colors.png # Bug 844439
 
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&preserve&_______  wrapper.html?colors.png # Bug 844439
 
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&_______&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&_______&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&_______&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&_______&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&premult&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&premult&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&premult&________&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&premult&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&________&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&________&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&________&stencil  wrapper.html?colors.png # Bug 844439
                                              
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&_______&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&_____&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&_____&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&_____&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&_____&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&_____&depth&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
 random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&_____&depth&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
-random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?__&alpha&depth&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?aa&alpha&depth&premult&preserve&stencil  wrapper.html?colors.png # Bug 844439
 
 
 # Check a smaller selection for readback:
 pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&__&_____&________  wrapper.html?colors.png # Bug 844439
 pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&aa&_____&________  wrapper.html?colors.png # Bug 844439
-pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&__&alpha&________  wrapper.html?colors.png # Bug 844439
-pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&aa&alpha&________  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&__&alpha&________  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&aa&alpha&________  wrapper.html?colors.png # Bug 844439
 pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&__&_____&preserve  wrapper.html?colors.png # Bug 844439
 pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&aa&_____&preserve  wrapper.html?colors.png # Bug 844439
-pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&__&alpha&preserve  wrapper.html?colors.png # Bug 844439
-pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&aa&alpha&preserve  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&__&alpha&preserve  wrapper.html?colors.png # Bug 844439
+random-if(gtk2Widget) pref(webgl.force-layers-readback,true) random-if(B2G) random-if(Android&&AndroidVersion<15)  == webgl-color-test.html?readback&aa&alpha&preserve  wrapper.html?colors.png # Bug 844439
 
 
 # Check alpha behavior:
 fuzzy-if(B2G,256,83) random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=1.0&alphaVal=1.0  wrapper.html?colors.png
 # These tests don't use wrapper.html, as there appear to be invalidation issues with black.png and async image decoding - Bug 803299
 random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=0.0&alphaVal=1.0  black.html
 
 fuzzy-if(B2G,256,83) random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=1.0&alphaVal=0.0        wrapper.html?colors.png
 random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=1.0&alphaVal=0.0&alpha  wrapper.html?white.png
 
 fuzzy(1,65536) fuzzy-if(B2G,256,83) fuzzy-if(Android||B2G,9,65536) random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=0.5&alphaVal=1.0  wrapper.html?half-colors.png
 
 # Test premult:
 # random-if(B2G) from bug 983650
-fuzzy(1,65536) random-if(B2G) fuzzy-if(Android,9,65536)                                random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=1.0&alphaVal=0.5&alpha          wrapper.html?colors-half-alpha.png
-fuzzy(1,65536) fails-if(B2G) fuzzy-if(Android,9,65536) fails-if(cocoaWidget||Android) random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=0.5&alphaVal=0.5&alpha          wrapper.html?half-colors-half-alpha.png
+fuzzy(1,65536) random-if(gtk2Widget) random-if(B2G) fuzzy-if(Android,9,65536)                                random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=1.0&alphaVal=0.5&alpha          wrapper.html?colors-half-alpha.png
+fuzzy(1,65536) random-if(gtk2Widget) fails-if(B2G) fuzzy-if(Android,9,65536) fails-if(cocoaWidget||Android) random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=0.5&alphaVal=0.5&alpha          wrapper.html?half-colors-half-alpha.png
 # random-if(B2G) from bug 983650
 fuzzy(1,65536) random-if(B2G) fuzzy-if(Android,9,65536)                                random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=0.5&alphaVal=0.5&alpha&premult  wrapper.html?colors-half-alpha.png
 
 # Test over-bright premult:
 # random-if(B2G) from bug 983650
 fuzzy(1,65536) random-if(B2G) fuzzy-if(Android,9,65536) random-if(Android&&AndroidVersion<15)  == webgl-color-alpha-test.html?colorVal=1.0&alphaVal=0.5&alpha&premult  wrapper.html?colors-half-alpha.png
 
 
--- a/content/html/content/public/HTMLMediaElement.h
+++ b/content/html/content/public/HTMLMediaElement.h
@@ -14,16 +14,17 @@
 #include "mozilla/CORSMode.h"
 #include "DOMMediaStream.h"
 #include "AudioChannelCommon.h"
 #include "DecoderTraits.h"
 #include "nsIAudioChannelAgent.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/dom/AudioChannelBinding.h"
 #include "mozilla/dom/TextTrackManager.h"
+#include "MediaDecoder.h"
 
 // Define to output information on decoding and painting framerate
 /* #define DEBUG_FRAME_RATE 1 */
 
 class nsIChannel;
 class nsIHttpChannel;
 class nsILoadGroup;
 
@@ -388,16 +389,18 @@ public:
   }
 
   bool Seeking() const;
 
   double CurrentTime() const;
 
   void SetCurrentTime(double aCurrentTime, ErrorResult& aRv);
 
+  void FastSeek(double aTime, ErrorResult& aRv);
+
   double Duration() const;
 
   bool Paused() const
   {
     return mPaused;
   }
 
   double DefaultPlaybackRate() const
@@ -856,16 +859,22 @@ protected:
   }
 
   // Check the permissions for audiochannel.
   bool CheckAudioChannelPermissions(const nsAString& aType);
 
   // This method does the check for muting/fading/unmuting the audio channel.
   nsresult UpdateChannelMuteState(mozilla::dom::AudioChannelState aCanPlay);
 
+  // Seeks to aTime seconds. aSeekType can be Exact to seek to exactly the
+  // seek target, or PrevSyncPoint if a quicker but less precise seek is
+  // desired, and we'll seek to the sync point (keyframe and/or start of the
+  // next block of audio samples) preceeding seek target.
+  void Seek(double aTime, SeekTarget::Type aSeekType, ErrorResult& aRv);
+  
   // Update the audio channel playing state
   virtual void UpdateAudioChannelPlayingState();
 
   // Adds to the element's list of pending text tracks each text track
   // in the element's list of text tracks whose text track mode is not disabled
   // and whose text track readiness state is loading.
   void PopulatePendingTextTrackList();
 
--- a/content/html/content/src/HTMLBodyElement.cpp
+++ b/content/html/content/src/HTMLBodyElement.cpp
@@ -503,16 +503,16 @@ HTMLBodyElement::IsEventAttributeName(ns
     nsCOMPtr<nsISupports> supports = do_QueryInterface(win);                   \
     nsGlobalWindow* globalWin = nsGlobalWindow::FromSupports(supports);        \
     return globalWin->SetOn##name_(handler);                                   \
   }
 #define WINDOW_EVENT(name_, id_, type_, struct_)                               \
   WINDOW_EVENT_HELPER(name_, EventHandlerNonNull)
 #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_)                         \
   WINDOW_EVENT_HELPER(name_, OnBeforeUnloadEventHandlerNonNull)
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef BEFOREUNLOAD_EVENT
 #undef WINDOW_EVENT
 #undef WINDOW_EVENT_HELPER
 #undef EVENT
 
 } // namespace dom
 } // namespace mozilla
--- a/content/html/content/src/HTMLBodyElement.h
+++ b/content/html/content/src/HTMLBodyElement.h
@@ -57,17 +57,17 @@ public:
 #define EVENT(name_, id_, type_, struct_) /* nothing; handled by the shim */
 #define WINDOW_EVENT_HELPER(name_, type_)                               \
   type_* GetOn##name_();                                                \
   void SetOn##name_(type_* handler);
 #define WINDOW_EVENT(name_, id_, type_, struct_)                        \
   WINDOW_EVENT_HELPER(name_, EventHandlerNonNull)
 #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_)                  \
   WINDOW_EVENT_HELPER(name_, OnBeforeUnloadEventHandlerNonNull)
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef BEFOREUNLOAD_EVENT
 #undef WINDOW_EVENT
 #undef WINDOW_EVENT_HELPER
 #undef EVENT
 
   void GetText(nsString& aText)
   {
     GetHTMLAttr(nsGkAtoms::text, aText);
--- a/content/html/content/src/HTMLButtonElement.cpp
+++ b/content/html/content/src/HTMLButtonElement.cpp
@@ -12,23 +12,23 @@
 #include "nsIPresShell.h"
 #include "nsStyleConsts.h"
 #include "nsPresContext.h"
 #include "nsIFormControl.h"
 #include "nsIForm.h"
 #include "nsFormSubmission.h"
 #include "nsFormSubmissionConstants.h"
 #include "nsIURL.h"
-#include "nsEventStateManager.h"
 #include "nsIFrame.h"
 #include "nsIFormControlFrame.h"
 #include "nsIDOMEvent.h"
 #include "nsIDocument.h"
 #include "mozilla/ContentEvents.h"
 #include "mozilla/EventDispatcher.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/TextEvents.h"
 #include "nsUnicharUtils.h"
 #include "nsLayoutUtils.h"
 #include "nsPresState.h"
 #include "nsError.h"
 #include "nsFocusManager.h"
 #include "mozilla/dom/HTMLFormElement.h"
@@ -283,20 +283,20 @@ HTMLButtonElement::PostHandleEvent(Event
         }
         break;// NS_KEY_PRESS
 
       case NS_MOUSE_BUTTON_DOWN:
         {
           WidgetMouseEvent* mouseEvent = aVisitor.mEvent->AsMouseEvent();
           if (mouseEvent->button == WidgetMouseEvent::eLeftButton) {
             if (mouseEvent->mFlags.mIsTrusted) {
-              nsEventStateManager* esm =
+              EventStateManager* esm =
                 aVisitor.mPresContext->EventStateManager();
-              nsEventStateManager::SetActiveManager(
-                static_cast<nsEventStateManager*>(esm), this);
+              EventStateManager::SetActiveManager(
+                static_cast<EventStateManager*>(esm), this);
             }
             nsIFocusManager* fm = nsFocusManager::GetFocusManager();
             if (fm)
               fm->SetFocus(this, nsIFocusManager::FLAG_BYMOUSE |
                                  nsIFocusManager::FLAG_NOSCROLL);
             mouseEvent->mFlags.mMultipleActionsPrevented = true;
           } else if (mouseEvent->button == WidgetMouseEvent::eMiddleButton ||
                      mouseEvent->button == WidgetMouseEvent::eRightButton) {
--- a/content/html/content/src/HTMLFormElement.cpp
+++ b/content/html/content/src/HTMLFormElement.cpp
@@ -3,20 +3,20 @@
  * 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/dom/HTMLFormElement.h"
 
 #include "jsapi.h"
 #include "mozilla/ContentEvents.h"
 #include "mozilla/EventDispatcher.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/dom/HTMLFormControlsCollection.h"
 #include "mozilla/dom/HTMLFormElementBinding.h"
 #include "nsIHTMLDocument.h"
-#include "nsEventStateManager.h"
 #include "nsEventStates.h"
 #include "nsGkAtoms.h"
 #include "nsStyleConsts.h"
 #include "nsPresContext.h"
 #include "nsIDocument.h"
 #include "nsIFormControlFrame.h"
 #include "nsISecureBrowserUI.h"
 #include "nsError.h"
@@ -653,17 +653,17 @@ HTMLFormElement::DoSubmit(WidgetEvent* a
   nsPIDOMWindow *window = OwnerDoc()->GetWindow();
 
   if (window) {
     mSubmitPopupState = window->GetPopupControlState();
   } else {
     mSubmitPopupState = openAbused;
   }
 
-  mSubmitInitiatedFromUserInput = nsEventStateManager::IsHandlingUserInput();
+  mSubmitInitiatedFromUserInput = EventStateManager::IsHandlingUserInput();
 
   if(mDeferSubmission) { 
     // we are in an event handler, JS submitted so we have to
     // defer this submission. let's remember it and return
     // without submitting
     mPendingSubmission = submission;
     // ensure reentrancy
     mIsSubmitting = false;
--- a/content/html/content/src/HTMLFrameSetElement.cpp
+++ b/content/html/content/src/HTMLFrameSetElement.cpp
@@ -368,16 +368,16 @@ HTMLFrameSetElement::IsEventAttributeNam
     nsCOMPtr<nsISupports> supports = do_QueryInterface(win);                   \
     nsGlobalWindow* globalWin = nsGlobalWindow::FromSupports(supports);        \
     return globalWin->SetOn##name_(handler);                                   \
   }
 #define WINDOW_EVENT(name_, id_, type_, struct_)                               \
   WINDOW_EVENT_HELPER(name_, EventHandlerNonNull)
 #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_)                         \
   WINDOW_EVENT_HELPER(name_, OnBeforeUnloadEventHandlerNonNull)
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef BEFOREUNLOAD_EVENT
 #undef WINDOW_EVENT
 #undef WINDOW_EVENT_HELPER
 #undef EVENT
 
 } // namespace dom
 } // namespace mozilla
--- a/content/html/content/src/HTMLFrameSetElement.h
+++ b/content/html/content/src/HTMLFrameSetElement.h
@@ -88,17 +88,17 @@ public:
 #define EVENT(name_, id_, type_, struct_) /* nothing; handled by the superclass */
 #define WINDOW_EVENT_HELPER(name_, type_)                               \
   type_* GetOn##name_();                                                \
   void SetOn##name_(type_* handler);
 #define WINDOW_EVENT(name_, id_, type_, struct_)                        \
   WINDOW_EVENT_HELPER(name_, EventHandlerNonNull)
 #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_)                  \
   WINDOW_EVENT_HELPER(name_, OnBeforeUnloadEventHandlerNonNull)
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef BEFOREUNLOAD_EVENT
 #undef WINDOW_EVENT
 #undef WINDOW_EVENT_HELPER
 #undef EVENT
 
   // These override the SetAttr methods in nsGenericHTMLElement (need
   // both here to silence compiler warnings).
   nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
--- a/content/html/content/src/HTMLMediaElement.cpp
+++ b/content/html/content/src/HTMLMediaElement.cpp
@@ -755,19 +755,23 @@ NS_IMETHODIMP HTMLMediaElement::Load()
   mIsRunningLoadMethod = false;
 
   return NS_OK;
 }
 
 void HTMLMediaElement::ResetState()
 {
   mMediaSize = nsIntSize(-1, -1);
-  VideoFrameContainer* container = GetVideoFrameContainer();
-  if (container) {
-    container->Reset();
+  // There might be a pending MediaDecoder::PlaybackPositionChanged() which
+  // will overwrite |mMediaSize| in UpdateMediaSize() to give staled videoWidth
+  // and videoHeight. We have to call ForgetElement() here such that the staled
+  // callbacks won't reach us.
+  if (mVideoFrameContainer) {
+    mVideoFrameContainer->ForgetElement();
+    mVideoFrameContainer = nullptr;
   }
 }
 
 static bool HasSourceChildren(nsIContent* aElement)
 {
   for (nsIContent* child = aElement->GetFirstChild();
        child;
        child = child->GetNextSibling()) {
@@ -1319,19 +1323,72 @@ HTMLMediaElement::CurrentTime() const
 
 NS_IMETHODIMP HTMLMediaElement::GetCurrentTime(double* aCurrentTime)
 {
   *aCurrentTime = CurrentTime();
   return NS_OK;
 }
 
 void
+HTMLMediaElement::FastSeek(double aTime, ErrorResult& aRv)
+{
+  Seek(aTime, SeekTarget::PrevSyncPoint, aRv);
+}
+
+void
 HTMLMediaElement::SetCurrentTime(double aCurrentTime, ErrorResult& aRv)
 {
-  MOZ_ASSERT(aCurrentTime == aCurrentTime);
+  Seek(aCurrentTime, SeekTarget::Accurate, aRv);
+}
+
+/**
+ * Check if aValue is inside a range of aRanges, and if so sets aIsInRanges
+ * to true and put the range index in aIntervalIndex. If aValue is not
+ * inside a range, aIsInRanges is set to false, and aIntervalIndex
+ * is set to the index of the range which ends immediately before aValue
+ * (and can be -1 if aValue is before aRanges.Start(0)). Returns NS_OK
+ * on success, and NS_ERROR_FAILURE on failure.
+ */
+static nsresult
+IsInRanges(dom::TimeRanges& aRanges,
+           double aValue,
+           bool& aIsInRanges,
+           int32_t& aIntervalIndex)
+{
+  aIsInRanges = false;
+  uint32_t length;
+  nsresult rv = aRanges.GetLength(&length);
+  NS_ENSURE_SUCCESS(rv, rv);
+  for (uint32_t i = 0; i < length; i++) {
+    double start, end;
+    rv = aRanges.Start(i, &start);
+    NS_ENSURE_SUCCESS(rv, rv);
+    if (start > aValue) {
+      aIntervalIndex = i - 1;
+      return NS_OK;
+    }
+    rv = aRanges.End(i, &end);
+    NS_ENSURE_SUCCESS(rv, rv);
+    if (aValue <= end) {
+      aIntervalIndex = i;
+      aIsInRanges = true;
+      return NS_OK;
+    }
+  }
+  aIntervalIndex = length - 1;
+  return NS_OK;
+}
+
+void
+HTMLMediaElement::Seek(double aTime,
+                       SeekTarget::Type aSeekType,
+                       ErrorResult& aRv)
+{
+  // aTime should be non-NaN.
+  MOZ_ASSERT(aTime == aTime);
 
   StopSuspendingAfterFirstFrame();
 
   if (mSrcStream) {
     // do nothing since streams aren't seekable; we effectively clamp to
     // the current time.
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return;
@@ -1345,44 +1402,108 @@ HTMLMediaElement::SetCurrentTime(double 
 
   if (mCurrentPlayRangeStart != -1.0) {
     double rangeEndTime = CurrentTime();
     LOG(PR_LOG_DEBUG, ("%p Adding \'played\' a range : [%f, %f]", this, mCurrentPlayRangeStart, rangeEndTime));
     // Multiple seek without playing, or seek while playing.
     if (mCurrentPlayRangeStart != rangeEndTime) {
       mPlayed->Add(mCurrentPlayRangeStart, rangeEndTime);
     }
+    // Reset the current played range start time. We'll re-set it once
+    // the seek completes.
+    mCurrentPlayRangeStart = -1.0;
   }
 
   if (!mDecoder) {
-    LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) failed: no decoder", this, aCurrentTime));
+    LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) failed: no decoder", this, aTime));
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return;
   }
 
   if (mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING) {
-    LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) failed: no source", this, aCurrentTime));
+    LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) failed: no source", this, aTime));
+    aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+    return;
+  }
+
+  // Clamp the seek target to inside the seekable ranges.
+  dom::TimeRanges seekable;
+  if (NS_FAILED(mDecoder->GetSeekable(&seekable))) {
+    aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+    return;
+  }
+  uint32_t length = 0;
+  seekable.GetLength(&length);
+  if (!length) {
+    return;
+  }
+
+  // If the position we want to seek to is not in a seekable range, we seek
+  // to the closest position in the seekable ranges instead. If two positions
+  // are equally close, we seek to the closest position from the currentTime.
+  // See seeking spec, point 7 :
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#seeking
+  int32_t range = 0;
+  bool isInRange = false;
+  if (NS_FAILED(IsInRanges(seekable, aTime, isInRange, range))) {
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return;
   }
-
-  // Clamp the time to [0, duration] as required by the spec.
-  double clampedTime = std::max(0.0, aCurrentTime);
-  double duration = mDecoder->GetDuration();
-  if (duration >= 0) {
-    clampedTime = std::min(clampedTime, duration);
+  if (!isInRange) {
+    if (range != -1) {
+      // |range + 1| can't be negative, because the only possible negative value
+      // for |range| is -1.
+      if (uint32_t(range + 1) < length) {
+        double leftBound, rightBound;
+        if (NS_FAILED(seekable.End(range, &leftBound))) {
+          aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+          return;
+        }
+        if (NS_FAILED(seekable.Start(range + 1, &rightBound))) {
+          aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+          return;
+        }
+        double distanceLeft = Abs(leftBound - aTime);
+        double distanceRight = Abs(rightBound - aTime);
+        if (distanceLeft == distanceRight) {
+          double currentTime = CurrentTime();
+          distanceLeft = Abs(leftBound - currentTime);
+          distanceRight = Abs(rightBound - currentTime);
+        }
+        aTime = (distanceLeft < distanceRight) ? leftBound : rightBound;
+      } else {
+        // Seek target is after the end last range in seekable data.
+        // Clamp the seek target to the end of the last seekable range.
+        if (NS_FAILED(seekable.End(length - 1, &aTime))) {
+          aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+          return;
+        }
+      }
+    } else {
+      // aTime is before the first range in |seekable|, the closest point we can
+      // seek to is the start of the first range.
+      seekable.Start(0, &aTime);
+    }
   }
 
+  // TODO: The spec requires us to update the current time to reflect the
+  //       actual seek target before beginning the synchronous section, but
+  //       that requires changing all MediaDecoderReaders to support telling
+  //       us the fastSeek target, and it's currently not possible to get
+  //       this information as we don't yet control the demuxer for all
+  //       MediaDecoderReaders.
+
   mPlayingBeforeSeek = IsPotentiallyPlaying();
   // The media backend is responsible for dispatching the timeupdate
   // event if it changes the playback position as a result of the seek.
-  LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) starting seek", this, aCurrentTime));
-  aRv = mDecoder->Seek(clampedTime);
-  // Start a new range at position we seeked to.
-  mCurrentPlayRangeStart = mDecoder->GetCurrentTime();
+  LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) starting seek", this, aTime));
+  nsresult rv = mDecoder->Seek(aTime, aSeekType);
+  if (NS_FAILED(rv)) {
+    aRv.Throw(rv);
+  }
 
   // We changed whether we're seeking so we need to AddRemoveSelfReference.
   AddRemoveSelfReference();
 }
 
 NS_IMETHODIMP HTMLMediaElement::SetCurrentTime(double aCurrentTime)
 {
   // Detect for a NaN and invalid values.
@@ -2625,24 +2746,29 @@ nsresult HTMLMediaElement::FinishDecoder
   // The new stream has not been suspended by us.
   mPausedForInactiveDocumentOrChannel = false;
   mEventDeliveryPaused = false;
   mPendingEvents.Clear();
   // Set mDecoder now so if methods like GetCurrentSrc get called between
   // here and Load(), they work.
   mDecoder = aDecoder;
 
-  // Tell aDecoder about its MediaResource now so things like principals are
+  // Tell the decoder about its MediaResource now so things like principals are
   // available immediately.
-  aDecoder->SetResource(aStream);
-  aDecoder->SetAudioChannelType(mAudioChannelType);
-  aDecoder->SetAudioCaptured(mAudioCaptured);
-  aDecoder->SetVolume(mMuted ? 0.0 : mVolume);
-  aDecoder->SetPreservesPitch(mPreservesPitch);
-  aDecoder->SetPlaybackRate(mPlaybackRate);
+  mDecoder->SetResource(aStream);
+  mDecoder->SetAudioChannelType(mAudioChannelType);
+  mDecoder->SetAudioCaptured(mAudioCaptured);
+  mDecoder->SetVolume(mMuted ? 0.0 : mVolume);
+  mDecoder->SetPreservesPitch(mPreservesPitch);
+  mDecoder->SetPlaybackRate(mPlaybackRate);
+
+  if (mPreloadAction == HTMLMediaElement::PRELOAD_METADATA) {
+    mDecoder->SetMinimizePrerollUntilPlaybackStarts();
+  }
+
   // Update decoder principal before we start decoding, since it
   // can affect how we feed data to MediaStreams
   NotifyDecoderPrincipalChanged();
 
   for (uint32_t i = 0; i < mOutputStreams.Length(); ++i) {
     OutputMediaStream* ms = &mOutputStreams[i];
     aDecoder->AddOutputStream(ms->mStream->GetStream()->AsProcessedStream(),
         ms->mFinishWhenEnded);
@@ -2885,17 +3011,20 @@ void HTMLMediaElement::MetadataLoaded(in
   if (mDecoder && mDecoder->IsTransportSeekable() && mDecoder->IsMediaSeekable()) {
     ProcessMediaFragmentURI();
     mDecoder->SetFragmentEndTime(mFragmentEnd);
   }
 
   // If this element had a video track, but consists only of an audio track now,
   // delete the VideoFrameContainer. This happens when the src is changed to an
   // audio only file.
-  if (!aHasVideo) {
+  if (!aHasVideo && mVideoFrameContainer) {
+    // call ForgetElement() such that callbacks from |mVideoFrameContainer|
+    // won't reach us anymore.
+    mVideoFrameContainer->ForgetElement();
     mVideoFrameContainer = nullptr;
   }
 }
 
 void HTMLMediaElement::FirstFrameLoaded(bool aResourceFullyLoaded)
 {
   ChangeReadyState(aResourceFullyLoaded ?
     nsIDOMHTMLMediaElement::HAVE_ENOUGH_DATA :
@@ -3043,16 +3172,19 @@ void HTMLMediaElement::SeekCompleted()
   mPlayingBeforeSeek = false;
   SetPlayedOrSeeked(true);
   DispatchAsyncEvent(NS_LITERAL_STRING("seeked"));
   // We changed whether we're seeking so we need to AddRemoveSelfReference
   AddRemoveSelfReference();
   if (mTextTrackManager) {
     mTextTrackManager->DidSeek();
   }
+  if (mCurrentPlayRangeStart == -1.0) {
+    mCurrentPlayRangeStart = CurrentTime();
+  }
 }
 
 void HTMLMediaElement::NotifySuspendedByCache(bool aIsSuspended)
 {
   mDownloadSuspendedByCache = aIsSuspended;
   // If this is an autoplay element, we may need to kick off its autoplaying
   // now so we consume data and hopefully free up cache space.
   CheckAutoplayDataReady();
--- a/content/html/content/src/HTMLMeterElement.h
+++ b/content/html/content/src/HTMLMeterElement.h
@@ -5,17 +5,16 @@
 
 #ifndef mozilla_dom_HTMLMeterElement_h
 #define mozilla_dom_HTMLMeterElement_h
 
 #include "mozilla/Attributes.h"
 #include "nsGenericHTMLElement.h"
 #include "nsAttrValue.h"
 #include "nsAttrValueInlines.h"
-#include "nsEventStateManager.h"
 #include "nsAlgorithm.h"
 #include <algorithm>
 
 namespace mozilla {
 namespace dom {
 
 class HTMLMeterElement MOZ_FINAL : public nsGenericHTMLElement
 {
--- a/content/html/content/src/HTMLProgressElement.h
+++ b/content/html/content/src/HTMLProgressElement.h
@@ -5,17 +5,16 @@
 
 #ifndef mozilla_dom_HTMLProgressElement_h
 #define mozilla_dom_HTMLProgressElement_h
 
 #include "mozilla/Attributes.h"
 #include "nsGenericHTMLElement.h"
 #include "nsAttrValue.h"
 #include "nsAttrValueInlines.h"
-#include "nsEventStateManager.h"
 #include <algorithm>
 
 namespace mozilla {
 namespace dom {
 
 class HTMLProgressElement MOZ_FINAL : public nsGenericHTMLElement
 {
 public:
--- a/content/html/content/src/TextTrackManager.cpp
+++ b/content/html/content/src/TextTrackManager.cpp
@@ -68,17 +68,17 @@ CompareTextTracks::LessThan(TextTrack* a
       return true;
     case MediaResourceSpecific:
       // No rules for Media Resource Specific tracks yet.
       break;
   }
   return true;
 }
 
-NS_IMPL_CYCLE_COLLECTION_3(TextTrackManager, mTextTracks,
+NS_IMPL_CYCLE_COLLECTION_4(TextTrackManager, mMediaElement, mTextTracks,
                            mPendingTextTracks, mNewCues)
 NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(TextTrackManager, AddRef)
 NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(TextTrackManager, Release)
 
 StaticRefPtr<nsIWebVTTParserWrapper> TextTrackManager::sParserWrapper;
 
 TextTrackManager::TextTrackManager(HTMLMediaElement *aMediaElement)
   : mMediaElement(aMediaElement)
--- a/content/html/content/src/TextTrackManager.h
+++ b/content/html/content/src/TextTrackManager.h
@@ -84,20 +84,17 @@ public:
    * Converts the TextTrackCue's cuetext into a tree of DOM objects and attaches
    * it to a div on it's owning TrackElement's MediaElement's caption overlay.
    */
   void UpdateCueDisplay();
 
   void PopulatePendingList();
 
   // The HTMLMediaElement that this TextTrackManager manages the TextTracks of.
-  // This is a weak reference as the life time of TextTrackManager is dependent
-  // on the HTMLMediaElement, so it should not be trying to hold the
-  // HTMLMediaElement alive.
-  HTMLMediaElement* mMediaElement;
+  nsRefPtr<HTMLMediaElement> mMediaElement;
 private:
   // List of the TextTrackManager's owning HTMLMediaElement's TextTracks.
   nsRefPtr<TextTrackList> mTextTracks;
   // List of text track objects awaiting loading.
   nsRefPtr<TextTrackList> mPendingTextTracks;
   // List of newly introduced Text Track cues.
   nsRefPtr<TextTrackCueList> mNewCues;
 
--- a/content/html/content/src/nsGenericHTMLElement.cpp
+++ b/content/html/content/src/nsGenericHTMLElement.cpp
@@ -2,16 +2,17 @@
 /* vim:set tw=80 expandtab softtabstop=2 ts=2 sw=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/. */
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/EventDispatcher.h"
 #include "mozilla/EventListenerManager.h"
+#include "mozilla/EventStateManager.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/Likely.h"
 
 #include "nscore.h"
 #include "nsGenericHTMLElement.h"
 #include "nsAttrValueInlines.h"
 #include "nsCOMPtr.h"
 #include "nsIAtom.h"
@@ -55,17 +56,16 @@
 #include "nsILayoutHistoryState.h"
 
 #include "nsHTMLParts.h"
 #include "nsContentUtils.h"
 #include "mozilla/dom/DirectionalityUtils.h"
 #include "nsString.h"
 #include "nsUnicharUtils.h"
 #include "nsGkAtoms.h"
-#include "nsEventStateManager.h"
 #include "nsIDOMEvent.h"
 #include "nsDOMCSSDeclaration.h"
 #include "nsITextControlFrame.h"
 #include "nsIForm.h"
 #include "nsIFormControl.h"
 #include "nsIDOMHTMLFormElement.h"
 #include "mozilla/dom/HTMLFormElement.h"
 #include "nsFocusManager.h"
@@ -761,17 +761,17 @@ nsGenericHTMLElement::GetEventListenerMa
   if ((mNodeInfo->Equals(nsGkAtoms::body) ||
        mNodeInfo->Equals(nsGkAtoms::frameset)) &&
       // We only forward some event attributes from body/frameset to window
       (0
 #define EVENT(name_, id_, type_, struct_) /* nothing */
 #define FORWARDED_EVENT(name_, id_, type_, struct_) \
        || nsGkAtoms::on##name_ == aAttrName
 #define WINDOW_EVENT FORWARDED_EVENT
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef WINDOW_EVENT
 #undef FORWARDED_EVENT
 #undef EVENT
        )
       ) {
     nsPIDOMWindow *win;
 
     // If we have a document, and it has a window, add the event
@@ -867,17 +867,17 @@ nsGenericHTMLElement::SetOn##name_(Event
     if (handler) {                                                            \
       errorHandler = new OnErrorEventHandlerNonNull(handler);                 \
     }                                                                         \
     return globalWin->SetOn##name_(errorHandler);                             \
   }                                                                           \
                                                                               \
   return nsINode::SetOn##name_(handler);                                      \
 }
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef ERROR_EVENT
 #undef FORWARDED_EVENT
 #undef EVENT
 
 nsresult
 nsGenericHTMLElement::SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                               nsIAtom* aPrefix, const nsAString& aValue,
                               bool aNotify)
@@ -2706,17 +2706,17 @@ nsGenericHTMLElement::RegUnRegAccessKey(
   if (accessKey.IsEmpty()) {
     return;
   }
 
   // We have an access key, so get the ESM from the pres context.
   nsPresContext *presContext = GetPresContext();
 
   if (presContext) {
-    nsEventStateManager *esm = presContext->EventStateManager();
+    EventStateManager* esm = presContext->EventStateManager();
 
     // Register or unregister as appropriate.
     if (aDoReg) {
       esm->RegisterAccessKey(this, (uint32_t)accessKey.First());
     } else {
       esm->UnregisterAccessKey(this, (uint32_t)accessKey.First());
     }
   }
--- a/content/html/content/src/nsGenericHTMLElement.h
+++ b/content/html/content/src/nsGenericHTMLElement.h
@@ -245,17 +245,17 @@ public:
   using nsINode::SetOn##name_;                                                \
   mozilla::dom::EventHandlerNonNull* GetOn##name_();                          \
   void SetOn##name_(mozilla::dom::EventHandlerNonNull* handler);
 #define ERROR_EVENT(name_, id_, type_, struct_)                               \
   using nsINode::GetOn##name_;                                                \
   using nsINode::SetOn##name_;                                                \
   already_AddRefed<mozilla::dom::EventHandlerNonNull> GetOn##name_();         \
   void SetOn##name_(mozilla::dom::EventHandlerNonNull* handler);
-#include "nsEventNameList.h" // IWYU pragma: keep
+#include "mozilla/EventNameList.h" // IWYU pragma: keep
 #undef ERROR_EVENT
 #undef FORWARDED_EVENT
 #undef EVENT
   void GetClassName(mozilla::dom::DOMString& aClassName)
   {
     GetAttr(kNameSpaceID_None, nsGkAtoms::_class, aClassName);
   }
   void SetClassName(const nsAString& aClassName)
--- a/content/html/content/test/mochitest.ini
+++ b/content/html/content/test/mochitest.ini
@@ -422,35 +422,33 @@ skip-if = buildapp == 'b2g' || toolkit =
 skip-if = toolkit == 'android'
 [test_formelements.html]
 [test_fullscreen-api.html]
 skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(time out, some kind of focus issue) b2g-debug(time out, some kind of focus issue) b2g-desktop(time out, some kind of focus issue)
 [test_hidden.html]
 [test_html_attributes_reflection.html]
 [test_htmlcollection.html]
 [test_iframe_sandbox_general.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || e10s #Bug 931116, b2g desktop specific, initial triage
+skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
 [test_iframe_sandbox_inheritance.html]
-skip-if = buildapp == 'b2g' || e10s # b2g(Crash, bug 904659) b2g-debug(Crash, bug 904659) b2g-desktop(Crash, bug 904659)
+skip-if = buildapp == 'b2g' # b2g(Crash, bug 904659) b2g-debug(Crash, bug 904659) b2g-desktop(Crash, bug 904659)
 [test_iframe_sandbox_modal.html]
 skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #modal tests fail on android # b2g(modal tests fail on B2G) b2g-debug(modal tests fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
 [test_iframe_sandbox_navigation.html]
-skip-if = buildapp == 'b2g' || e10s # b2g(Crash, bug 904659) b2g-debug(Crash, bug 904659) b2g-desktop(Crash, bug 904659)
+skip-if = buildapp == 'b2g' # b2g(Crash, bug 904659) b2g-debug(Crash, bug 904659) b2g-desktop(Crash, bug 904659)
 [test_iframe_sandbox_navigation2.html]
 skip-if = buildapp == 'b2g' || e10s # b2g(Crash, bug 904659) b2g-debug(Crash, bug 904659) b2g-desktop(Crash, bug 904659)
 [test_iframe_sandbox_plugins.html]
 skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(plugins not supported) b2g-debug(plugins not supported) b2g-desktop(plugins not supported)
 [test_iframe_sandbox_popups.html]
-skip-if = buildapp == 'b2g' || e10s # b2g(multiple concurrent window.open()s fail on B2G) b2g-debug(multiple concurrent window.open()s fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
+skip-if = buildapp == 'b2g' # b2g(multiple concurrent window.open()s fail on B2G) b2g-debug(multiple concurrent window.open()s fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
 [test_iframe_sandbox_popups_inheritance.html]
 skip-if = buildapp == 'b2g' || e10s # b2g(multiple concurrent window.open()s fail on B2G) b2g-debug(multiple concurrent window.open()s fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
 [test_iframe_sandbox_same_origin.html]
-skip-if = e10s
 [test_iframe_sandbox_workers.html]
-skip-if = e10s
 [test_img_attributes_reflection.html]
 [test_imageSrcSet.html]
 [test_li_attributes_reflection.html]
 [test_link_attributes_reflection.html]
 [test_map_attributes_reflection.html]
 [test_meta_attributes_reflection.html]
 [test_mod_attributes_reflection.html]
 [test_mozaudiochannel.html]
--- a/content/media/AudioNodeExternalInputStream.cpp
+++ b/content/media/AudioNodeExternalInputStream.cpp
@@ -53,17 +53,18 @@ AudioNodeExternalInputStream::GetTrackMa
   if (ci.IsEnded()) {
     // The track is entirely silence so far, we can ignore it for now.
     return nsTArray<TrackMapEntry>::NoIndex;
   }
 
   // Create a speex resampler with the same sample rate and number of channels
   // as the track.
   SpeexResamplerState* resampler = nullptr;
-  uint32_t channelCount = (*ci).mChannelData.Length();
+  uint32_t channelCount = std::min((*ci).mChannelData.Length(),
+                                   WebAudioUtils::MaxChannelCount);
   if (aTrack.GetRate() != mSampleRate) {
     resampler = speex_resampler_init(channelCount,
       aTrack.GetRate(), mSampleRate, SPEEX_RESAMPLER_QUALITY_DEFAULT, nullptr);
     speex_resampler_skip_zeros(resampler);
   }
 
   TrackMapEntry* map = mTrackMap.AppendElement();
   map->mEndOfConsumedInputTicks = 0;
@@ -407,17 +408,17 @@ AudioNodeExternalInputStream::ProcessInp
           inputStartTicks = 0;
         }
         if (inputEndTicks > inputStartTicks) {
           segment.AppendSlice(*inputTrack.GetSegment(),
                               std::min(inputTrackEndPoint, inputStartTicks),
                               std::min(inputTrackEndPoint, inputEndTicks));
         }
         // Pad if we're looking past the end of the track
-        segment.AppendNullData(std::max<TrackTicks>(0, inputEndTicks - inputTrackEndPoint));
+        segment.AppendNullData(ticks - segment.GetDuration());
       }
     }
 
     trackMap->mSamplesPassedToResampler += segment.GetDuration();
     trackMap->ResampleInputData(&segment);
 
     if (trackMap->mResampledData.GetDuration() < mCurrentOutputPosition + WEBAUDIO_BLOCK_SIZE) {
       // We don't have enough data. Delay it.
@@ -431,29 +432,32 @@ AudioNodeExternalInputStream::ProcessInp
   }
 
   for (int32_t i = mTrackMap.Length() - 1; i >= 0; --i) {
     if (i >= int32_t(trackMapEntriesUsed.Length()) || !trackMapEntriesUsed[i]) {
       mTrackMap.RemoveElementAt(i);
     }
   }
 
-  uint32_t outputChannels = ComputeFinalOuputChannelCount(inputChannels);
-
-  if (outputChannels) {
-    AllocateAudioBlock(outputChannels, &mLastChunks[0]);
+  uint32_t accumulateIndex = 0;
+  if (inputChannels) {
     nsAutoTArray<float,GUESS_AUDIO_CHANNELS*WEBAUDIO_BLOCK_SIZE> downmixBuffer;
     for (uint32_t i = 0; i < audioSegments.Length(); ++i) {
       AudioChunk tmpChunk;
       ConvertSegmentToAudioBlock(&audioSegments[i], &tmpChunk);
       if (!tmpChunk.IsNull()) {
-        AccumulateInputChunk(i, tmpChunk, &mLastChunks[0], &downmixBuffer);
+        if (accumulateIndex == 0) {
+          AllocateAudioBlock(inputChannels, &mLastChunks[0]);
+        }
+        AccumulateInputChunk(accumulateIndex, tmpChunk, &mLastChunks[0], &downmixBuffer);
+        accumulateIndex++;
       }
     }
-  } else {
+  }
+  if (accumulateIndex == 0) {
     mLastChunks[0].SetNull(WEBAUDIO_BLOCK_SIZE);
   }
   mCurrentOutputPosition += WEBAUDIO_BLOCK_SIZE;
 
   // Using AudioNodeStream's AdvanceOutputSegment to push the media stream graph along with null data.
   AdvanceOutputSegment();
 }
 
--- a/content/media/AudioNodeStream.cpp
+++ b/content/media/AudioNodeStream.cpp
@@ -234,17 +234,17 @@ AudioNodeStream::SetChannelMixingParamet
   MOZ_ASSERT(int(aChannelInterpretation) < INT16_MAX);
 
   mNumberOfInputChannels = aNumberOfChannels;
   mChannelCountMode = aChannelCountMode;
   mChannelInterpretation = aChannelInterpretation;
 }
 
 uint32_t
-AudioNodeStream::ComputeFinalOuputChannelCount(uint32_t aInputChannelCount)
+AudioNodeStream::ComputedNumberOfChannels(uint32_t aInputChannelCount)
 {
   switch (mChannelCountMode) {
   case ChannelCountMode::Explicit:
     // Disregard the channel count we've calculated from inputs, and just use
     // mNumberOfInputChannels.
     return mNumberOfInputChannels;
   case ChannelCountMode::Clamped_max:
     // Clamp the computed output channel count to mNumberOfInputChannels.
@@ -293,17 +293,17 @@ AudioNodeStream::ObtainInputBlock(AudioC
       continue;
     }
 
     inputChunks.AppendElement(chunk);
     outputChannelCount =
       GetAudioChannelsSuperset(outputChannelCount, chunk->mChannelData.Length());
   }
 
-  outputChannelCount = ComputeFinalOuputChannelCount(outputChannelCount);
+  outputChannelCount = ComputedNumberOfChannels(outputChannelCount);
 
   uint32_t inputChunkCount = inputChunks.Length();
   if (inputChunkCount == 0 ||
       (inputChunkCount == 1 && inputChunks[0]->mChannelData.Length() == 0)) {
     aTmpChunk.SetNull(WEBAUDIO_BLOCK_SIZE);
     return;
   }
 
--- a/content/media/AudioNodeStream.h
+++ b/content/media/AudioNodeStream.h
@@ -160,17 +160,17 @@ protected:
   void FinishOutput();
   void AccumulateInputChunk(uint32_t aInputIndex, const AudioChunk& aChunk,
                             AudioChunk* aBlock,
                             nsTArray<float>* aDownmixBuffer);
   void UpMixDownMixChunk(const AudioChunk* aChunk, uint32_t aOutputChannelCount,
                          nsTArray<const void*>& aOutputChannels,
                          nsTArray<float>& aDownmixBuffer);
 
-  uint32_t ComputeFinalOuputChannelCount(uint32_t aInputChannelCount);
+  uint32_t ComputedNumberOfChannels(uint32_t aInputChannelCount);
   void ObtainInputBlock(AudioChunk& aTmpChunk, uint32_t aPortIndex);
 
   // The engine that will generate output for this node.
   nsAutoPtr<AudioNodeEngine> mEngine;
   // The last block produced by this node.
   OutputChunks mLastChunks;
   // The stream's sampling rate
   const TrackRate mSampleRate;
--- a/content/media/MediaData.cpp
+++ b/content/media/MediaData.cpp
@@ -129,16 +129,31 @@ VideoData* VideoData::ShallowCopyUpdateD
                                aOther->mKeyframe,
                                aOther->mTimecode,
                                aOther->mDisplay);
   v->mImage = aOther->mImage;
   return v;
 }
 
 /* static */
+VideoData* VideoData::ShallowCopyUpdateTimestamp(VideoData* aOther,
+                                                 int64_t aTimestamp)
+{
+  NS_ENSURE_TRUE(aOther, nullptr);
+  VideoData* v = new VideoData(aOther->mOffset,
+                               aTimestamp,
+                               aOther->GetEndTime() - aTimestamp,
+                               aOther->mKeyframe,
+                               aOther->mTimecode,
+                               aOther->mDisplay);
+  v->mImage = aOther->mImage;
+  return v;
+}
+
+/* static */
 void VideoData::SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
                                     VideoInfo& aInfo,
                                     const YCbCrBuffer &aBuffer,
                                     const IntRect& aPicture,
                                     bool aCopyData)
 {
   if (!aVideoImage) {
     return;
--- a/content/media/MediaData.h
+++ b/content/media/MediaData.h
@@ -199,16 +199,22 @@ public:
   // VideoData. The new VideoData's mImage field holds a reference to
   // aOther's mImage, i.e. the Image is not copied. This function is useful
   // in reader backends that can't determine the duration of a VideoData
   // until the next frame is decoded, i.e. it's a way to change the const
   // duration field on a VideoData.
   static VideoData* ShallowCopyUpdateDuration(VideoData* aOther,
                                               int64_t aDuration);
 
+  // Creates a new VideoData identical to aOther, but with a different
+  // specified timestamp. All data from aOther is copied into the new
+  // VideoData, as ShallowCopyUpdateDuration() does.
+  static VideoData* ShallowCopyUpdateTimestamp(VideoData* aOther,
+                                               int64_t aTimestamp);
+
   // Initialize PlanarYCbCrImage. Only When aCopyData is true,
   // video data is copied to PlanarYCbCrImage.
   static void SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
                                   VideoInfo& aInfo,                  
                                   const YCbCrBuffer &aBuffer,
                                   const IntRect& aPicture,
                                   bool aCopyData);
 
--- a/content/media/MediaDecoder.cpp
+++ b/content/media/MediaDecoder.cpp
@@ -119,17 +119,17 @@ void MediaDecoder::SetDormantIfNecessary
   }
 
   if(aDormant) {
     // enter dormant state
     StopProgress();
     DestroyDecodedStream();
     mDecoderStateMachine->SetDormant(true);
 
-    mRequestedSeekTime = mCurrentTime;
+    mRequestedSeekTarget = SeekTarget(mCurrentTime, SeekTarget::Accurate);
     if (mPlayState == PLAY_STATE_PLAYING){
       mNextState = PLAY_STATE_PLAYING;
     } else {
       mNextState = PLAY_STATE_PAUSED;
     }
     mNextState = mPlayState;
     mIsDormant = true;
     mIsExitingDormant = false;
@@ -415,26 +415,26 @@ MediaDecoder::MediaDecoder() :
   mTransportSeekable(true),
   mMediaSeekable(true),
   mSameOriginMedia(false),
   mReentrantMonitor("media.decoder"),
   mIsDormant(false),
   mIsExitingDormant(false),
   mPlayState(PLAY_STATE_PAUSED),
   mNextState(PLAY_STATE_PAUSED),
-  mRequestedSeekTime(-1.0),
   mCalledResourceLoaded(false),
   mIgnoreProgressData(false),
   mInfiniteStream(false),
   mOwner(nullptr),
   mFrameBufferLength(0),
   mPinnedForSeek(false),
   mShuttingDown(false),
   mPausedForPlaybackRateNull(false),
-  mAudioChannelType(AUDIO_CHANNEL_NORMAL)
+  mAudioChannelType(AUDIO_CHANNEL_NORMAL),
+  mMinimizePreroll(false)
 {
   MOZ_COUNT_CTOR(MediaDecoder);
   MOZ_ASSERT(NS_IsMainThread());
   MediaMemoryTracker::AddMediaDecoder(this);
 #ifdef PR_LOGGING
   if (!gMediaDecoderLog) {
     gMediaDecoderLog = PR_NewLogModule("MediaDecoder");
   }
@@ -547,28 +547,36 @@ nsresult MediaDecoder::InitializeStateMa
     ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
     mDecoderStateMachine->SetTransportSeekable(mTransportSeekable);
     mDecoderStateMachine->SetMediaSeekable(mMediaSeekable);
     mDecoderStateMachine->SetDuration(mDuration);
     mDecoderStateMachine->SetVolume(mInitialVolume);
     mDecoderStateMachine->SetAudioCaptured(mInitialAudioCaptured);
     SetPlaybackRate(mInitialPlaybackRate);
     mDecoderStateMachine->SetPreservesPitch(mInitialPreservesPitch);
-
+    if (mMinimizePreroll) {
+      mDecoderStateMachine->SetMinimizePrerollUntilPlaybackStarts();
+    }
     if (mFrameBufferLength > 0) {
       // The valid mFrameBufferLength value was specified earlier
       mDecoderStateMachine->SetFrameBufferLength(mFrameBufferLength);
     }
   }
 
   ChangeState(PLAY_STATE_LOADING);
 
   return ScheduleStateMachineThread();
 }
 
+void MediaDecoder::SetMinimizePrerollUntilPlaybackStarts()
+{
+  MOZ_ASSERT(NS_IsMainThread());
+  mMinimizePreroll = true;
+}
+
 nsresult MediaDecoder::RequestFrameBufferLength(uint32_t aLength)
 {
   if (aLength < FRAMEBUFFER_LENGTH_MIN || aLength > FRAMEBUFFER_LENGTH_MAX) {
     return NS_ERROR_DOM_INDEX_SIZE_ERR;
   }
   mFrameBufferLength = aLength;
 
   ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
@@ -600,124 +608,59 @@ nsresult MediaDecoder::Play()
   NS_ASSERTION(mDecoderStateMachine != nullptr, "Should have state machine.");
   nsresult res = ScheduleStateMachineThread();
   NS_ENSURE_SUCCESS(res,res);
   if ((mPlayState == PLAY_STATE_LOADING && mIsDormant) || mPlayState == PLAY_STATE_SEEKING) {
     mNextState = PLAY_STATE_PLAYING;
     return NS_OK;
   }
   if (mPlayState == PLAY_STATE_ENDED)
-    return Seek(0);
+    return Seek(0, SeekTarget::PrevSyncPoint);
 
   ChangeState(PLAY_STATE_PLAYING);
   return NS_OK;
 }
 
-/**
- * Returns true if aValue is inside a range of aRanges, and put the range
- * index in aIntervalIndex if it is not null.
- * If aValue is not inside a range, false is returned, and aIntervalIndex, if
- * not null, is set to the index of the range which ends immediately before aValue
- * (and can be -1 if aValue is before aRanges.Start(0)).
- */
-static bool
-IsInRanges(dom::TimeRanges& aRanges, double aValue, int32_t& aIntervalIndex)
-{
-  uint32_t length;
-  aRanges.GetLength(&length);
-  for (uint32_t i = 0; i < length; i++) {
-    double start, end;
-    aRanges.Start(i, &start);
-    if (start > aValue) {
-      aIntervalIndex = i - 1;
-      return false;
-    }
-    aRanges.End(i, &end);
-    if (aValue <= end) {
-      aIntervalIndex = i;
-      return true;
-    }
-  }
-  aIntervalIndex = length - 1;
-  return false;
-}
-
-nsresult MediaDecoder::Seek(double aTime)
+nsresult MediaDecoder::Seek(double aTime, SeekTarget::Type aSeekType)
 {
   MOZ_ASSERT(NS_IsMainThread());
   ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
 
   NS_ABORT_IF_FALSE(aTime >= 0.0, "Cannot seek to a negative value.");
 
-  dom::TimeRanges seekable;
-  nsresult res;
-  uint32_t length = 0;
-  res = GetSeekable(&seekable);
-  NS_ENSURE_SUCCESS(res, NS_OK);
-
-  seekable.GetLength(&length);
-  if (!length) {
-    return NS_OK;
-  }
+  int64_t timeUsecs = 0;
+  nsresult rv = SecondsToUsecs(aTime, timeUsecs);
+  NS_ENSURE_SUCCESS(rv, rv);
 
-  // If the position we want to seek to is not in a seekable range, we seek
-  // to the closest position in the seekable ranges instead. If two positions
-  // are equally close, we seek to the closest position from the currentTime.
-  // See seeking spec, point 7 :
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#seeking
-  int32_t range = 0;
-  if (!IsInRanges(seekable, aTime, range)) {
-    if (range != -1) {
-      // |range + 1| can't be negative, because the only possible negative value
-      // for |range| is -1.
-      if (uint32_t(range + 1) < length) {
-        double leftBound, rightBound;
-        res = seekable.End(range, &leftBound);
-        NS_ENSURE_SUCCESS(res, NS_OK);
-        res = seekable.Start(range + 1, &rightBound);
-        NS_ENSURE_SUCCESS(res, NS_OK);
-        double distanceLeft = Abs(leftBound - aTime);
-        double distanceRight = Abs(rightBound - aTime);
-        if (distanceLeft == distanceRight) {
-          distanceLeft = Abs(leftBound - mCurrentTime);
-          distanceRight = Abs(rightBound - mCurrentTime);
-        }
-        aTime = (distanceLeft < distanceRight) ? leftBound : rightBound;
-      } else {
-        // Seek target is after the end last range in seekable data.
-        // Clamp the seek target to the end of the last seekable range.
-        res = seekable.End(length - 1, &aTime);
-        NS_ENSURE_SUCCESS(res, NS_OK);
-      }
-    } else {
-      // aTime is before the first range in |seekable|, the closest point we can
-      // seek to is the start of the first range.
-      seekable.Start(0, &aTime);
-    }
-  }
-
-  mRequestedSeekTime = aTime;
+  mRequestedSeekTarget = SeekTarget(timeUsecs, aSeekType);
   mCurrentTime = aTime;
 
-  // If we are already in the seeking state, then setting mRequestedSeekTime
+  // If we are already in the seeking state, then setting mRequestedSeekTarget
   // above will result in the new seek occurring when the current seek
   // completes.
   if ((mPlayState != PLAY_STATE_LOADING || !mIsDormant) && mPlayState != PLAY_STATE_SEEKING) {
     bool paused = false;
     if (mOwner) {
       paused = mOwner->GetPaused();
     }
     mNextState = paused ? PLAY_STATE_PAUSED : PLAY_STATE_PLAYING;
     PinForSeek();
     ChangeState(PLAY_STATE_SEEKING);
   }
 
   return ScheduleStateMachineThread();
 }
 
+bool MediaDecoder::IsLogicallyPlaying()
+{
+  GetReentrantMonitor().AssertCurrentThreadIn();
+  return mPlayState == PLAY_STATE_PLAYING ||
+         mNextState == PLAY_STATE_PLAYING;
+}
+
 double MediaDecoder::GetCurrentTime()
 {
   MOZ_ASSERT(NS_IsMainThread());
   return mCurrentTime;
 }
 
 already_AddRefed<nsIPrincipal> MediaDecoder::GetCurrentPrincipal()
 {
@@ -811,17 +754,17 @@ void MediaDecoder::MetadataLoaded(int aC
   // This can run cache callbacks.
   mResource->EnsureCacheUpToDate();
 
   // The element can run javascript via events
   // before reaching here, so only change the
   // state if we're still set to the original
   // loading state.
   if (mPlayState == PLAY_STATE_LOADING) {
-    if (mRequestedSeekTime >= 0.0) {
+    if (mRequestedSeekTarget.IsValid()) {
       ChangeState(PLAY_STATE_SEEKING);
     }
     else {
       ChangeState(mNextState);
     }
   }
 
   if (notifyResourceIsLoaded) {
@@ -1138,25 +1081,27 @@ void MediaDecoder::SeekingStopped()
     return;
 
   bool seekWasAborted = false;
   {
     ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
 
     // An additional seek was requested while the current seek was
     // in operation.
-    if (mRequestedSeekTime >= 0.0) {
+    if (mRequestedSeekTarget.IsValid()) {
       ChangeState(PLAY_STATE_SEEKING);
       seekWasAborted = true;
     } else {
       UnpinForSeek();
       ChangeState(mNextState);
     }
   }
 
+  PlaybackPositionChanged();
+
   if (mOwner) {
     UpdateReadyStateForData();
     if (!seekWasAborted) {
       mOwner->SeekCompleted();
     }
   }
 }
 
@@ -1171,26 +1116,28 @@ void MediaDecoder::SeekingStoppedAtEnd()
 
   bool fireEnded = false;
   bool seekWasAborted = false;
   {
     ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
 
     // An additional seek was requested while the current seek was
     // in operation.
-    if (mRequestedSeekTime >= 0.0) {
+    if (mRequestedSeekTarget.IsValid()) {
       ChangeState(PLAY_STATE_SEEKING);
       seekWasAborted = true;
     } else {
       UnpinForSeek();
       fireEnded = true;
       ChangeState(PLAY_STATE_ENDED);
     }
   }
 
+  PlaybackPositionChanged();
+
   if (mOwner) {
     UpdateReadyStateForData();
     if (!seekWasAborted) {
       mOwner->SeekCompleted();
       if (fireEnded) {
         mOwner->PlaybackEnded();
       }
     }
@@ -1249,18 +1196,18 @@ void MediaDecoder::ApplyStateToStateMach
   GetReentrantMonitor().AssertCurrentThreadIn();
 
   if (mDecoderStateMachine) {
     switch (aState) {
       case PLAY_STATE_PLAYING:
         mDecoderStateMachine->Play();
         break;
       case PLAY_STATE_SEEKING:
-        mDecoderStateMachine->Seek(mRequestedSeekTime);
-        mRequestedSeekTime = -1.0;
+        mDecoderStateMachine->Seek(mRequestedSeekTarget);
+        mRequestedSeekTarget.Reset();
         break;
       default:
         /* No action needed */
         break;
     }
   }
 }
 
--- a/content/media/MediaDecoder.h
+++ b/content/media/MediaDecoder.h
@@ -221,16 +221,49 @@ static const uint32_t FRAMEBUFFER_LENGTH
 static const uint32_t FRAMEBUFFER_LENGTH_MAX = 16384;
 
 // GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
 // GetTickCount() and conflicts with MediaDecoder::GetCurrentTime implementation.
 #ifdef GetCurrentTime
 #undef GetCurrentTime
 #endif
 
+// Stores the seek target; the time to seek to, and whether an Accurate,
+// or "Fast" (nearest keyframe) seek was requested.
+struct SeekTarget {
+  enum Type {
+    Invalid,
+    PrevSyncPoint,
+    Accurate
+  };
+  SeekTarget()
+    : mTime(-1.0)
+    , mType(SeekTarget::Invalid)
+  {
+  }
+  SeekTarget(int64_t aTimeUsecs, Type aType)
+    : mTime(aTimeUsecs)
+    , mType(aType)
+  {
+  }
+  bool IsValid() const {
+    return mType != SeekTarget::Invalid;
+  }
+  void Reset() {
+    mTime = -1;
+    mType = SeekTarget::Invalid;
+  }
+  // Seek target time in microseconds.
+  int64_t mTime;
+  // Whether we should seek "Fast", or "Accurate".
+  // "Fast" seeks to the seek point preceeding mTime, whereas
+  // "Accurate" seeks as close as possible to mTime.
+  Type mType;
+};
+
 class MediaDecoder : public nsIObserver,
                      public AbstractMediaDecoder
 {
 public:
   class DecodedStreamGraphListener;
 
   NS_DECL_THREADSAFE_ISUPPORTS
   NS_DECL_NSIOBSERVER
@@ -305,17 +338,19 @@ public:
   // Return the principal of the current URI being played or downloaded.
   virtual already_AddRefed<nsIPrincipal> GetCurrentPrincipal();
 
   // Return the time position in the video stream being
   // played measured in seconds.
   virtual double GetCurrentTime();
 
   // Seek to the time position in (seconds) from the start of the video.
-  virtual nsresult Seek(double aTime);
+  // If aDoFastSeek is true, we'll seek to the sync point/keyframe preceeding
+  // the seek target.
+  virtual nsresult Seek(double aTime, SeekTarget::Type aSeekType);
 
   // Enables decoders to supply an enclosing byte range for a seek offset.
   // E.g. used by ChannelMediaResource to download a whole cluster for
   // DASH-WebM.
   virtual nsresult GetByteRangeForSeek(int64_t const aOffset,
                                        MediaByteRange &aByteRange) {
     return NS_ERROR_NOT_AVAILABLE;
   }
@@ -341,16 +376,21 @@ public:
   // of our audio.
   virtual void SetAudioCaptured(bool aCaptured);
 
   virtual void NotifyWaitingForResourcesStatusChanged() MOZ_OVERRIDE;
 
   void SetPlaybackRate(double aPlaybackRate);
   void SetPreservesPitch(bool aPreservesPitch);
 
+  // Directs the decoder to not preroll extra samples until the media is
+  // played. This reduces the memory overhead of media elements that may
+  // not be played. Note that seeking also doesn't cause us start prerolling.
+  void SetMinimizePrerollUntilPlaybackStarts();
+
   // All MediaStream-related data is protected by mReentrantMonitor.
   // We have at most one DecodedStreamData per MediaDecoder. Its stream
   // is used as the input for each ProcessedMediaStream created by calls to
   // captureStream(UntilEnded). Seeking creates a new source stream, as does
   // replaying after the input as ended. In the latter case, the new source is
   // not connected to streams created by captureStreamUntilEnded.
 
   struct DecodedStreamData {
@@ -809,16 +849,23 @@ public:
   // Notifies the element that decoding has failed.
   virtual void DecodeError();
 
   // Indicate whether the media is same-origin with the element.
   void UpdateSameOriginStatus(bool aSameOrigin);
 
   MediaDecoderOwner* GetOwner() MOZ_OVERRIDE;
 
+  // Returns true if we're logically playing, that is, if the Play() has
+  // been called and Pause() has not or we have not yet reached the end
+  // of media. This is irrespective of the seeking state; if the owner
+  // calls Play() and then Seek(), we still count as logically playing.
+  // The decoder monitor must be held.
+  bool IsLogicallyPlaying();
+
 #ifdef MOZ_RAW
   static bool IsRawEnabled();
 #endif
 
   static bool IsOggEnabled();
   static bool IsOpusEnabled();
 
 #ifdef MOZ_WAVE
@@ -1099,19 +1146,19 @@ protected:
   // This can only be PLAY_STATE_PAUSED or PLAY_STATE_PLAYING.
   PlayState mNextState;
 
   // Position to seek to when the seek notification is received by the
   // decode thread.
   // This can only be changed on the main thread while holding the decoder
   // monitor. Thus, it can be safely read while holding the decoder monitor
   // OR on the main thread.
-  // If the value is negative then no seek has been requested. When a seek is
-  // started this is reset to negative.
-  double mRequestedSeekTime;
+  // If the SeekTarget's IsValid() accessor returns false, then no seek has
+  // been requested. When a seek is started this is reset to invalid.
+  SeekTarget mRequestedSeekTarget;
 
   // True when we have fully loaded the resource and reported that
   // to the element (i.e. reached NETWORK_LOADED state).
   // Accessed on the main thread only.
   bool mCalledResourceLoaded;
 
   // True when seeking or otherwise moving the play position around in
   // such a manner that progress event data is inaccurate. This is set
@@ -1178,13 +1225,19 @@ protected:
   bool mShuttingDown;
 
   // True if the playback is paused because the playback rate member is 0.0.
   bool mPausedForPlaybackRateNull;
 
   // Be assigned from media element during the initialization and pass to
   // AudioStream Class.
   dom::AudioChannelType mAudioChannelType;
+
+  // True if the decoder has been directed to minimize its preroll before
+  // playback starts. After the first time playback starts, we don't attempt
+  // to minimize preroll, as we assume the user is likely to keep playing,
+  // or play the media again.
+  bool mMinimizePreroll;
 };
 
 } // namespace mozilla
 
 #endif
--- a/content/media/MediaDecoderReader.cpp
+++ b/content/media/MediaDecoderReader.cpp
@@ -174,58 +174,81 @@ VideoData* MediaDecoderReader::FindStart
 }
 
 nsresult MediaDecoderReader::DecodeToTarget(int64_t aTarget)
 {
   DECODER_LOG(PR_LOG_DEBUG, ("MediaDecoderReader::DecodeToTarget(%lld) Begin", aTarget));
 
   // Decode forward to the target frame. Start with video, if we have it.
   if (HasVideo()) {
+    // Note: when decoding hits the end of stream we must keep the last frame
+    // in the video queue so that we'll have something to display after the
+    // seek completes. This makes our logic a bit messy.
     bool eof = false;
-    int64_t startTime = -1;
     nsAutoPtr<VideoData> video;
     while (HasVideo() && !eof) {
       while (VideoQueue().GetSize() == 0 && !eof) {
         bool skip = false;
         eof = !DecodeVideoFrame(skip, 0);
         {
           ReentrantMonitorAutoEnter decoderMon(mDecoder->GetReentrantMonitor());
           if (mDecoder->IsShutdown()) {
             return NS_ERROR_FAILURE;
           }
         }
       }
       if (eof) {
         // Hit end of file, we want to display the last frame of the video.
         if (video) {
+          DECODER_LOG(PR_LOG_DEBUG,
+            ("MediaDecoderReader::DecodeToTarget(%lld) repushing video frame [%lld, %lld] at EOF",
+            aTarget, video->mTime, video->GetEndTime()));
           VideoQueue().PushFront(video.forget());
         }
         VideoQueue().Finish();
         break;
       }
       video = VideoQueue().PeekFront();
       // If the frame end time is less than the seek target, we won't want
       // to display this frame after the seek, so discard it.
       if (video && video->GetEndTime() <= aTarget) {
-        if (startTime == -1) {
-          startTime = video->mTime;
-        }
+        DECODER_LOG(PR_LOG_DEBUG,
+                    ("MediaDecoderReader::DecodeToTarget(%lld) pop video frame [%lld, %lld]",
+                     aTarget, video->mTime, video->GetEndTime()));
         VideoQueue().PopFront();
       } else {
+        // Found a frame after or encompasing the seek target.
+        if (aTarget >= video->mTime && video->GetEndTime() >= aTarget) {
+          // The seek target lies inside this frame's time slice. Adjust the frame's
+          // start time to match the seek target. We do this by replacing the
+          // first frame with a shallow copy which has the new timestamp.
+          VideoQueue().PopFront();
+          VideoData* temp = VideoData::ShallowCopyUpdateTimestamp(video, aTarget);
+          video = temp;
+          VideoQueue().PushFront(video);
+        }
+        DECODER_LOG(PR_LOG_DEBUG,
+                    ("MediaDecoderReader::DecodeToTarget(%lld) found target video frame [%lld,%lld]",
+                     aTarget, video->mTime, video->GetEndTime()));
+
         video.forget();
         break;
       }
     }
     {
       ReentrantMonitorAutoEnter decoderMon(mDecoder->GetReentrantMonitor());
       if (mDecoder->IsShutdown()) {
         return NS_ERROR_FAILURE;
       }
     }
-    DECODER_LOG(PR_LOG_DEBUG, ("First video frame after decode is %lld", startTime));
+#ifdef PR_LOGGING
+    const VideoData* front =  VideoQueue().PeekFront();
+    DECODER_LOG(PR_LOG_DEBUG, ("First video frame after decode is %lld",
+                front ? front->mTime : -1));
+#endif
   }
 
   if (HasAudio()) {
     // Decode audio forward to the seek target.
     bool eof = false;
     while (HasAudio() && !eof) {
       while (!eof && AudioQueue().GetSize() == 0) {
         eof = !DecodeAudioData();
@@ -297,17 +320,23 @@ nsresult MediaDecoderReader::DecodeToTar
                                               audioData.forget(),
                                               channels));
       delete AudioQueue().PopFront();
       AudioQueue().PushFront(data.forget());
       break;
     }
   }
 
-  DECODER_LOG(PR_LOG_DEBUG, ("MediaDecoderReader::DecodeToTarget(%lld) End", aTarget));
+#ifdef PR_LOGGING
+  const VideoData* v = VideoQueue().PeekFront();
+  const AudioData* a = AudioQueue().PeekFront();
+  DECODER_LOG(PR_LOG_DEBUG,
+              ("MediaDecoderReader::DecodeToTarget(%lld) finished v=%lld a=%lld",
+              aTarget, v ? v->mTime : -1, a ? a->mTime : -1));
+#endif
 
   return NS_OK;
 }
 
 nsresult
 MediaDecoderReader::GetBuffered(mozilla::dom::TimeRanges* aBuffered,
                                 int64_t aStartTime)
 {
--- a/content/media/MediaDecoderReader.h
+++ b/content/media/MediaDecoderReader.h
@@ -150,20 +150,22 @@ public:
   // Returns a pointer to the decoder.
   AbstractMediaDecoder* GetDecoder() {
     return mDecoder;
   }
 
   AudioData* DecodeToFirstAudioData();
   VideoData* DecodeToFirstVideoData();
 
+  // Decodes samples until we reach frames required to play at time aTarget
+  // (usecs). This also trims the samples to start exactly at aTarget,
+  // by discarding audio samples and adjusting start times of video frames.
+  nsresult DecodeToTarget(int64_t aTarget);
+
 protected:
-  // Pumps the decode until we reach frames required to play at time aTarget
-  // (usecs).
-  nsresult DecodeToTarget(int64_t aTarget);
 
   // Reference to the owning decoder object.
   AbstractMediaDecoder* mDecoder;
 
   // Stores presentation info required for playback.
   MediaInfo mInfo;
 
   // Whether we should accept media that we know we can't play
--- a/content/media/MediaDecoderStateMachine.cpp
+++ b/content/media/MediaDecoderStateMachine.cpp
@@ -161,17 +161,16 @@ MediaDecoderStateMachine::MediaDecoderSt
   mDecoder(aDecoder),
   mState(DECODER_STATE_DECODING_METADATA),
   mSyncPointInMediaStream(-1),
   mSyncPointInDecodedStream(-1),
   mResetPlayStartTime(false),
   mPlayDuration(0),
   mStartTime(-1),
   mEndTime(-1),
-  mSeekTime(0),
   mFragmentEndTime(-1),
   mReader(aReader),
   mCurrentFrameTime(0),
   mAudioStartTime(-1),
   mAudioEndTime(-1),
   mVideoFrameEndTime(-1),
   mVolume(1.0),
   mPlaybackRate(1.0),
@@ -189,16 +188,17 @@ MediaDecoderStateMachine::MediaDecoderSt
   mPositionChangeQueued(false),
   mAudioCompleted(false),
   mGotDurationFromMetaData(false),
   mDispatchedEventToDecode(false),
   mStopAudioThread(true),
   mQuickBuffering(false),
   mIsRunning(false),
   mRunAgain(false),
+  mMinimizePreroll(false),
   mDispatchedRunEvent(false),
   mDecodeThreadWaiting(false),
   mRealTime(aRealTime),
   mEventManager(aDecoder),
   mLastFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED)
 {
   MOZ_COUNT_CTOR(MediaDecoderStateMachine);
   NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
@@ -549,17 +549,19 @@ bool MediaDecoderStateMachine::HaveEnoug
 }
 
 bool
 MediaDecoderStateMachine::NeedToDecodeVideo()
 {
   AssertCurrentThreadInMonitor();
   NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(),
                "Should be on state machine or decode thread.");
-  return mIsVideoDecoding && !HaveEnoughDecodedVideo();
+  return mIsVideoDecoding &&
+         !mMinimizePreroll &&
+         !HaveEnoughDecodedVideo();
 }
 
 void
 MediaDecoderStateMachine::DecodeVideo()
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   NS_ASSERTION(OnDecodeThread(), "Should be on decode thread.");
 
@@ -643,16 +645,17 @@ MediaDecoderStateMachine::DecodeVideo()
 
 bool
 MediaDecoderStateMachine::NeedToDecodeAudio()
 {
   AssertCurrentThreadInMonitor();
   NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(),
                "Should be on state machine or decode thread.");
   return mIsAudioDecoding &&
+         !mMinimizePreroll &&
          !HaveEnoughDecodedAudio(mAmpleAudioThresholdUsecs * mPlaybackRate);
 }
 
 void
 MediaDecoderStateMachine::DecodeAudio()
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   NS_ASSERTION(OnDecodeThread(), "Should be on decode thread.");
@@ -1374,16 +1377,19 @@ void MediaDecoderStateMachine::Play()
   // we are currently buffering. In other cases, we'll start playing anyway
   // when the state machine notices the decoder's state change to PLAYING.
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   if (mState == DECODER_STATE_BUFFERING) {
     DECODER_LOG(PR_LOG_DEBUG, ("%p Changed state from BUFFERING to DECODING", mDecoder.get()));
     mState = DECODER_STATE_DECODING;
     mDecodeStartTime = TimeStamp::Now();
   }
+  // Once we start playing, we don't want to minimize our prerolling, as we
+  // assume the user is likely to want to keep playing in future.
+  mMinimizePreroll = false;
   ScheduleStateMachine();
 }
 
 void MediaDecoderStateMachine::ResetPlayback()
 {
   NS_ASSERTION(OnDecodeThread(), "Should be on decode thread.");
   mVideoFrameEndTime = -1;
   mAudioStartTime = -1;
@@ -1413,52 +1419,48 @@ void MediaDecoderStateMachine::NotifyDat
       double end = 0;
       buffered.End(length - 1, &end);
       ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
       mEndTime = std::max<int64_t>(mEndTime, end * USECS_PER_S);
     }
   }
 }
 
-void MediaDecoderStateMachine::Seek(double aTime)
+void MediaDecoderStateMachine::Seek(const SeekTarget& aTarget)
 {
   NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
 
   // We need to be able to seek both at a transport level and at a media level
   // to seek.
   if (!mMediaSeekable) {
     return;
   }
   // MediaDecoder::mPlayState should be SEEKING while we seek, and
   // in that case MediaDecoder shouldn't be calling us.
   NS_ASSERTION(mState != DECODER_STATE_SEEKING,
                "We shouldn't already be seeking");
   NS_ASSERTION(mState >= DECODER_STATE_DECODING,
                "We should have loaded metadata");
-  double t = aTime * static_cast<double>(USECS_PER_S);
-  if (t > INT64_MAX) {
-    // Prevent integer overflow.
-    return;
-  }
-
-  mSeekTime = static_cast<int64_t>(t) + mStartTime;
-  NS_ASSERTION(mSeekTime >= mStartTime && mSeekTime <= mEndTime,
-               "Can only seek in range [0,duration]");
 
   // Bound the seek time to be inside the media range.
   NS_ASSERTION(mStartTime != -1, "Should know start time by now");
   NS_ASSERTION(mEndTime != -1, "Should know end time by now");
-  mSeekTime = std::min(mSeekTime, mEndTime);
-  mSeekTime = std::max(mStartTime, mSeekTime);
-  mBasePosition = mSeekTime - mStartTime;
-  DECODER_LOG(PR_LOG_DEBUG, ("%p Changed state to SEEKING (to %f)", mDecoder.get(), aTime));
+  int64_t seekTime = aTarget.mTime + mStartTime;
+  seekTime = std::min(seekTime, mEndTime);
+  seekTime = std::max(mStartTime, seekTime);
+  NS_ASSERTION(seekTime >= mStartTime && seekTime <= mEndTime,
+               "Can only seek in range [0,duration]");
+  mSeekTarget = SeekTarget(seekTime, aTarget.mType);
+
+  mBasePosition = seekTime - mStartTime;
+  DECODER_LOG(PR_LOG_DEBUG, ("%p Changed state to SEEKING (to %ld)", mDecoder.get(), mSeekTarget.mTime));
   mState = DECODER_STATE_SEEKING;
   if (mDecoder->GetDecodedStream()) {
-    mDecoder->RecreateDecodedStream(mSeekTime - mStartTime);
+    mDecoder->RecreateDecodedStream(seekTime - mStartTime);
   }
   ScheduleStateMachine();
 }
 
 void MediaDecoderStateMachine::StopAudioThread()
 {
   NS_ASSERTION(OnDecodeThread() ||
                OnStateMachineThread(), "Should be on decode thread or state machine thread");
@@ -1512,17 +1514,25 @@ MediaDecoderStateMachine::EnsureActive()
     ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
     SetReaderActive();
   }
 }
 
 void
 MediaDecoderStateMachine::SetReaderIdle()
 {
-  DECODER_LOG(PR_LOG_DEBUG, ("%p SetReaderIdle()", mDecoder.get()));
+#ifdef PR_LOGGING
+  {
+    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+    DECODER_LOG(PR_LOG_DEBUG, ("%p SetReaderIdle() audioQueue=%lld videoQueue=%lld",
+                               mDecoder.get(),
+                               GetDecodedAudioDuration(),
+                               mReader->VideoQueue().Duration()));
+  }
+#endif
   MOZ_ASSERT(OnDecodeThread());
   mReader->SetIdle();
 }
 
 void
 MediaDecoderStateMachine::SetReaderActive()
 {
   DECODER_LOG(PR_LOG_DEBUG, ("%p SetReaderActive()", mDecoder.get()));
@@ -1550,17 +1560,17 @@ MediaDecoderStateMachine::DispatchDecode
 
   const bool needToDecodeAudio = NeedToDecodeAudio();
   const bool needToDecodeVideo = NeedToDecodeVideo();
 
   // If we're in completed state, we should not need to decode anything else.
   MOZ_ASSERT(mState != DECODER_STATE_COMPLETED ||
              (!needToDecodeAudio && !needToDecodeVideo));
 
-  bool needIdle = mDecoder->GetState() == MediaDecoder::PLAY_STATE_PAUSED &&
+  bool needIdle = !mDecoder->IsLogicallyPlaying() &&
                   !needToDecodeAudio &&
                   !needToDecodeVideo &&
                   !IsPlaying();
 
   if (needToDecodeAudio) {
     EnsureAudioDecodeTaskQueued();
   }
   if (needToDecodeVideo) {
@@ -1942,21 +1952,21 @@ void MediaDecoderStateMachine::DecodeSee
   // During the seek, don't have a lock on the decoder state,
   // otherwise long seek operations can block the main thread.
   // The events dispatched to the main thread are SYNC calls.
   // These calls are made outside of the decode monitor lock so
   // it is safe for the main thread to makes calls that acquire
   // the lock since it won't deadlock. We check the state when
   // acquiring the lock again in case shutdown has occurred
   // during the time when we didn't have the lock.
-  int64_t seekTime = mSeekTime;
+  int64_t seekTime = mSeekTarget.mTime;
   mDecoder->StopProgressUpdates();
 
   bool currentTimeChanged = false;
-  int64_t mediaTime = GetMediaTime();
+  const int64_t mediaTime = GetMediaTime();
   if (mediaTime != seekTime) {
     currentTimeChanged = true;
     // Stop playback now to ensure that while we're outside the monitor
     // dispatching SeekingStarted, playback doesn't advance and mess with
     // mCurrentFrameTime that we've setting to seekTime here.
     StopPlayback();
     UpdatePlaybackPositionInternal(seekTime);
   }
@@ -1966,48 +1976,59 @@ void MediaDecoderStateMachine::DecodeSee
   // to display
   {
     ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
     nsCOMPtr<nsIRunnable> startEvent =
       NS_NewRunnableMethod(mDecoder, &MediaDecoder::SeekingStarted);
     NS_DispatchToMainThread(startEvent, NS_DISPATCH_SYNC);
   }
 
+  int64_t newCurrentTime = seekTime;
   if (currentTimeChanged) {
     // The seek target is different than the current playback position,
     // we'll need to seek the playback position, so shutdown our decode
     // and audio threads.
     StopAudioThread();
     ResetPlayback();
     nsresult res;
     {
       ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
       // Now perform the seek. We must not hold the state machine monitor
       // while we seek, since the seek reads, which could block on I/O.
       res = mReader->Seek(seekTime,
                           mStartTime,
                           mEndTime,
                           mediaTime);
+
+      if (NS_SUCCEEDED(res) && mSeekTarget.mType == SeekTarget::Accurate) {
+        res = mReader->DecodeToTarget(seekTime);
+      }
     }
+
     if (NS_SUCCEEDED(res)) {
-      AudioData* audio = HasAudio() ? mReader->AudioQueue().PeekFront() : nullptr;
-      MOZ_ASSERT(!audio ||
-                 (audio->mTime <= seekTime &&
-                  seekTime <= audio->mTime + audio->mDuration) ||
-                 mReader->AudioQueue().IsFinished(),
-                 "Seek target should lie inside the first audio block after seek");
-      int64_t startTime = (audio && audio->mTime < seekTime) ? audio->mTime : seekTime;
-      mAudioStartTime = startTime;
-      mPlayDuration = startTime - mStartTime;
+      int64_t nextSampleStartTime = 0;
+      VideoData* video = nullptr;
+      {
+        ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
+        video = mReader->FindStartTime(nextSampleStartTime);
+      }
+
+      // Setup timestamp state.
+      if (seekTime == mEndTime) {
+        newCurrentTime = mAudioStartTime = seekTime;
+      } else if (HasAudio()) {
+        AudioData* audio = mReader->AudioQueue().PeekFront();
+        newCurrentTime = mAudioStartTime = audio ? audio->mTime : seekTime;
+      } else {
+        newCurrentTime = video ? video->mTime : seekTime;
+      }
+      mPlayDuration = newCurrentTime - mStartTime;
+
       if (HasVideo()) {
-        VideoData* video = mReader->VideoQueue().PeekFront();
         if (video) {
-          MOZ_ASSERT((video->mTime <= seekTime && seekTime <= video->GetEndTime()) ||
-                     mReader->VideoQueue().IsFinished(),
-            "Seek target should lie inside the first frame after seek, unless it's the last frame.");
           {
             ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
             RenderVideoFrame(video, TimeStamp::Now());
           }
           nsCOMPtr<nsIRunnable> event =
             NS_NewRunnableMethod(mDecoder, &MediaDecoder::Invalidate);
           NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
         }
@@ -2018,20 +2039,16 @@ void MediaDecoderStateMachine::DecodeSee
   }
   mDecoder->StartProgressUpdates();
   if (mState == DECODER_STATE_DECODING_METADATA ||
       mState == DECODER_STATE_DORMANT ||
       mState == DECODER_STATE_SHUTDOWN) {
     return;
   }
 
-  // Try to decode another frame to detect if we're at the end...
-  DECODER_LOG(PR_LOG_DEBUG, ("%p Seek completed, mCurrentFrameTime=%lld\n",
-              mDecoder.get(), mCurrentFrameTime));
-
   // Change state to DECODING or COMPLETED now. SeekingStopped will
   // call MediaDecoderStateMachine::Seek to reset our state to SEEKING
   // if we need to seek again.
 
   nsCOMPtr<nsIRunnable> stopEvent;
   bool isLiveStream = mDecoder->GetResource()->GetLength() == -1;
   if (GetMediaTime() == mEndTime && !isLiveStream) {
     // Seeked to end of media, move to COMPLETED state. Note we don't do
@@ -2047,16 +2064,28 @@ void MediaDecoderStateMachine::DecodeSee
     mIsVideoDecoding = false;
     DispatchDecodeTasksIfNeeded();
   } else {
     DECODER_LOG(PR_LOG_DEBUG, ("%p Changed state from SEEKING (to %lld) to DECODING",
                                mDecoder.get(), seekTime));
     stopEvent = NS_NewRunnableMethod(mDecoder, &MediaDecoder::SeekingStopped);
     StartDecoding();
   }
+
+  if (newCurrentTime != mediaTime) {
+    UpdatePlaybackPositionInternal(newCurrentTime);
+    if (mDecoder->GetDecodedStream()) {
+      SetSyncPointForMediaStream();
+    }
+  }
+
+  // Try to decode another frame to detect if we're at the end...
+  DECODER_LOG(PR_LOG_DEBUG, ("%p Seek completed, mCurrentFrameTime=%lld\n",
+              mDecoder.get(), mCurrentFrameTime));
+
   {
     ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
     NS_DispatchToMainThread(stopEvent, NS_DISPATCH_SYNC);
   }
 
   // Reset quick buffering status. This ensures that if we began the
   // seek while quick-buffering, we won't bypass quick buffering mode
   // if we need to buffer after the seek.
@@ -2845,17 +2874,17 @@ void MediaDecoderStateMachine::SetPlayba
   if (mPlaybackRate == aPlaybackRate) {
     return;
   }
 
   // Get position of the last time we changed the rate.
   if (!HasAudio()) {
     // mBasePosition is a position in the video stream, not an absolute time.
     if (mState == DECODER_STATE_SEEKING) {
-      mBasePosition = mSeekTime - mStartTime;
+      mBasePosition = mSeekTarget.mTime - mStartTime;
     } else {
       mBasePosition = GetVideoStreamPosition();
     }
     mPlayDuration = mBasePosition;
     mResetPlayStartTime = true;
     mPlayStartTime = TimeStamp::Now();
   }
 
@@ -2863,18 +2892,23 @@ void MediaDecoderStateMachine::SetPlayba
 }
 
 void MediaDecoderStateMachine::SetPreservesPitch(bool aPreservesPitch)
 {
   NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
 
   mPreservesPitch = aPreservesPitch;
-
-  return;
+}
+
+void
+MediaDecoderStateMachine::SetMinimizePrerollUntilPlaybackStarts()
+{
+  AssertCurrentThreadInMonitor();
+  mMinimizePreroll = true;
 }
 
 bool MediaDecoderStateMachine::IsShutdown()
 {
   AssertCurrentThreadInMonitor();
   return GetState() == DECODER_STATE_SHUTDOWN;
 }
 
--- a/content/media/MediaDecoderStateMachine.h
+++ b/content/media/MediaDecoderStateMachine.h
@@ -185,18 +185,18 @@ public:
 
   MediaDecoderOwner::NextFrameStatus GetNextFrameStatus();
 
   // Cause state transitions. These methods obtain the decoder monitor
   // to synchronise the change of state, and to notify other threads
   // that the state has changed.
   void Play();
 
-  // Seeks to aTime in seconds.
-  void Seek(double aTime);
+  // Seeks to the decoder to aTarget asynchronously.
+  void Seek(const SeekTarget& aTarget);
 
   // Returns the current playback position in seconds.
   // Called from the main thread to get the current frame time. The decoder
   // monitor must be obtained before calling this.
   double GetCurrentTime() const;
 
   // Clear the flag indicating that a playback position change event
   // is currently queued. This is called from the main thread and must
@@ -357,16 +357,23 @@ public:
   // be held.
   bool IsPlaying();
 
   // Called when the reader may have acquired the hardware resources required
   // to begin decoding. The state machine may move into DECODING_METADATA if
   // appropriate. The decoder monitor must be held while calling this.
   void NotifyWaitingForResourcesStatusChanged();
 
+  // Notifies the state machine that should minimize the number of samples
+  // decoded we preroll, until playback starts. The first time playback starts
+  // the state machine is free to return to prerolling normally. Note
+  // "prerolling" in this context refers to when we decode and buffer decoded
+  // samples in advance of when they're needed for playback.
+  void SetMinimizePrerollUntilPlaybackStarts();
+
 protected:
 
   void AssertCurrentThreadInMonitor() const { mDecoder->GetReentrantMonitor().AssertCurrentThreadIn(); }
 
 private:
   class WakeDecoderRunnable : public nsRunnable {
   public:
     WakeDecoderRunnable(MediaDecoderStateMachine* aSM)
@@ -720,17 +727,17 @@ private:
   // Time of the last frame in the media, in microseconds. This is the
   // end time of the last frame in the media. Accessed on state
   // machine, decode, and main threads. Access controlled by decoder monitor.
   int64_t mEndTime;
 
   // Position to seek to in microseconds when the seek state transition occurs.
   // The decoder monitor lock must be obtained before reading or writing
   // this value. Accessed on main and decode thread.
-  int64_t mSeekTime;
+  SeekTarget mSeekTarget;
 
   // Media Fragment end time in microseconds. Access controlled by decoder monitor.
   int64_t mFragmentEndTime;
 
   // The audio stream resource. Used on the state machine, and audio threads.
   // This is created and destroyed on the audio thread, while holding the
   // decoder monitor, so if this is used off the audio thread, you must
   // first acquire the decoder monitor and check that it is non-null.
@@ -916,16 +923,28 @@ private:
   // True if the shared state machine thread is currently running this
   // state machine.
   bool mIsRunning;
 
   // True if we should run the state machine again once the current
   // state machine run has finished.
   bool mRunAgain;
 
+  // True if we should not decode/preroll unnecessary samples, unless we're
+  // played. "Prerolling" in this context refers to when we decode and
+  // buffer decoded samples in advance of when they're needed for playback.
+  // This flag is set for preload=metadata media, and means we won't
+  // decode more than the first video frame and first block of audio samples
+  // for that media when we startup, or after a seek. When Play() is called,
+  // we reset this flag, as we assume the user is playing the media, so
+  // prerolling is appropriate then. This flag is used to reduce the overhead
+  // of prerolling samples for media elements that may not play, both
+  // memory and CPU overhead.
+  bool mMinimizePreroll;
+
   // True if we've dispatched an event to run the state machine. It's
   // imperative that we don't dispatch multiple events to run the state
   // machine at the same time, as our code assume all events are synchronous.
   // If we dispatch multiple events, the second event can run while the
   // first is shutting down a thread, causing inconsistent state.
   bool mDispatchedRunEvent;
 
   // True if the decode thread has gone filled its buffers and is now
--- a/content/media/MediaRecorder.cpp
+++ b/content/media/MediaRecorder.cpp
@@ -2,17 +2,17 @@
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* 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 "MediaRecorder.h"
 #include "GeneratedEvents.h"
 #include "MediaEncoder.h"
-#include "nsDOMEventTargetHelper.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "nsError.h"
 #include "nsIDocument.h"
 #include "nsIDOMRecordErrorEvent.h"
 #include "nsTArray.h"
 #include "DOMMediaStream.h"
 #include "EncodedBufferCache.h"
 #include "nsIDOMFile.h"
 #include "mozilla/dom/BlobEvent.h"
@@ -28,24 +28,24 @@ PRLogModuleInfo* gMediaRecorderLog;
 #else
 #define LOG(type, msg)
 #endif
 
 namespace mozilla {
 
 namespace dom {
 
-NS_IMPL_CYCLE_COLLECTION_INHERITED_1(MediaRecorder, nsDOMEventTargetHelper,
+NS_IMPL_CYCLE_COLLECTION_INHERITED_1(MediaRecorder, DOMEventTargetHelper,
                                      mStream)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaRecorder)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
-NS_IMPL_ADDREF_INHERITED(MediaRecorder, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(MediaRecorder, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(MediaRecorder, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaRecorder, DOMEventTargetHelper)
 
 /**
  * Session is an object to represent a single recording event.
  * In original design, all recording context is stored in MediaRecorder, which causes
  * a problem if someone calls MediaRecoder::Stop and MedaiRecorder::Start quickly.
  * To prevent blocking main thread, media encoding is executed in a second thread,
  * named as Read Thread. For the same reason, we do not wait Read Thread shutdown in
  * MediaRecorder::Stop. If someone call MediaRecoder::Start before Read Thread shutdown,
@@ -477,17 +477,17 @@ MediaRecorder::~MediaRecorder()
     if (mSessions[i]) {
       mSessions[i]->ForgetMediaRecorder();
       mSessions[i]->Stop();
     }
   }
 }
 
 MediaRecorder::MediaRecorder(DOMMediaStream& aStream, nsPIDOMWindow* aOwnerWindow)
-  : nsDOMEventTargetHelper(aOwnerWindow),
+  : DOMEventTargetHelper(aOwnerWindow),
     mState(RecordingState::Inactive),
     mMutex("Session.Data.Mutex")
 {
   MOZ_ASSERT(aOwnerWindow);
   MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
   mStream = &aStream;
 #ifdef PR_LOGGING
   if (!gMediaRecorderLog) {
--- a/content/media/MediaRecorder.h
+++ b/content/media/MediaRecorder.h
@@ -3,17 +3,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/. */
 
 #ifndef MediaRecorder_h
 #define MediaRecorder_h
 
 #include "mozilla/dom/MediaRecorderBinding.h"
-#include "nsDOMEventTargetHelper.h"
+#include "mozilla/DOMEventTargetHelper.h"
 
 // Max size for allowing queue encoded data in memory
 #define MAX_ALLOW_MEMORY_BUFFER 1024000
 namespace mozilla {
 
 class ErrorResult;
 class DOMMediaStream;
 class EncodedBufferCache;
@@ -30,34 +30,34 @@ namespace dom {
  * a MediaEncoder will be created and accept the mediaStream as input source.
  * Encoder will get the raw data by track data changes, encode it by selected MIME Type, then store the encoded in EncodedBufferCache object.
  * The encoded data will be extracted on every timeslice passed from Start function call or by RequestData function.
  * Thread model:
  * When the recorder starts, it creates a "Media Encoder" thread to read data from MediaEncoder object and store buffer in EncodedBufferCache object.
  * Also extract the encoded data and create blobs on every timeslice passed from start function or RequestData function called by UA.
  */
 
-class MediaRecorder : public nsDOMEventTargetHelper
+class MediaRecorder : public DOMEventTargetHelper
 {
   class Session;
   friend class CreateAndDispatchBlobEventRunnable;
 
 public:
   MediaRecorder(DOMMediaStream&, nsPIDOMWindow* aOwnerWindow);
   virtual ~MediaRecorder();
 
   // nsWrapperCache
   virtual JSObject* WrapObject(JSContext* aCx,
                                JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
   nsPIDOMWindow* GetParentObject() { return GetOwner(); }
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaRecorder,
-                                           nsDOMEventTargetHelper)
+                                           DOMEventTargetHelper)
 
   // WebIDL
   // Start recording. If timeSlice has been provided, mediaRecorder will
   // raise a dataavailable event containing the Blob of collected data on every timeSlice milliseconds.
   // If timeSlice isn't provided, UA should call the RequestData to obtain the Blob data, also set the mTimeSlice to zero.
   void Start(const Optional<int32_t>& timeSlice, ErrorResult & aResult);
   // Stop the recording activiy. Including stop the Media Encoder thread, un-hook the mediaStreamListener to encoder.
   void Stop(ErrorResult& aResult);
--- a/content/media/MediaStreamTrack.cpp
+++ b/content/media/MediaStreamTrack.cpp
@@ -26,23 +26,23 @@ MediaStreamTrack::MediaStreamTrack(DOMMe
     uuidgen->GenerateUUIDInPlace(&mID);
   }
 }
 
 MediaStreamTrack::~MediaStreamTrack()
 {
 }
 
-NS_IMPL_CYCLE_COLLECTION_INHERITED_1(MediaStreamTrack, nsDOMEventTargetHelper,
+NS_IMPL_CYCLE_COLLECTION_INHERITED_1(MediaStreamTrack, DOMEventTargetHelper,
                                      mStream)
 
-NS_IMPL_ADDREF_INHERITED(MediaStreamTrack, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(MediaStreamTrack, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(MediaStreamTrack, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaStreamTrack, DOMEventTargetHelper)
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamTrack)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 void
 MediaStreamTrack::GetId(nsAString& aID)
 {
   char chars[NSID_LENGTH];
   mID.ToProvidedString(chars);
   aID = NS_ConvertASCIItoUTF16(chars);
 }
--- a/content/media/MediaStreamTrack.h
+++ b/content/media/MediaStreamTrack.h
@@ -1,43 +1,44 @@
 /* -*- 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 MEDIASTREAMTRACK_H_
 #define MEDIASTREAMTRACK_H_
 
-#include "nsDOMEventTargetHelper.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "nsID.h"
 #include "StreamBuffer.h"
 
 namespace mozilla {
 
 class DOMMediaStream;
 
 namespace dom {
 
 class AudioStreamTrack;
 class VideoStreamTrack;
 
 /**
  * Class representing a track in a DOMMediaStream.
  */
-class MediaStreamTrack : public nsDOMEventTargetHelper {
+class MediaStreamTrack : public DOMEventTargetHelper {
 public:
   /**
    * aTrackID is the MediaStreamGraph track ID for the track in the
    * MediaStream owned by aStream.
    */
   MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID);
   virtual ~MediaStreamTrack();
 
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamTrack, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamTrack,
+                                           DOMEventTargetHelper)
 
   DOMMediaStream* GetParentObject() const { return mStream; }
   virtual JSObject* WrapObject(JSContext* aCx,
                                JS::Handle<JSObject*> aScope) MOZ_OVERRIDE = 0;
 
   DOMMediaStream* GetStream() const { return mStream; }
   TrackID GetTrackID() const { return mTrackID; }
   virtual AudioStreamTrack* AsAudioStreamTrack() { return nullptr; }
--- a/content/media/TextTrack.cpp
+++ b/content/media/TextTrack.cpp
@@ -12,27 +12,27 @@
 #include "mozilla/dom/TextTrackRegion.h"
 #include "mozilla/dom/HTMLMediaElement.h"
 #include "mozilla/dom/HTMLTrackElement.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED_5(TextTrack,
-                                     nsDOMEventTargetHelper,
+                                     DOMEventTargetHelper,
                                      mParent,
                                      mCueList,
                                      mActiveCueList,
                                      mTextTrackList,
                                      mTrackElement)
 
-NS_IMPL_ADDREF_INHERITED(TextTrack, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(TextTrack, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(TextTrack, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(TextTrack, DOMEventTargetHelper)
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrack)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 TextTrack::TextTrack(nsISupports* aParent,
                      TextTrackKind aKind,
                      const nsAString& aLabel,
                      const nsAString& aLanguage,
                      TextTrackMode aMode,
                      TextTrackReadyState aReadyState,
                      TextTrackSource aTextTrackSource)
--- a/content/media/TextTrack.h
+++ b/content/media/TextTrack.h
@@ -2,20 +2,20 @@
 /* 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 mozilla_dom_TextTrack_h
 #define mozilla_dom_TextTrack_h
 
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/dom/TextTrackBinding.h"
 #include "nsCOMPtr.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsString.h"
 
 namespace mozilla {
 namespace dom {
 
 class TextTrackList;
 class TextTrackCue;
 class TextTrackCueList;
@@ -31,21 +31,21 @@ enum TextTrackSource {
 // Constants for numeric readyState property values.
 enum TextTrackReadyState {
   NotLoaded = 0U,
   Loading = 1U,
   Loaded = 2U,
   FailedToLoad = 3U
 };
 
-class TextTrack MOZ_FINAL : public nsDOMEventTargetHelper
+class TextTrack MOZ_FINAL : public DOMEventTargetHelper
 {
 public:
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrack, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrack, DOMEventTargetHelper)
 
   TextTrack(nsISupports* aParent,
             TextTrackKind aKind,
             const nsAString& aLabel,
             const nsAString& aLanguage,
             TextTrackMode aMode,
             TextTrackReadyState aReadyState,
             TextTrackSource aTextTrackSource);
--- a/content/media/TextTrackCue.cpp
+++ b/content/media/TextTrackCue.cpp
@@ -8,27 +8,27 @@
 #include "mozilla/dom/TextTrackRegion.h"
 #include "nsComponentManagerUtils.h"
 #include "mozilla/ClearOnShutdown.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED_5(TextTrackCue,
-                                     nsDOMEventTargetHelper,
+                                     DOMEventTargetHelper,
                                      mDocument,
                                      mTrack,
                                      mTrackElement,
                                      mDisplayState,
                                      mRegion)
 
-NS_IMPL_ADDREF_INHERITED(TextTrackCue, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(TextTrackCue, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(TextTrackCue, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(TextTrackCue, DOMEventTargetHelper)
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackCue)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 StaticRefPtr<nsIWebVTTParserWrapper> TextTrackCue::sParserWrapper;
 
 // Set cue setting defaults based on step 19 & seq.
 // in http://dev.w3.org/html5/webvtt/#parsing
 void
 TextTrackCue::SetDefaultCueSettings()
 {
--- a/content/media/TextTrackCue.h
+++ b/content/media/TextTrackCue.h
@@ -2,38 +2,38 @@
 /* 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 mozilla_dom_TextTrackCue_h
 #define mozilla_dom_TextTrackCue_h
 
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/dom/DocumentFragment.h"
 #include "mozilla/dom/VTTCueBinding.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsIWebVTTParserWrapper.h"
 #include "mozilla/StaticPtr.h"
 #include "nsIDocument.h"
 #include "mozilla/dom/HTMLDivElement.h"
 #include "mozilla/dom/UnionTypes.h"
 
 namespace mozilla {
 namespace dom {
 
 class HTMLTrackElement;
 class TextTrack;
 class TextTrackRegion;
 
-class TextTrackCue MOZ_FINAL : public nsDOMEventTargetHelper
+class TextTrackCue MOZ_FINAL : public DOMEventTargetHelper
 {
 public:
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackCue, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackCue, DOMEventTargetHelper)
 
   // TextTrackCue WebIDL
   // See bug 868509 about splitting out the WebVTT-specific interfaces.
   static already_AddRefed<TextTrackCue>
   Constructor(GlobalObject& aGlobal,
               double aStartTime,
               double aEndTime,
               const nsAString& aText,
--- a/content/media/TextTrackList.cpp
+++ b/content/media/TextTrackList.cpp
@@ -9,25 +9,25 @@
 #include "nsThreadUtils.h"
 #include "mozilla/dom/TextTrackCue.h"
 #include "mozilla/dom/TextTrackManager.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED_3(TextTrackList,
-                                     nsDOMEventTargetHelper,
+                                     DOMEventTargetHelper,
                                      mGlobal,
                                      mTextTracks,
                                      mTextTrackManager)
 
-NS_IMPL_ADDREF_INHERITED(TextTrackList, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(TextTrackList, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(TextTrackList, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(TextTrackList, DOMEventTargetHelper)
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackList)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 TextTrackList::TextTrackList(nsISupports* aGlobal) : mGlobal(aGlobal)
 {
   SetIsDOMBinding();
 }
 
 TextTrackList::TextTrackList(nsISupports* aGlobal, TextTrackManager* aTextTrackManager)
  : mGlobal(aGlobal)
--- a/content/media/TextTrackList.h
+++ b/content/media/TextTrackList.h
@@ -2,34 +2,34 @@
 /* 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 mozilla_dom_TextTrackList_h
 #define mozilla_dom_TextTrackList_h
 
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/dom/TextTrack.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 
 namespace mozilla {
 namespace dom {
 
 class HTMLMediaElement;
 class TextTrackManager;
 class CompareTextTracks;
 class TrackEvent;
 class TrackEventRunner;
 
-class TextTrackList MOZ_FINAL : public nsDOMEventTargetHelper
+class TextTrackList MOZ_FINAL : public DOMEventTargetHelper
 {
 public:
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackList, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackList, DOMEventTargetHelper)
 
   TextTrackList(nsISupports* aGlobal);
   TextTrackList(nsISupports* aGlobal, TextTrackManager* aTextTrackManager);
 
   virtual JSObject* WrapObject(JSContext* aCx,
                                JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
   nsISupports* GetParentObject() const
--- a/content/media/VideoUtils.cpp
+++ b/content/media/VideoUtils.cpp
@@ -23,16 +23,24 @@ CheckedInt64 FramesToUsecs(int64_t aFram
 }
 
 // Converts from microseconds to number of audio frames, given the specified
 // audio rate.
 CheckedInt64 UsecsToFrames(int64_t aUsecs, uint32_t aRate) {
   return (CheckedInt64(aUsecs) * aRate) / USECS_PER_S;
 }
 
+nsresult SecondsToUsecs(double aSeconds, int64_t& aOutUsecs) {
+  if (aSeconds * double(USECS_PER_S) > INT64_MAX) {
+    return NS_ERROR_FAILURE;
+  }
+  aOutUsecs = int64_t(aSeconds * double(USECS_PER_S));
+  return NS_OK;
+}
+
 static int32_t ConditionDimension(float aValue)
 {
   // This will exclude NaNs and too-big values.
   if (aValue > 1.0 && aValue <= INT32_MAX)
     return int32_t(NS_round(aValue));
   return 0;
 }
 
--- a/content/media/VideoUtils.h
+++ b/content/media/VideoUtils.h
@@ -123,16 +123,20 @@ CheckedInt64 UsecsToFrames(int64_t aUsec
 static const int64_t USECS_PER_S = 1000000;
 
 // Number of microseconds per millisecond.
 static const int64_t USECS_PER_MS = 1000;
 
 // Converts seconds to milliseconds.
 #define MS_TO_SECONDS(s) ((double)(s) / (PR_MSEC_PER_SEC))
 
+// Converts from seconds to microseconds. Returns failure if the resulting
+// integer is too big to fit in an int64_t.
+nsresult SecondsToUsecs(double aSeconds, int64_t& aOutUsecs);
+
 // The maximum height and width of the video. Used for
 // sanitizing the memory allocation of the RGB buffer.
 // The maximum resolution we anticipate encountering in the
 // wild is 2160p - 3840x2160 pixels.
 static const int32_t MAX_VIDEO_WIDTH = 4000;
 static const int32_t MAX_VIDEO_HEIGHT = 3000;
 
 // Scales the display rect aDisplay by aspect ratio aAspectRatio.
--- a/content/media/directshow/DirectShowReader.cpp
+++ b/content/media/directshow/DirectShowReader.cpp
@@ -385,17 +385,17 @@ DirectShowReader::Seek(int64_t aTargetUs
                                    AM_SEEKING_AbsolutePositioning,
                                    nullptr,
                                    AM_SEEKING_NoPositioning);
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
   hr = mControl->Run();
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
-  return DecodeToTarget(aTargetUs);
+  return NS_OK;
 }
 
 void
 DirectShowReader::NotifyDataArrived(const char* aBuffer, uint32_t aLength, int64_t aOffset)
 {
   MOZ_ASSERT(NS_IsMainThread());
   if (!mMP3FrameParser.IsMP3()) {
     return;
--- a/content/media/gstreamer/GStreamerReader.cpp
+++ b/content/media/gstreamer/GStreamerReader.cpp
@@ -753,28 +753,31 @@ nsresult GStreamerReader::Seek(int64_t a
                                  int64_t aCurrentTime)
 {
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
 
   gint64 seekPos = aTarget * GST_USECOND;
   LOG(PR_LOG_DEBUG, "%p About to seek to %" GST_TIME_FORMAT,
         mDecoder, GST_TIME_ARGS(seekPos));
 
-  if (!gst_element_seek_simple(mPlayBin, GST_FORMAT_TIME,
-    static_cast<GstSeekFlags>(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), seekPos)) {
+  int flags = GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT;
+  if (!gst_element_seek_simple(mPlayBin,
+                               GST_FORMAT_TIME,
+                               static_cast<GstSeekFlags>(flags),
+                               seekPos)) {
     LOG(PR_LOG_ERROR, "seek failed");
     return NS_ERROR_FAILURE;
   }
   LOG(PR_LOG_DEBUG, "seek succeeded");
   GstMessage* message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE,
                (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
   gst_message_unref(message);
   LOG(PR_LOG_DEBUG, "seek completed");
 
-  return DecodeToTarget(aTarget);
+  return NS_OK;
 }
 
 nsresult GStreamerReader::GetBuffered(dom::TimeRanges* aBuffered,
                                       int64_t aStartTime)
 {
   if (!mInfo.HasValidMedia()) {
     return NS_OK;
   }
--- a/content/media/gtest/moz.build
+++ b/content/media/gtest/moz.build
@@ -6,18 +6,17 @@
 
 LIBRARY_NAME = 'media_gtest'
 
 UNIFIED_SOURCES += [
     'TestAudioCompactor.cpp',
     'TestTrackEncoder.cpp',
 ]
 
-LIBXUL_LIBRARY = True
-
 EXPORT_LIBRARY = True
 
 include('/ipc/chromium/chromium-config.mozbuild')
 
 LOCAL_INCLUDES += [
     '/content/media/encoder',
 ]
 
+FINAL_LIBRARY = 'xul-gtest'
--- a/content/media/mediasource/MediaSource.cpp
+++ b/content/media/mediasource/MediaSource.cpp
@@ -266,17 +266,17 @@ MediaSource::Detach()
   mDecoder = nullptr;
   mDuration = UnspecifiedNaN<double>();
   mActiveSourceBuffers->Clear();
   mSourceBuffers->Clear();
   SetReadyState(MediaSourceReadyState::Closed);
 }
 
 MediaSource::MediaSource(nsPIDOMWindow* aWindow)
-  : nsDOMEventTargetHelper(aWindow)
+  : DOMEventTargetHelper(aWindow)
   , mDuration(UnspecifiedNaN<double>())
   , mDecoder(nullptr)
   , mReadyState(MediaSourceReadyState::Closed)
 {
   mSourceBuffers = new SourceBufferList(this);
   mActiveSourceBuffers = new SourceBufferList(this);
 
 #ifdef PR_LOGGING
@@ -365,21 +365,21 @@ MediaSource::WrapObject(JSContext* aCx, 
 void
 MediaSource::NotifyEvicted(double aStart, double aEnd)
 {
   // Cycle through all SourceBuffers and tell them to evict data in
   // the given range.
   mSourceBuffers->Evict(aStart, aEnd);
 }
 
-NS_IMPL_CYCLE_COLLECTION_INHERITED_2(MediaSource, nsDOMEventTargetHelper,
+NS_IMPL_CYCLE_COLLECTION_INHERITED_2(MediaSource, DOMEventTargetHelper,
                                      mSourceBuffers, mActiveSourceBuffers)
 
-NS_IMPL_ADDREF_INHERITED(MediaSource, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(MediaSource, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(MediaSource, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaSource, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaSource)
   NS_INTERFACE_MAP_ENTRY(mozilla::dom::MediaSource)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 } // namespace dom
 
 } // namespace mozilla
--- a/content/media/mediasource/MediaSource.h
+++ b/content/media/mediasource/MediaSource.h
@@ -6,22 +6,22 @@
 
 #ifndef mozilla_dom_MediaSource_h_
 #define mozilla_dom_MediaSource_h_
 
 #include "MediaSourceDecoder.h"
 #include "js/RootingAPI.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/dom/MediaSourceBinding.h"
 #include "nsAutoPtr.h"
 #include "nsCOMPtr.h"
 #include "nsCycleCollectionNoteChild.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsID.h"
 #include "nsISupports.h"
 #include "nscore.h"
 
 struct JSContext;
 class JSObject;
 class nsPIDOMWindow;
 
@@ -36,17 +36,17 @@ class GlobalObject;
 class SourceBuffer;
 class SourceBufferList;
 template <typename T> class Optional;
 
 #define MOZILLA_DOM_MEDIASOURCE_IMPLEMENTATION_IID \
   { 0x3839d699, 0x22c5, 0x439f, \
   { 0x94, 0xca, 0x0e, 0x0b, 0x26, 0xf9, 0xca, 0xbf } }
 
-class MediaSource MOZ_FINAL : public nsDOMEventTargetHelper
+class MediaSource MOZ_FINAL : public DOMEventTargetHelper
 {
 public:
   /** WebIDL Methods. */
   static already_AddRefed<MediaSource>
   Constructor(const GlobalObject& aGlobal,
               ErrorResult& aRv);
 
   SourceBufferList* SourceBuffers();
@@ -59,17 +59,17 @@ public:
   already_AddRefed<SourceBuffer> AddSourceBuffer(const nsAString& aType, ErrorResult& aRv);
   void RemoveSourceBuffer(SourceBuffer& aSourceBuffer, ErrorResult& aRv);
 
   void EndOfStream(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv);
   static bool IsTypeSupported(const GlobalObject&, const nsAString& aType);
   /** End WebIDL Methods. */
 
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaSource, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaSource, DOMEventTargetHelper)
   NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIASOURCE_IMPLEMENTATION_IID)
 
   nsPIDOMWindow* GetParentObject() const;
 
   JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
   // Attach this MediaSource to Decoder aDecoder.  Returns false if already attached.
   bool Attach(MediaSourceDecoder* aDecoder);
--- a/content/media/mediasource/SourceBuffer.cpp
+++ b/content/media/mediasource/SourceBuffer.cpp
@@ -248,17 +248,17 @@ SourceBuffer::Detach()
 
 void
 SourceBuffer::Ended()
 {
   mDecoder->GetResource()->Ended();
 }
 
 SourceBuffer::SourceBuffer(MediaSource* aMediaSource, const nsACString& aType)
-  : nsDOMEventTargetHelper(aMediaSource->GetParentObject())
+  : DOMEventTargetHelper(aMediaSource->GetParentObject())
   , mMediaSource(aMediaSource)
   , mAppendWindowStart(0)
   , mAppendWindowEnd(PositiveInfinity<double>())
   , mTimestampOffset(0)
   , mAppendMode(SourceBufferAppendMode::Segments)
   , mUpdating(false)
 {
   MOZ_ASSERT(aMediaSource);
@@ -394,19 +394,20 @@ SourceBuffer::Evict(double aStart, doubl
 {
   // Need to map time to byte offset then evict
   int64_t end = mDecoder->ConvertToByteOffset(aEnd);
   if (end > 0) {
     mDecoder->GetResource()->EvictBefore(end);
   }
 }
 
-NS_IMPL_CYCLE_COLLECTION_INHERITED_1(SourceBuffer, nsDOMEventTargetHelper, mMediaSource)
+NS_IMPL_CYCLE_COLLECTION_INHERITED_1(SourceBuffer, DOMEventTargetHelper,
+                                     mMediaSource)
 
-NS_IMPL_ADDREF_INHERITED(SourceBuffer, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(SourceBuffer, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(SourceBuffer, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SourceBuffer, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SourceBuffer)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 } // namespace dom
 
 } // namespace mozilla
--- a/content/media/mediasource/SourceBuffer.h
+++ b/content/media/mediasource/SourceBuffer.h
@@ -9,22 +9,22 @@
 
 #include "MediaDecoderReader.h"
 #include "MediaSource.h"
 #include "js/RootingAPI.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/dom/SourceBufferBinding.h"
 #include "mozilla/dom/TypedArray.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/mozalloc.h"
 #include "nsAutoPtr.h"
 #include "nsCOMPtr.h"
 #include "nsCycleCollectionNoteChild.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsISupports.h"
 #include "nsStringGlue.h"
 #include "nscore.h"
 
 class JSObject;
 struct JSContext;
 
 namespace mozilla {
@@ -33,17 +33,17 @@ class ErrorResult;
 class SourceBufferResource;
 class SubBufferDecoder;
 template <typename T> class AsyncEventRunner;
 
 namespace dom {
 
 class TimeRanges;
 
-class SourceBuffer MOZ_FINAL : public nsDOMEventTargetHelper
+class SourceBuffer MOZ_FINAL : public DOMEventTargetHelper
 {
 public:
   /** WebIDL Methods. */
   SourceBufferAppendMode Mode() const
   {
     return mAppendMode;
   }
 
@@ -81,17 +81,17 @@ public:
   void AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv);
 
   void Abort(ErrorResult& aRv);
 
   void Remove(double aStart, double aEnd, ErrorResult& aRv);
   /** End WebIDL Methods. */
 
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBuffer, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBuffer, DOMEventTargetHelper)
 
   explicit SourceBuffer(MediaSource* aMediaSource, const nsACString& aType);
   ~SourceBuffer();
 
   MediaSource* GetParentObject() const;
 
   JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
--- a/content/media/mediasource/SourceBufferList.cpp
+++ b/content/media/mediasource/SourceBufferList.cpp
@@ -130,17 +130,17 @@ void
 SourceBufferList::QueueAsyncSimpleEvent(const char* aName)
 {
   MSE_DEBUG("%p Queuing event %s to SourceBufferList", this, aName);
   nsCOMPtr<nsIRunnable> event = new AsyncEventRunner<SourceBufferList>(this, aName);
   NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
 }
 
 SourceBufferList::SourceBufferList(MediaSource* aMediaSource)
-  : nsDOMEventTargetHelper(aMediaSource->GetParentObject())
+  : DOMEventTargetHelper(aMediaSource->GetParentObject())
   , mMediaSource(aMediaSource)
 {
   MOZ_ASSERT(aMediaSource);
 }
 
 MediaSource*
 SourceBufferList::GetParentObject() const
 {
@@ -148,20 +148,20 @@ SourceBufferList::GetParentObject() cons
 }
 
 JSObject*
 SourceBufferList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
 {
   return SourceBufferListBinding::Wrap(aCx, aScope, this);
 }
 
-NS_IMPL_CYCLE_COLLECTION_INHERITED_2(SourceBufferList, nsDOMEventTargetHelper,
+NS_IMPL_CYCLE_COLLECTION_INHERITED_2(SourceBufferList, DOMEventTargetHelper,
                                      mMediaSource, mSourceBuffers)
 
-NS_IMPL_ADDREF_INHERITED(SourceBufferList, nsDOMEventTargetHelper)
-NS_IMPL_RELEASE_INHERITED(SourceBufferList, nsDOMEventTargetHelper)
+NS_IMPL_ADDREF_INHERITED(SourceBufferList, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SourceBufferList, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SourceBufferList)
-NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 } // namespace dom
 
 } // namespace mozilla
--- a/content/media/mediasource/SourceBufferList.h
+++ b/content/media/mediasource/SourceBufferList.h
@@ -6,46 +6,47 @@
 
 #ifndef mozilla_dom_SourceBufferList_h_
 #define mozilla_dom_SourceBufferList_h_
 
 #include "SourceBuffer.h"
 #include "js/RootingAPI.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
 #include "nsAutoPtr.h"
 #include "nsCycleCollectionNoteChild.h"
 #include "nsCycleCollectionParticipant.h"
-#include "nsDOMEventTargetHelper.h"
 #include "nsISupports.h"
 #include "nsTArray.h"
 
 struct JSContext;
 class JSObject;
 
 namespace mozilla {
 
 class ErrorResult;
 template <typename T> class AsyncEventRunner;
 
 namespace dom {
 
 class MediaSource;
 
-class SourceBufferList MOZ_FINAL : public nsDOMEventTargetHelper
+class SourceBufferList MOZ_FINAL : public DOMEventTargetHelper
 {
 public:
   /** WebIDL Methods. */
   SourceBuffer* IndexedGetter(uint32_t aIndex, bool& aFound);
 
   uint32_t Length();
   /** End WebIDL methods. */
 
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBufferList, nsDOMEventTargetHelper)
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBufferList,
+                                           DOMEventTargetHelper)
 
   explicit SourceBufferList(MediaSource* aMediaSource);
 
   MediaSource* GetParentObject() const;
 
   JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
 
   // Append a SourceBuffer and fire "addsourcebuffer" at the list.
--- a/content/media/ogg/OggReader.cpp
+++ b/content/media/ogg/OggReader.cpp
@@ -1310,19 +1310,19 @@ nsresult OggReader::SeekInUnbuffered(int
   int64_t seekTarget = std::max(aStartTime, aTarget - keyframeOffsetMs);
   // Minimize the bisection search space using the known timestamps from the
   // buffered ranges.
   SeekRange k = SelectSeekRange(aRanges, seekTarget, aStartTime, aEndTime, false);
   return SeekBisection(seekTarget, k, SEEK_FUZZ_USECS);
 }
 
 nsresult OggReader::Seek(int64_t aTarget,
-                           int64_t aStartTime,
-                           int64_t aEndTime,
-                           int64_t aCurrentTime)
+                         int64_t aStartTime,
+                         int64_t aEndTime,
+                         int64_t aCurrentTime)
 {
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
   if (mIsChained)
     return NS_ERROR_FAILURE;
   LOG(PR_LOG_DEBUG, ("%p About to seek to %lld", mDecoder, aTarget));
   nsresult res;
   MediaResource* resource = mDecoder->GetResource();
   NS_ENSURE_TRUE(resource != nullptr, NS_ERROR_FAILURE);
@@ -1374,20 +1374,17 @@ nsresult OggReader::Seek(int64_t aTarget
         // search over the whole media, using the known buffered ranges to
         // reduce the search space.
         res = SeekInUnbuffered(aTarget, aStartTime, aEndTime, ranges);
         NS_ENSURE_SUCCESS(res,res);
       }
     }
   }
 
-  // The decode position must now be either close to the seek target, or
-  // we've seeked to before the keyframe before the seek target. Decode
-  // forward to the seek target frame.
-  return DecodeToTarget(aTarget);
+  return NS_OK;
 }
 
 // Reads a page from the media resource.
 static PageSyncResult
 PageSync(MediaResource* aResource,
          ogg_sync_state* aState,
          bool aCachedDataOnly,
          int64_t aOffset,
--- a/content/media/omx/MediaOmxReader.cpp
+++ b/content/media/omx/MediaOmxReader.cpp
@@ -345,19 +345,33 @@ nsresult MediaOmxReader::Seek(int64_t aT
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
 
   ResetDecode();
   VideoFrameContainer* container = mDecoder->GetVideoFrameContainer();
   if (container && container->GetImageContainer()) {
     container->GetImageContainer()->ClearAllImagesExceptFront();
   }
 
-  mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget;
+  if (mHasAudio && mHasVideo) {
+    // The OMXDecoder seeks/demuxes audio and video streams separately. So if
+    // we seek both audio and video to aTarget, the audio stream can typically
+    // seek closer to the seek target, since typically every audio block is
+    // a sync point, whereas for video there are only keyframes once every few
+    // seconds. So if we have both audio and video, we must seek the video
+    // stream to the preceeding keyframe first, get the stream time, and then
+    // seek the audio stream to match the video stream's time. Otherwise, the
+    // audio and video streams won't be in sync after the seek.
+    mVideoSeekTimeUs = aTarget;
+    const VideoData* v = DecodeToFirstVideoData();
+    mAudioSeekTimeUs = v ? v->mTime : aTarget;
+  } else {
+    mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget;
+  }
 
-  return DecodeToTarget(aTarget);
+  return NS_OK;
 }
 
 static uint64_t BytesToTime(int64_t offset, uint64_t length, uint64_t durationUs) {
   double perc = double(offset) / double(length);
   if (perc > 1.0)
     perc = 1.0;
   return uint64_t(double(durationUs) * perc);
 }
--- a/content/media/plugins/MediaPluginReader.cpp
+++ b/content/media/plugins/MediaPluginReader.cpp
@@ -323,17 +323,17 @@ nsresult MediaPluginReader::Seek(int64_t
 {
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
 
   mVideoQueue.Erase();
   mAudioQueue.Erase();
 
   mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget;
 
-  return DecodeToTarget(aTarget);
+  return NS_OK;
 }
 
 MediaPluginReader::ImageBufferCallback::ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer) :
   mImageContainer(aImageContainer)
 {
 }
 
 void *
new file mode 100644
--- /dev/null
+++ b/content/media/test/crashtests/986901.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+    var ac = new window.AudioContext();
+    var delay1 = ac.createDelay(0.02);
+    var delay2 = ac.createDelay(0.002);
+    var source = ac.createOscillator();
+    source.start(0);
+    source.connect(delay1, 0, 0);
+    delay2.connect(delay1, 0, 0);
+    delay1.connect(delay2, 0, 0);
+</script>
+</head>
+</html>
--- a/content/media/test/crashtests/crashtests.list
+++ b/content/media/test/crashtests/crashtests.list
@@ -58,13 +58,15 @@ load 907986-4.html
 load 910171-1.html
 load 920987.html
 load 925619-1.html
 load 925619-2.html
 load 926619.html
 load 933151.html
 load 933156.html
 load 952756.html
+load 986901.html
 load buffer-source-ended-1.html
 load offline-buffer-source-ended-1.html
+HTTP load media-element-source-seek-1.html
 skip-if(B2G) load oscillator-ended-1.html # intermittent B2G timeouts, bug 920338
 skip-if(B2G) load oscillator-ended-2.html # intermittent B2G timeouts, bug 920338
 test-pref(media.mediasource.enabled,true) load 926665.html
new file mode 100644
--- /dev/null
+++ b/content/media/test/crashtests/media-element-source-seek-1.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var audioElement = document.createElement("audio");
+audioElement.autoplay = true;
+audioElement.src = "sound.ogg";
+audioElement.onplaying =
+  function() {
+    audioElement.onseeked =
+      function() {
+        setTimeout(
+          function() {
+            document.documentElement.removeAttribute("class");
+          }, 100);
+      };
+    audioElement.currentTime = 0;
+  };
+
+var context = new window.AudioContext();
+var source = context.createMediaElementSource(audioElement);
+source.connect(context.destination);
+</script>
+</html>
index 1fc478842f51e7519866f474a02ad605235bc6a6..87efad5ade9f14988da329b0b34911e763ef54a2
GIT binary patch
literal 455255
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