Merge fx-team to m-c. a=merge
authorRyan VanderMeulen <ryanvm@gmail.com>
Fri, 09 Jan 2015 14:41:41 -0500
changeset 248797 7a32d60c7d715ed1de89ce41cc70edc2956815cb
parent 248781 a11d1c3d4b7959648df30e961a13217895f135a6 (current diff)
parent 248796 246718a1cded61eac2306ff23275b0fa76ddc463 (diff)
child 248857 086396560012f598b2400b11c10bfe39be083429
push id4489
push userraliiev@mozilla.com
push dateMon, 23 Feb 2015 15:17:55 +0000
treeherdermozilla-beta@fd7c3dc24146 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone37.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 fx-team to m-c. a=merge
browser/devtools/framework/test/browser_toolbox_options_disable_cache.js
--- a/browser/base/content/aboutNetError.xhtml
+++ b/browser/base/content/aboutNetError.xhtml
@@ -151,16 +151,40 @@
         var ld = document.getElementById("errorLongDesc");
         if (ld)
         {
           ld.parentNode.replaceChild(errDesc, ld);
           // change id to the replaced child's id so styling works
           errDesc.id = "errorLongDesc";
         }
 
+        if (err == "nssFailure2" &&
+            sd.textContent.contains("ssl_error_unsupported_version")) {
+          var ssl3ErrorTitle = document.getElementById("et_ssl3");
+          var ssl3ErrorDesc = document.getElementById("ed_ssl3");
+          var ssl3ShortDesc = document.getElementById("esd_ssl3");
+          var learnMoreText = document.getElementById("learn_more_ssl3");
+
+          errTitle.parentNode.replaceChild(ssl3ErrorTitle, errTitle);
+          ssl3ErrorTitle.id = "errorTitleText";
+          ssl3ErrorTitle.setAttribute("sslv3", "true");
+          errTitle = ssl3ErrorTitle;
+
+          sd.innerHTML = ssl3ShortDesc.innerHTML;
+          sd.querySelector('span').textContent = location.hostname;
+
+          errDesc.parentNode.replaceChild(ssl3ErrorDesc, errDesc);
+          ssl3ErrorDesc.id = "errorLongDesc";
+          ssl3ErrorDesc.querySelector('span').textContent = "ssl_error_unsupported_version";
+
+          var retryBtn = document.getElementById("errorTryAgain");
+          retryBtn.textContent = learnMoreText.textContent;
+          retryBtn.setAttribute("onclick", "learnMoreSSLV3()");
+        }
+
         // remove undisplayed errors to avoid bug 39098
         var errContainer = document.getElementById("errorContainer");
         errContainer.parentNode.removeChild(errContainer);
 
         var className = getCSSClass();
         if (className && className != "expertBadCert") {
           // Associate a CSS class with the root of the page, if one was passed in,
           // to allow custom styling.
@@ -189,17 +213,17 @@
         if (err == "cspBlocked") {
           // Remove the "Try again" button for CSP violations, since it's
           // almost certainly useless. (Bug 553180)
           document.getElementById("errorTryAgain").style.display = "none";
         }
 
         window.addEventListener("AboutNetErrorOptions", function(evt) {
         // Pinning errors are of type nssFailure2 (don't ask me why)
-          if (getErrorCode() == "nssFailure2") {
+          if (getErrorCode() == "nssFailure2" && !errTitle.hasAttribute("sslv3")) {
           // TODO: and the pref is set...
             var options = JSON.parse(evt.detail);
             if (options && options.enabled) {
               var checkbox = document.getElementById('automaticallyReportInFuture');
               showCertificateErrorReporting();
               if (options.automatic) {
                 // set the checkbox
                 checkbox.checked = true;
@@ -319,16 +343,21 @@
         if (endsWith(thisHost, "." + okHost))
           link.href = proto + okHost;
       }
 
       function endsWith(haystack, needle) {
         return haystack.slice(-needle.length) == needle;
       }
 
+      function learnMoreSSLV3() {
+        location.href = "https://support.mozilla.org/kb/how-resolve-sslv3-error-messages-firefox";
+        // Ensure users don't re-click the button:
+        e.target.disabled = true;
+      }
     ]]></script>
   </head>
 
   <body dir="&locale.dir;">
 
     <!-- ERROR ITEM CONTAINER (removed during loading to avoid bug 39098) -->
     <div id="errorContainer">
       <div id="errorTitlesContainer">
@@ -351,16 +380,17 @@
         <h1 id="et_contentEncodingError">&contentEncodingError.title;</h1>
         <h1 id="et_unsafeContentType">&unsafeContentType.title;</h1>
         <h1 id="et_nssFailure2">&nssFailure2.title;</h1>
         <h1 id="et_nssBadCert">&nssBadCert.title;</h1>
         <h1 id="et_malwareBlocked">&malwareBlocked.title;</h1>
         <h1 id="et_cspBlocked">&cspBlocked.title;</h1>
         <h1 id="et_remoteXUL">&remoteXUL.title;</h1>
         <h1 id="et_corruptedContentError">&corruptedContentError.title;</h1>
+        <h1 id="et_ssl3">&oldSecurityProtocol.title;</h1>
       </div>
       <div id="errorDescriptionsContainer">
         <div id="ed_generic">&generic.longDesc;</div>
         <div id="ed_dnsNotFound">&dnsNotFound.longDesc;</div>
         <div id="ed_fileNotFound">&fileNotFound.longDesc;</div>
         <div id="ed_malformedURI">&malformedURI.longDesc;</div>
         <div id="ed_unknownProtocolFound">&unknownProtocolFound.longDesc;</div>
         <div id="ed_connectionFailure">&connectionFailure.longDesc;</div>
@@ -377,16 +407,19 @@
         <div id="ed_contentEncodingError">&contentEncodingError.longDesc;</div>
         <div id="ed_unsafeContentType">&unsafeContentType.longDesc;</div>
         <div id="ed_nssFailure2">&nssFailure2.longDesc2;</div>
         <div id="ed_nssBadCert">&nssBadCert.longDesc2;</div>
         <div id="ed_malwareBlocked">&malwareBlocked.longDesc;</div>
         <div id="ed_cspBlocked">&cspBlocked.longDesc;</div>
         <div id="ed_remoteXUL">&remoteXUL.longDesc;</div>
         <div id="ed_corruptedContentError">&corruptedContentError.longDesc;</div>
+        <div id="esd_ssl3">&oldSecurityProtocol.longDesc2;</div>
+        <div id="ed_ssl3">&oldSecurityProtocol.advancedInfo;</div>
+        <div id="learn_more_ssl3">&oldSecurityProtocol.learnMore;</div>
       </div>
     </div>
 
     <!-- PAGE CONTAINER (for styling purposes only) -->
     <div id="errorPageContainer">
 
       <!-- Error Title -->
       <div id="errorTitle">
--- a/browser/base/content/test/general/browser_bug553455.js
+++ b/browser/base/content/test/general/browser_bug553455.js
@@ -841,23 +841,20 @@ function test() {
   Services.prefs.setBoolPref("extensions.logging.enabled", true);
   Services.prefs.setBoolPref("extensions.strictCompatibility", true);
 
   Services.obs.addObserver(XPInstallObserver, "addon-install-started", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-blocked", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-failed", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-complete", false);
 
-  PopupNotifications.transitionsEnabled = false;
-
   registerCleanupFunction(function() {
     // Make sure no more test parts run in case we were timed out
     TESTS = [];
     PopupNotifications.panel.removeEventListener("popupshown", check_notification, false);
-    PopupNotifications.transitionsEnabled = true;
 
     AddonManager.getAllInstalls(function(aInstalls) {
       aInstalls.forEach(function(aInstall) {
         aInstall.cancel();
       });
     });
 
     Services.prefs.clearUserPref("extensions.logging.enabled");
--- a/browser/base/content/test/popupNotifications/head.js
+++ b/browser/base/content/test/popupNotifications/head.js
@@ -83,21 +83,19 @@ function promiseTabLoadEvent(tab, url, e
   return deferred.promise;
 }
 
 const PREF_SECURITY_DELAY_INITIAL = Services.prefs.getIntPref("security.notification_enable_delay");
 
 function setup() {
   // Disable transitions as they slow the test down and we want to click the
   // mouse buttons in a predictable location.
-  PopupNotifications.transitionsEnabled = false;
 
   registerCleanupFunction(() => {
     PopupNotifications.buttonDelay = PREF_SECURITY_DELAY_INITIAL;
-    PopupNotifications.transitionsEnabled = true;
   });
 }
 
 function goNext() {
   executeSoon(() => executeSoon(Task.async(runNextTest)));
 }
 
 function* runNextTest() {
--- a/browser/base/content/test/social/head.js
+++ b/browser/base/content/test/social/head.js
@@ -68,23 +68,21 @@ function checkProviderPrefsEmpty(isError
       c++;
     }
   }
   is(c, 0, "all provider prefs uninstalled from previous test");
   is(Social.providers.length, 0, "all providers uninstalled from previous test " + Social.providers.length);
 }
 
 function defaultFinishChecks() {
-  PopupNotifications.transitionsEnabled = true;
   checkProviderPrefsEmpty(true);
   finish();
 }
 
 function runSocialTestWithProvider(manifest, callback, finishcallback) {
-  PopupNotifications.transitionsEnabled = false;
 
   let SocialService = Cu.import("resource://gre/modules/SocialService.jsm", {}).SocialService;
 
   let manifests = Array.isArray(manifest) ? manifest : [manifest];
 
   // Check that none of the provider's content ends up in history.
   function finishCleanUp() {
     ok(!SocialSidebar.provider, "no provider in sidebar");
@@ -173,17 +171,16 @@ function runSocialTests(tests, cbPreTest
         yield [name, tests[name]];
       }
     }
   })();
   let providersAtStart = Social.providers.length;
   info("runSocialTests: start test run with " + providersAtStart + " providers");
   window.focus();
 
-  PopupNotifications.transitionsEnabled = false;
 
   if (cbPreTest === undefined) {
     cbPreTest = function(cb) {cb()};
   }
   if (cbPostTest === undefined) {
     cbPostTest = function(cb) {cb()};
   }
 
--- a/browser/devtools/canvasdebugger/canvasdebugger.js
+++ b/browser/devtools/canvasdebugger/canvasdebugger.js
@@ -817,17 +817,17 @@ let CallsListView = Heritage.extend(Widg
     setConditionalTimeout("screenshot-display", SCREENSHOT_DISPLAY_DELAY, () => {
       return !this._isSliding;
     }, () => {
       let frameSnapshot = SnapshotsListView.selectedItem.attachment.actor
       let functionCall = callItem.attachment.actor;
       frameSnapshot.generateScreenshotFor(functionCall).then(screenshot => {
         this.showScreenshot(screenshot);
         this.highlightedThumbnail = screenshot.index;
-      });
+      }).catch(Cu.reportError);
     });
   },
 
   /**
    * The mousedown listener for the call selection slider.
    */
   _onSlideMouseDown: function() {
     this._isSliding = true;
--- a/browser/devtools/framework/test/browser.ini
+++ b/browser/devtools/framework/test/browser.ini
@@ -1,15 +1,16 @@
 [DEFAULT]
 subsuite = devtools
 support-files =
   browser_toolbox_options_disable_js.html
   browser_toolbox_options_disable_js_iframe.html
   browser_toolbox_options_disable_cache.sjs
   head.js
+  helper_disable_cache.js
   doc_theme.css
 
 [browser_devtools_api.js]
 skip-if = e10s # Bug 1090340
 [browser_devtools_api_destroy.js]
 skip-if = e10s # Bug 1070837 - devtools/framework/toolbox.js |doc| getter not e10s friendly
 [browser_dynamic_tool_enabling.js]
 [browser_keybindings.js]
@@ -20,17 +21,19 @@ skip-if = e10s # Bug 1070837 - devtools/
 [browser_two_tabs.js]
 [browser_toolbox_dynamic_registration.js]
 [browser_toolbox_getpanelwhenready.js]
 [browser_toolbox_highlight.js]
 [browser_toolbox_hosts.js]
 [browser_toolbox_options.js]
 [browser_toolbox_options_devedition.js]
 [browser_toolbox_options_disable_buttons.js]
-[browser_toolbox_options_disable_cache.js]
+[browser_toolbox_options_disable_cache-01.js]
+skip-if = e10s # Bug 1030318
+[browser_toolbox_options_disable_cache-02.js]
 skip-if = e10s # Bug 1030318
 [browser_toolbox_options_disable_js.js]
 skip-if = e10s # Bug 1070837 - devtools/framework/toolbox.js |doc| getter not e10s friendly
 # [browser_toolbox_raise.js] # Bug 962258
 # skip-if = os == "win"
 [browser_toolbox_ready.js]
 [browser_toolbox_select_event.js]
 skip-if = e10s # Bug 1069044 - destroyInspector may hang during shutdown
rename from browser/devtools/framework/test/browser_toolbox_options_disable_cache.js
rename to browser/devtools/framework/test/browser_toolbox_options_disable_cache-01.js
--- a/browser/devtools/framework/test/browser_toolbox_options_disable_cache.js
+++ b/browser/devtools/framework/test/browser_toolbox_options_disable_cache-01.js
@@ -1,162 +1,30 @@
+/* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-// Tests that disabling the cache for a tab works as it should.
+"use strict";
 
-const TEST_URI = "http://mochi.test:8888/browser/browser/devtools/framework/" +
-                 "test/browser_toolbox_options_disable_cache.sjs";
-let tabs = [
-{
-  title: "Tab 0",
-  desc: "Toggles cache on.",
-  startToolbox: true
-},
-{
-  title: "Tab 1",
-  desc: "Toolbox open before Tab 1 toggles cache.",
-  startToolbox: true
-},
-{
-  title: "Tab 2",
-  desc: "Opens toolbox after Tab 1 has toggled cache. Also closes and opens.",
-  startToolbox: false
-},
-{
-  title: "Tab 3",
-  desc: "No toolbox",
-  startToolbox: false
-}];
+// Tests that disabling the cache for a tab works as it should when toolboxes
+// are not toggled.
+loadHelperScript("helper_disable_cache.js");
 
 add_task(function*() {
+  // Ensure that the setting is cleared after the test.
+  registerCleanupFunction(() => {
+    info("Resetting devtools.cache.disabled to false.");
+    Services.prefs.setBoolPref("devtools.cache.disabled", false);
+  });
+
   // Initialise tabs: 1 and 2 with a toolbox, 3 and 4 without.
   for (let tab of tabs) {
     yield initTab(tab, tab.startToolbox);
   }
 
   // Ensure cache is enabled for all tabs.
   yield checkCacheStateForAllTabs([true, true, true, true]);
 
   // Check the checkbox in tab 0 and ensure cache is disabled for tabs 0 and 1.
   yield setDisableCacheCheckboxChecked(tabs[0], true);
   yield checkCacheStateForAllTabs([false, false, true, true]);
 
-  // Open toolbox in tab 2 and ensure the cache is then disabled.
-  tabs[2].toolbox = yield gDevTools.showToolbox(tabs[2].target, "options");
-  yield checkCacheEnabled(tabs[2], false);
-
-  // Close toolbox in tab 2 and ensure the cache is enabled again
-  yield tabs[2].toolbox.destroy();
-  tabs[2].target = TargetFactory.forTab(tabs[2].tab);
-  yield checkCacheEnabled(tabs[2], true);
-
-  // Open toolbox in tab 2 and ensure the cache is then disabled.
-  tabs[2].toolbox = yield gDevTools.showToolbox(tabs[2].target, "options");
-  yield checkCacheEnabled(tabs[2], false);
-
-  // Check the checkbox in tab 2 and ensure cache is enabled for all tabs.
-  yield setDisableCacheCheckboxChecked(tabs[2], false);
-  yield checkCacheStateForAllTabs([true, true, true, true]);
-
   yield finishUp();
 });
-
-function* initTab(tabX, startToolbox) {
-  tabX.tab = yield addTab(TEST_URI);
-  tabX.target = TargetFactory.forTab(tabX.tab);
-
-  if (startToolbox) {
-    tabX.toolbox = yield gDevTools.showToolbox(tabX.target, "options");
-  }
-}
-
-function* checkCacheStateForAllTabs(states) {
-  for (let i = 0; i < tabs.length; i ++) {
-    let tab = tabs[i];
-    yield checkCacheEnabled(tab, states[i]);
-  }
-}
-
-function* checkCacheEnabled(tabX, expected) {
-  gBrowser.selectedTab = tabX.tab;
-
-  yield reloadTab(tabX);
-
-  let doc = content.document;
-  let h1 = doc.querySelector("h1");
-  let oldGuid = h1.textContent;
-
-  yield reloadTab(tabX);
-
-  doc = content.document;
-  h1 = doc.querySelector("h1");
-  let guid = h1.textContent;
-
-  if (expected) {
-    is(guid, oldGuid, tabX.title + " cache is enabled");
-  } else {
-    isnot(guid, oldGuid, tabX.title + " cache is not enabled");
-  }
-}
-
-function* setDisableCacheCheckboxChecked(tabX, state) {
-  gBrowser.selectedTab = tabX.tab;
-
-  let panel = tabX.toolbox.getCurrentPanel();
-  let cbx = panel.panelDoc.getElementById("devtools-disable-cache");
-
-  cbx.scrollIntoView();
-
-  // After uising scrollIntoView() we need to wait for the browser to scroll.
-  yield waitForTick();
-
-  if (cbx.checked !== state) {
-    info("Setting disable cache checkbox to " + state + " for " + tabX.title);
-    EventUtils.synthesizeMouseAtCenter(cbx, {}, panel.panelWin);
-
-    // We need to wait for all checkboxes to be updated and the docshells to
-    // apply the new cache settings.
-    yield waitForTick();
-  }
-}
-
-function reloadTab(tabX) {
-  let def = promise.defer();
-  let browser = gBrowser.selectedBrowser;
-
-  // once() doesn't work here so we use a standard handler instead.
-  browser.addEventListener("load", function onLoad() {
-    browser.removeEventListener("load", onLoad, true);
-    info("Reloaded tab " + tabX.title);
-    def.resolve();
-  }, true);
-
-  info("Reloading tab " + tabX.title);
-  let mm = getFrameScript();
-  mm.sendAsyncMessage("devtools:test:reload");
-
-  return def.promise;
-}
-
-function* destroyTab(tabX) {
-  let toolbox = gDevTools.getToolbox(tabX.target);
-
-  let onceDestroyed = promise.resolve();
-  if (toolbox) {
-    onceDestroyed = gDevTools.once("toolbox-destroyed");
-  }
-
-  info("Removing tab " + tabX.title);
-  gBrowser.removeTab(tabX.tab);
-  info("Removed tab " + tabX.title);
-
-  info("Waiting for toolbox-destroyed");
-  yield onceDestroyed;
-}
-
-function* finishUp() {
-  for (let tab of tabs) {
-    yield destroyTab(tab);
-  }
-
-  tabs = null;
-}
new file mode 100644
--- /dev/null
+++ b/browser/devtools/framework/test/browser_toolbox_options_disable_cache-02.js
@@ -0,0 +1,43 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+// Tests that disabling the cache for a tab works as it should when toolboxes
+// are toggled.
+loadHelperScript("helper_disable_cache.js");
+
+add_task(function*() {
+  // Ensure that the setting is cleared after the test.
+  registerCleanupFunction(() => {
+    info("Resetting devtools.cache.disabled to false.");
+    Services.prefs.setBoolPref("devtools.cache.disabled", false);
+  });
+
+  // Initialise tabs: 1 and 2 with a toolbox, 3 and 4 without.
+  for (let tab of tabs) {
+    yield initTab(tab, tab.startToolbox);
+  }
+
+  // Disable cache in tab 0
+  yield setDisableCacheCheckboxChecked(tabs[0], true);
+
+  // Open toolbox in tab 2 and ensure the cache is then disabled.
+  tabs[2].toolbox = yield gDevTools.showToolbox(tabs[2].target, "options");
+  yield checkCacheEnabled(tabs[2], false);
+
+  // Close toolbox in tab 2 and ensure the cache is enabled again
+  yield tabs[2].toolbox.destroy();
+  tabs[2].target = TargetFactory.forTab(tabs[2].tab);
+  yield checkCacheEnabled(tabs[2], true);
+
+  // Open toolbox in tab 2 and ensure the cache is then disabled.
+  tabs[2].toolbox = yield gDevTools.showToolbox(tabs[2].target, "options");
+  yield checkCacheEnabled(tabs[2], false);
+
+  // Check the checkbox in tab 2 and ensure cache is enabled for all tabs.
+  yield setDisableCacheCheckboxChecked(tabs[2], false);
+  yield checkCacheStateForAllTabs([true, true, true, true]);
+
+  yield finishUp();
+});
--- a/browser/devtools/framework/test/head.js
+++ b/browser/devtools/framework/test/head.js
@@ -110,16 +110,32 @@ function once(target, eventName, useCapt
       }, useCapture);
       break;
     }
   }
 
   return deferred.promise;
 }
 
+/**
+ * Some tests may need to import one or more of the test helper scripts.
+ * A test helper script is simply a js file that contains common test code that
+ * is either not common-enough to be in head.js, or that is located in a separate
+ * directory.
+ * The script will be loaded synchronously and in the test's scope.
+ * @param {String} filePath The file path, relative to the current directory.
+ *                 Examples:
+ *                 - "helper_attributes_test_runner.js"
+ *                 - "../../../commandline/test/helpers.js"
+ */
+function loadHelperScript(filePath) {
+  let testDir = gTestPath.substr(0, gTestPath.lastIndexOf("/"));
+  Services.scriptloader.loadSubScript(testDir + "/" + filePath, this);
+}
+
 function waitForTick() {
   let deferred = promise.defer();
   executeSoon(deferred.resolve);
   return deferred.promise;
 }
 
 function toggleAllTools(state) {
   for (let [, tool] of gDevTools._tools) {
new file mode 100644
--- /dev/null
+++ b/browser/devtools/framework/test/helper_disable_cache.js
@@ -0,0 +1,130 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+// Common code shared by browser_toolbox_options_disable_cache-*.js
+const TEST_URI = "http://mochi.test:8888/browser/browser/devtools/framework/" +
+                 "test/browser_toolbox_options_disable_cache.sjs";
+let tabs = [
+{
+  title: "Tab 0",
+  desc: "Toggles cache on.",
+  startToolbox: true
+},
+{
+  title: "Tab 1",
+  desc: "Toolbox open before Tab 1 toggles cache.",
+  startToolbox: true
+},
+{
+  title: "Tab 2",
+  desc: "Opens toolbox after Tab 1 has toggled cache. Also closes and opens.",
+  startToolbox: false
+},
+{
+  title: "Tab 3",
+  desc: "No toolbox",
+  startToolbox: false
+}];
+
+function* initTab(tabX, startToolbox) {
+  tabX.tab = yield addTab(TEST_URI);
+  tabX.target = TargetFactory.forTab(tabX.tab);
+
+  if (startToolbox) {
+    tabX.toolbox = yield gDevTools.showToolbox(tabX.target, "options");
+  }
+}
+
+function* checkCacheStateForAllTabs(states) {
+  for (let i = 0; i < tabs.length; i ++) {
+    let tab = tabs[i];
+    yield checkCacheEnabled(tab, states[i]);
+  }
+}
+
+function* checkCacheEnabled(tabX, expected) {
+  gBrowser.selectedTab = tabX.tab;
+
+  yield reloadTab(tabX);
+
+  let doc = content.document;
+  let h1 = doc.querySelector("h1");
+  let oldGuid = h1.textContent;
+
+  yield reloadTab(tabX);
+
+  doc = content.document;
+  h1 = doc.querySelector("h1");
+  let guid = h1.textContent;
+
+  if (expected) {
+    is(guid, oldGuid, tabX.title + " cache is enabled");
+  } else {
+    isnot(guid, oldGuid, tabX.title + " cache is not enabled");
+  }
+}
+
+function* setDisableCacheCheckboxChecked(tabX, state) {
+  gBrowser.selectedTab = tabX.tab;
+
+  let panel = tabX.toolbox.getCurrentPanel();
+  let cbx = panel.panelDoc.getElementById("devtools-disable-cache");
+
+  cbx.scrollIntoView();
+
+  // After uising scrollIntoView() we need to wait for the browser to scroll.
+  yield waitForTick();
+
+  if (cbx.checked !== state) {
+    info("Setting disable cache checkbox to " + state + " for " + tabX.title);
+    EventUtils.synthesizeMouseAtCenter(cbx, {}, panel.panelWin);
+
+    // We need to wait for all checkboxes to be updated and the docshells to
+    // apply the new cache settings.
+    yield waitForTick();
+  }
+}
+
+function reloadTab(tabX) {
+  let def = promise.defer();
+  let browser = gBrowser.selectedBrowser;
+
+  // once() doesn't work here so we use a standard handler instead.
+  browser.addEventListener("load", function onLoad() {
+    browser.removeEventListener("load", onLoad, true);
+    info("Reloaded tab " + tabX.title);
+    def.resolve();
+  }, true);
+
+  info("Reloading tab " + tabX.title);
+  let mm = getFrameScript();
+  mm.sendAsyncMessage("devtools:test:reload");
+
+  return def.promise;
+}
+
+function* destroyTab(tabX) {
+  let toolbox = gDevTools.getToolbox(tabX.target);
+
+  let onceDestroyed = promise.resolve();
+  if (toolbox) {
+    onceDestroyed = gDevTools.once("toolbox-destroyed");
+  }
+
+  info("Removing tab " + tabX.title);
+  gBrowser.removeTab(tabX.tab);
+  info("Removed tab " + tabX.title);
+
+  info("Waiting for toolbox-destroyed");
+  yield onceDestroyed;
+}
+
+function* finishUp() {
+  for (let tab of tabs) {
+    yield destroyTab(tab);
+  }
+
+  tabs = null;
+}
--- a/browser/devtools/storage/test/browser.ini
+++ b/browser/devtools/storage/test/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
-skip-if = e10s # Bug 1049888 - storage actors do not work in e10s for now
+# Bug 1049888 - storage actors do not work in e10s for now
+# Bug 1105803 - permafailing on debug release builds since devedition landed
+skip-if = e10s || debug
 subsuite = devtools
 support-files =
   storage-complex-values.html
   storage-listings.html
   storage-secured-iframe.html
   storage-unsecured-iframe.html
   storage-updates.html
   head.js
--- a/browser/modules/test/browser_SignInToWebsite.js
+++ b/browser/modules/test/browser_SignInToWebsite.js
@@ -272,17 +272,16 @@ function test() {
   try {
     Components.utils.import("resource:///modules/SignInToWebsite.jsm", sitw);
   } catch (ex) {
     ok(true, "Skip the test since SignInToWebsite.jsm isn't packaged outside outside mozilla-central");
     finish();
     return;
   }
 
-  PopupNotifications.transitionsEnabled = false;
 
   registerCleanupFunction(cleanUp);
 
   ok(sitw.SignInToWebsiteUX, "SignInToWebsiteUX object exists");
   if (!Services.prefs.getBoolPref("dom.identity.enabled")) {
     // If the pref isn't enabled then init wasn't called so do that for the test.
     sitw.SignInToWebsiteUX.init();
   }
@@ -311,17 +310,16 @@ function resetState() {
   IdentityService.reset();
 }
 
 // Cleanup after all tests
 function cleanUp() {
   info("cleanup");
   resetState();
 
-  PopupNotifications.transitionsEnabled = true;
 
   for (let topic in gActiveObservers)
     Services.obs.removeObserver(gActiveObservers[topic], topic);
   for (let eventName in gActiveListeners)
     PopupNotifications.panel.removeEventListener(eventName, gActiveListeners[eventName], false);
   delete IdentityService.RP._rpFlows[outerWinId];
 
   // Put the JSM functions back to how they were
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -10,16 +10,17 @@ browser.jar:
   skin/classic/browser/aboutSessionRestore-window-icon.png
   skin/classic/browser/aboutWelcomeBack.css                     (../shared/aboutWelcomeBack.css)
   skin/classic/browser/aboutCertError.css
   skin/classic/browser/aboutCertError_sectionCollapsed.png
   skin/classic/browser/aboutCertError_sectionCollapsed-rtl.png
   skin/classic/browser/aboutCertError_sectionExpanded.png
   skin/classic/browser/aboutNetError.css                        (../shared/aboutNetError.css)
   skin/classic/browser/aboutNetError_info.svg                   (../shared/aboutNetError_info.svg)
+  skin/classic/browser/aboutNetError_alert.svg                  (../shared/aboutNetError_alert.svg)
   skin/classic/browser/aboutSocialError.css                     (../shared/aboutSocialError.css)
 * skin/classic/browser/aboutProviderDirectory.css               (../shared/aboutProviderDirectory.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/aboutSyncTabs.css
 #endif
   skin/classic/browser/aboutTabCrashed.css
   skin/classic/browser/actionicon-tab.png
 * skin/classic/browser/browser.css
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -2,16 +2,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/.
 
 browser.jar:
 % skin browser classic/1.0 %skin/classic/browser/
   skin/classic/browser/sanitizeDialog.css                   (sanitizeDialog.css)
   skin/classic/browser/aboutNetError.css                    (../shared/aboutNetError.css)
   skin/classic/browser/aboutNetError_info.svg               (../shared/aboutNetError_info.svg)
+  skin/classic/browser/aboutNetError_alert.svg              (../shared/aboutNetError_alert.svg)
 * skin/classic/browser/aboutSessionRestore.css              (aboutSessionRestore.css)
   skin/classic/browser/aboutSessionRestore-window-icon.png
   skin/classic/browser/aboutWelcomeBack.css                 (../shared/aboutWelcomeBack.css)
   skin/classic/browser/aboutCertError.css
   skin/classic/browser/aboutCertError_sectionCollapsed.png
   skin/classic/browser/aboutCertError_sectionCollapsed-rtl.png
   skin/classic/browser/aboutCertError_sectionExpanded.png
   skin/classic/browser/aboutSocialError.css                 (../shared/aboutSocialError.css)
--- a/browser/themes/shared/aboutNetError.css
+++ b/browser/themes/shared/aboutNetError.css
@@ -38,16 +38,20 @@ ul {
   -moz-margin-start: -2em;
   -moz-padding-start: 2em;
 }
 
 #errorTitleText:-moz-dir(rtl) {
   background-position: right 0;
 }
 
+#errorTitleText[sslv3=true] {
+  background-image: url("aboutNetError_alert.svg");
+}
+
 #errorTryAgain {
   margin-top: 1.2em;
   min-width: 150px
 }
 
 #errorContainer {
   display: none;
 }
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/aboutNetError_alert.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 40 40" enable-background="new 0 0 40 40" xml:space="preserve">
+<g>
+	<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="20" y1="4" x2="20" y2="36">
+		<stop offset="0" style="stop-color:#E63B2E"/>
+		<stop offset="1" style="stop-color:#C33931"/>
+	</linearGradient>
+	<path fill="url(#SVGID_1_)" d="M13.373,4L4,13.372v13.256L13.373,36h13.255L36,26.628V13.372L26.627,4H13.373z M22.176,8.704   l-0.48,14.304h-3.424L17.76,8.704H22.176z M20,31.296c-1.44,0-2.592-1.184-2.592-2.592c0-1.44,1.152-2.592,2.592-2.592   c1.472,0,2.592,1.152,2.592,2.592C22.592,30.112,21.472,31.296,20,31.296z"/>
+	<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="20" y1="-3.728928e-10" x2="20" y2="40">
+		<stop offset="0" style="stop-color:#E63B2E"/>
+		<stop offset="1" style="stop-color:#C33931"/>
+	</linearGradient>
+	<path fill="url(#SVGID_2_)" d="M28.284,0H11.716L0,11.716v16.569L11.716,40h16.569L40,28.284V11.716L28.284,0z M38,27.456   L27.456,38H12.544L2,27.456V12.544L12.544,2h14.911L38,12.544V27.456z"/>
+</g>
+</svg>
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -12,16 +12,17 @@ browser.jar:
         skin/classic/browser/aboutSessionRestore-window-icon.png     (preferences/application.png)
         skin/classic/browser/aboutWelcomeBack.css                    (../shared/aboutWelcomeBack.css)
         skin/classic/browser/aboutCertError.css
         skin/classic/browser/aboutCertError_sectionCollapsed.png
         skin/classic/browser/aboutCertError_sectionCollapsed-rtl.png
         skin/classic/browser/aboutCertError_sectionExpanded.png
         skin/classic/browser/aboutNetError.css                       (../shared/aboutNetError.css)
         skin/classic/browser/aboutNetError_info.svg                  (../shared/aboutNetError_info.svg)
+        skin/classic/browser/aboutNetError_alert.svg                 (../shared/aboutNetError_alert.svg)
         skin/classic/browser/aboutSocialError.css                    (../shared/aboutSocialError.css)
 *       skin/classic/browser/aboutProviderDirectory.css              (../shared/aboutProviderDirectory.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/browser/aboutSyncTabs.css
 #endif
         skin/classic/browser/aboutTabCrashed.css
         skin/classic/browser/actionicon-tab.png
 *       skin/classic/browser/browser.css
@@ -462,16 +463,17 @@ browser.jar:
 *       skin/classic/aero/browser/aboutSessionRestore.css            (aboutSessionRestore.css)
         skin/classic/aero/browser/aboutSessionRestore-window-icon.png (aboutSessionRestore-window-icon-aero.png)
         skin/classic/aero/browser/aboutCertError.css
         skin/classic/aero/browser/aboutCertError_sectionCollapsed.png
         skin/classic/aero/browser/aboutCertError_sectionCollapsed-rtl.png
         skin/classic/aero/browser/aboutCertError_sectionExpanded.png
         skin/classic/aero/browser/aboutNetError.css                   (../shared/aboutNetError.css)
         skin/classic/aero/browser/aboutNetError_info.svg              (../shared/aboutNetError_info.svg)
+        skin/classic/aero/browser/aboutNetError_alert.svg             (../shared/aboutNetError_alert.svg)
         skin/classic/aero/browser/aboutSocialError.css                (../shared/aboutSocialError.css)
 *       skin/classic/aero/browser/aboutProviderDirectory.css          (../shared/aboutProviderDirectory.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/aero/browser/aboutSyncTabs.css
 #endif
         skin/classic/aero/browser/aboutTabCrashed.css
         skin/classic/aero/browser/aboutWelcomeBack.css               (../shared/aboutWelcomeBack.css)
         skin/classic/aero/browser/actionicon-tab.png
--- a/dom/indexedDB/test/browser_permissionsPromptAllow.js
+++ b/dom/indexedDB/test/browser_permissionsPromptAllow.js
@@ -6,18 +6,16 @@
 const testPageURL = "http://mochi.test:8888/browser/" +
   "dom/indexedDB/test/browser_permissionsPrompt.html";
 const notificationID = "indexedDB-permissions-prompt";
 
 function test()
 {
   waitForExplicitFinish();
 
-  PopupNotifications.transitionsEnabled = false;
-
   // We want a prompt.
   removePermission(testPageURL, "indexedDB");
   executeSoon(test1);
 }
 
 function test1()
 {
   info("creating tab");
@@ -67,17 +65,16 @@ function test2()
          "First database creation was successful");
       ok(!exception, "No exception");
       is(getPermission(testPageURL, "indexedDB"),
          Components.interfaces.nsIPermissionManager.ALLOW_ACTION,
          "Correct permission set");
       gBrowser.removeCurrentTab();
       unregisterAllPopupEventHandlers();
       removePermission(testPageURL, "indexedDB");
-      PopupNotifications.transitionsEnabled = true;
       executeSoon(finish);
     });
 
     registerPopupEventHandler("popupshowing", function () {
       ok(false, "Shouldn't show a popup this time");
     });
     registerPopupEventHandler("popupshown", function () {
       ok(false, "Shouldn't show a popup this time");
--- a/dom/indexedDB/test/browser_permissionsPromptDeny.js
+++ b/dom/indexedDB/test/browser_permissionsPromptDeny.js
@@ -6,17 +6,16 @@
 const testPageURL = "http://mochi.test:8888/browser/" +
   "dom/indexedDB/test/browser_permissionsPrompt.html";
 const notificationID = "indexedDB-permissions-prompt";
 
 function test()
 {
   waitForExplicitFinish();
   // We want the prompt.
-  PopupNotifications.transitionsEnabled = false;
   removePermission(testPageURL, "indexedDB");
   executeSoon(test1);
 }
 
 function test1()
 {
   info("creating tab");
   gBrowser.selectedTab = gBrowser.addTab();
@@ -64,17 +63,16 @@ function test2()
       ok(!result, "No database created");
       is(exception, "InvalidStateError", "Correct exception");
       is(getPermission(testPageURL, "indexedDB"),
          Components.interfaces.nsIPermissionManager.DENY_ACTION,
          "Correct permission set");
       gBrowser.selectedBrowser.docShell.QueryInterface(Ci.nsILoadContext).usePrivateBrowsing = false;
       unregisterAllPopupEventHandlers();
       gBrowser.removeCurrentTab();
-      PopupNotifications.transitionsEnabled = true;
       executeSoon(test3);
     });
 
     registerPopupEventHandler("popupshowing", function () {
       ok(false, "prompt showing");
     });
     registerPopupEventHandler("popupshown", function () {
       ok(false, "prompt shown");
--- a/dom/indexedDB/test/browser_quotaPromptAllow.js
+++ b/dom/indexedDB/test/browser_quotaPromptAllow.js
@@ -7,17 +7,16 @@
 const testPageURL = "http://bug704464-1.example.com/browser/" +
   "dom/indexedDB/test/browser_quotaPrompt.html";
 const notificationID = "indexedDB-quota-prompt";
 
 function test()
 {
   waitForExplicitFinish();
   requestLongerTimeout(10);
-  PopupNotifications.transitionsEnabled = false;
   setPermission(testPageURL, "indexedDB");
   removePermission(testPageURL, "indexedDB-unlimited");
   Services.prefs.setIntPref("dom.indexedDB.warningQuota", 2);
   executeSoon(test1);
 }
 
 let addMoreTest1Count = 0;
 
@@ -105,17 +104,16 @@ function test2()
             is(getPermission(testPageURL, "indexedDB-unlimited"),
                Components.interfaces.nsIPermissionManager.ALLOW_ACTION,
                "Correct permission set");
 
             gBrowser.removeCurrentTab();
             unregisterAllPopupEventHandlers();
             removePermission(testPageURL, "indexedDB");
             Services.prefs.clearUserPref("dom.indexedDB.warningQuota");
-            PopupNotifications.transitionsEnabled = true;
             executeSoon(finish);
           });
           executeSoon(function() { dispatchEvent("indexedDB-done"); });
         }
         else {
           ++addMoreCount;
           executeSoon(function() { dispatchEvent("indexedDB-addMore"); });
         }
--- a/dom/indexedDB/test/browser_quotaPromptDatabases.js
+++ b/dom/indexedDB/test/browser_quotaPromptDatabases.js
@@ -7,17 +7,16 @@
 const testPageURL = "http://bug704464-3.example.com/browser/" +
   "dom/indexedDB/test/browser_quotaPromptDatabases.html";
 const notificationID = "indexedDB-quota-prompt";
 
 function test()
 {
   waitForExplicitFinish();
   requestLongerTimeout(10);
-  PopupNotifications.transitionsEnabled = false;
   setPermission(testPageURL, "indexedDB");
   removePermission(testPageURL, "indexedDB-unlimited");
   Services.prefs.setIntPref("dom.indexedDB.warningQuota", 2);
   executeSoon(test1);
 }
 
 let addMoreTest1Count = 0;
 
@@ -40,17 +39,16 @@ function test1()
           setFinishedCallback(function(result) {
             is(result, "finished", "Got 'finished' result");
             is(getPermission(testPageURL, "indexedDB-unlimited"),
                Components.interfaces.nsIPermissionManager.ALLOW_ACTION,
                "Correct permission set");
             gBrowser.removeCurrentTab();
             unregisterAllPopupEventHandlers();
             addMoreTest1Count = seenPopupCount;
-            PopupNotifications.transitionsEnabled = true;
             executeSoon(finish);
           });
           executeSoon(function() { dispatchEvent("indexedDB-done"); });
         }
         else {
           ++addMoreTest1Count;
           executeSoon(function() { dispatchEvent("indexedDB-addMore"); });
         }
--- a/dom/indexedDB/test/browser_quotaPromptDelete.js
+++ b/dom/indexedDB/test/browser_quotaPromptDelete.js
@@ -7,17 +7,16 @@
 const testPageURL = "http://bug702292.example.com/browser/" +
   "dom/indexedDB/test/browser_quotaPromptDelete.html";
 const notificationID = "indexedDB-quota-prompt";
 
 function test()
 {
   waitForExplicitFinish();
   requestLongerTimeout(10);
-  PopupNotifications.transitionsEnabled = false;
   setPermission(testPageURL, "indexedDB");
   removePermission(testPageURL, "indexedDB-unlimited");
   Services.prefs.setIntPref("dom.indexedDB.warningQuota", 2);
   executeSoon(test1);
 }
 
 let addMoreTest1Count = 0;
 let haveReset = false;
@@ -51,17 +50,16 @@ function test1()
               } else {
                 setFinishedCallback(function(result) {
                   is(result, "finished", "Got 'finished' result");
                   is(getPermission(testPageURL, "indexedDB-unlimited"),
                      Components.interfaces.nsIPermissionManager.DENY_ACTION,
                      "Correct permission set");
                   gBrowser.removeCurrentTab();
                   unregisterAllPopupEventHandlers();
-                  PopupNotifications.transitionsEnabled = true;
                   executeSoon(finish);
                 });
                 executeSoon(function() { dispatchEvent("indexedDB-done"); });
               }
             }
 
             function secondTimeThroughAddMore() {
               setFinishedCallback(secondTimeThroughCallback);
--- a/dom/indexedDB/test/browser_quotaPromptDeny.js
+++ b/dom/indexedDB/test/browser_quotaPromptDeny.js
@@ -7,17 +7,16 @@
 const testPageURL = "http://bug704464-2.example.com/browser/" +
   "dom/indexedDB/test/browser_quotaPrompt.html";
 const notificationID = "indexedDB-quota-prompt";
 
 function test()
 {
   waitForExplicitFinish();
   requestLongerTimeout(10);
-  PopupNotifications.transitionsEnabled = false;
   setPermission(testPageURL, "indexedDB");
   removePermission(testPageURL, "indexedDB-unlimited");
   Services.prefs.setIntPref("dom.indexedDB.warningQuota", 2);
   executeSoon(test1);
 }
 
 let addMoreTest1Count = 0;
 
@@ -45,17 +44,16 @@ function test1()
           setFinishedCallback(function(result) {
             is(result, "finished", "Got 'finished' result");
             is(getPermission(testPageURL, "indexedDB-unlimited"),
                Components.interfaces.nsIPermissionManager.DENY_ACTION,
                "Correct permission set");
             gBrowser.removeCurrentTab();
             unregisterAllPopupEventHandlers();
             addMoreTest1Count = seenPopupCount;
-            PopupNotifications.transitionsEnabled = true;
             executeSoon(test2);
           });
           executeSoon(function() { dispatchEvent("indexedDB-done"); });
         }
         else {
           ++addMoreTest1Count;
           executeSoon(function() { dispatchEvent("indexedDB-addMore"); });
         }
--- a/toolkit/devtools/server/actors/animation.js
+++ b/toolkit/devtools/server/actors/animation.js
@@ -22,19 +22,18 @@
  *   http://w3c.github.io/web-animations/
  * - WebAnimation WebIDL files:
  *   /dom/webidl/Animation*.webidl
  */
 
 const {Cu} = require("chrome");
 const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
 const {setInterval, clearInterval} = require("sdk/timers");
-const {ActorClass, Actor,
-       FrontClass, Front,
-       Arg, method, RetVal} = require("devtools/server/protocol");
+const protocol = require("devtools/server/protocol");
+const {ActorClass, Actor, FrontClass, Front, Arg, method, RetVal} = protocol;
 const {NodeActor} = require("devtools/server/actors/inspector");
 const EventEmitter = require("devtools/toolkit/event-emitter");
 
 const PLAYER_DEFAULT_AUTO_REFRESH_TIMEOUT = 500; // ms
 
 /**
  * The AnimationPlayerActor provides information about a given animation: its
  * startTime, currentTime, current state, etc.
@@ -52,21 +51,22 @@ let AnimationPlayerActor = ActorClass({
    * @param {AnimationPlayer} The player object returned by getAnimationPlayers
    * @param {DOMNode} The node targeted by this player
    * @param {Number} Temporary work-around used to retrieve duration and
    * iteration count from computed-style rather than from waapi. This is needed
    * to know which duration to get, in case there are multiple css animations
    * applied to the same node.
    */
   initialize: function(animationsActor, player, node, playerIndex) {
+    Actor.prototype.initialize.call(this, animationsActor.conn);
+
     this.player = player;
     this.node = node;
     this.playerIndex = playerIndex;
     this.styles = node.ownerDocument.defaultView.getComputedStyle(node);
-    Actor.prototype.initialize.call(this, animationsActor.conn);
   },
 
   destroy: function() {
     this.player = this.node = this.styles = null;
     Actor.prototype.destroy.call(this);
   },
 
   /**
@@ -170,23 +170,42 @@ let AnimationPlayerActor = ActorClass({
     this.player.pause();
   }, {
     request: {},
     response: {}
   }),
 
   /**
    * Play the player.
+   * This method only returns when the animation has left its pending state.
    */
   play: method(function() {
     this.player.play();
     return this.player.ready;
   }, {
     request: {},
     response: {}
+  }),
+
+  /**
+   * Simply exposes the player ready promise.
+   *
+   * When an animation is created/paused then played, there's a short time
+   * during which its playState is pending, before being set to running.
+   *
+   * If you either created a new animation using the Web Animations API or
+   * paused/played an existing one, and then want to access the playState, you
+   * might be interested to call this method.
+   * This is especially important for tests.
+   */
+  ready: method(function() {
+    return this.player.ready;
+  }, {
+    request: {},
+    response: {}
   })
 });
 
 let AnimationPlayerFront = FrontClass(AnimationPlayerActor, {
   AUTO_REFRESH_EVENT: "updated-state",
 
   initialize: function(conn, form, detail, ctx) {
     EventEmitter.decorate(this);
--- a/toolkit/devtools/server/tests/browser/browser.ini
+++ b/toolkit/devtools/server/tests/browser/browser.ini
@@ -10,25 +10,20 @@ support-files =
   storage-listings.html
   storage-unsecured-iframe.html
   storage-updates.html
   storage-secured-iframe.html
   timeline-iframe-child.html
   timeline-iframe-parent.html
 
 [browser_animation_actors_01.js]
-skip-if = true # Bug 1114780 - Enable when the Web Animations API is pref'd on.
 [browser_animation_actors_02.js]
-skip-if = true # Bug 1114780 - Enable when the Web Animations API is pref'd on.
 [browser_animation_actors_03.js]
-skip-if = true # Bug 1114780 - Enable when the Web Animations API is pref'd on.
 [browser_animation_actors_04.js]
-skip-if = true # Bug 1114780 - Enable when the Web Animations API is pref'd on.
 [browser_animation_actors_05.js]
-skip-if = true # Bug 1114780 - Enable when the Web Animations API is pref'd on.
 [browser_navigateEvents.js]
 [browser_storage_dynamic_windows.js]
 [browser_storage_listings.js]
 [browser_storage_updates.js]
 [browser_timeline.js]
 skip-if = buildapp == 'mulet'
 [browser_timeline_actors.js]
 skip-if = buildapp == 'mulet'
--- a/toolkit/devtools/server/tests/browser/browser_animation_actors_04.js
+++ b/toolkit/devtools/server/tests/browser/browser_animation_actors_04.js
@@ -33,26 +33,26 @@ function* playStateIsUpdatedDynamically(
   // using the CPOW.
   let cpow = content.document.querySelector(".short-animation");
   cpow.classList.remove("short-animation");
   let reflow = cpow.offsetWidth;
   cpow.classList.add("short-animation");
 
   let [player] = yield front.getAnimationPlayersForNode(node);
 
-  // Bug 1113091 - We should wait for the player to become ready then
-  // test for the "running" state only
-  ok(player.initialState.playState == "running" ||
-     player.initialState.playState == "pending",
-    "The playState is running or pending while the transition is running");
+  yield player.ready();
+  let state = yield player.getCurrentState();
+
+  is(state.playState, "running",
+    "The playState is running while the transition is running");
 
   info("Wait until the animation stops (more than 1000ms)");
   yield wait(1500); // Waiting 1.5sec for good measure
 
-  let state = yield player.getCurrentState();
+  state = yield player.getCurrentState();
   is(state.playState, "finished",
     "The animation has ended and the state has been updated");
   ok(state.currentTime > player.initialState.currentTime,
     "The currentTime has been updated");
 }
 
 function wait(ms) {
   return new Promise(resolve => {