Merge inbound to central, a=merge CLOSED TREE
authorWes Kocher <wkocher@mozilla.com>
Tue, 08 Sep 2015 17:04:03 -0700
changeset 261366 01ae99b53561a2c3b40533d8c1c92bd3efc42d00
parent 261353 02b255caee93ac6fdfb2384ec90d748ab112ef27 (current diff)
parent 261365 25f77883ec8af2689bde656a0366434ef7c62a0d (diff)
child 261369 111807dd6e8494adc8f0d46836e26ebb6ab1bc16
child 261386 4148547a8d54935462d985eff6b4f544a13e884e
child 261450 5686d29038b2eaf9786fb38d7d2ff95865c904e6
push id29342
push userkwierso@gmail.com
push dateWed, 09 Sep 2015 00:04:09 +0000
treeherdermozilla-central@01ae99b53561 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone43.0a1
first release with
nightly linux32
01ae99b53561 / 43.0a1 / 20150909030223 / files
nightly linux64
01ae99b53561 / 43.0a1 / 20150909030223 / files
nightly mac
01ae99b53561 / 43.0a1 / 20150909030223 / files
nightly win32
01ae99b53561 / 43.0a1 / 20150909030223 / files
nightly win64
01ae99b53561 / 43.0a1 / 20150909030223 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to central, a=merge CLOSED TREE
dom/mobileconnection/tests/marionette/manifest.ini
--- a/build/macosx/universal/flight.mk
+++ b/build/macosx/universal/flight.mk
@@ -24,34 +24,8 @@ DIST = $(OBJDIR)/dist
 postflight_all:
 	mkdir -p $(DIST_UNI)/$(MOZ_PKG_APPNAME)
 	rm -f $(DIST_ARCH_2)/universal
 	ln -s $(abspath $(DIST_UNI)) $(DIST_ARCH_2)/universal
 # Stage a package for buildsymbols to be happy. Doing so in OBJDIR_ARCH_1
 # actually does a universal staging with both OBJDIR_ARCH_1 and OBJDIR_ARCH_2.
 	$(MAKE) -C $(OBJDIR_ARCH_1)/$(MOZ_BUILD_APP)/installer \
 	   PKG_SKIP_STRIP=1 stage-package
-ifdef ENABLE_TESTS
-# Now, repeat the process for the test package.
-	$(MAKE) -C $(OBJDIR_ARCH_1) UNIVERSAL_BINARY= CHROME_JAR= package-tests
-	$(MAKE) -C $(OBJDIR_ARCH_2) UNIVERSAL_BINARY= CHROME_JAR= package-tests
-	rm -rf $(DIST_UNI)/test-stage
-# automation.py differs because it hardcodes a path to
-# dist/bin. It doesn't matter which one we use.
-	if test -d $(DIST_ARCH_1)/test-stage -a                 \
-                -d $(DIST_ARCH_2)/test-stage; then              \
-           cp $(DIST_ARCH_1)/test-stage/mochitest/automation.py \
-             $(DIST_ARCH_2)/test-stage/mochitest/;              \
-           cp -RL $(DIST_ARCH_1)/test-stage/mochitest/extensions/specialpowers \
-             $(DIST_ARCH_2)/test-stage/mochitest/extensions/;              \
-           cp $(DIST_ARCH_1)/test-stage/xpcshell/automation.py  \
-             $(DIST_ARCH_2)/test-stage/xpcshell/;               \
-           cp $(DIST_ARCH_1)/test-stage/reftest/automation.py   \
-             $(DIST_ARCH_2)/test-stage/reftest/;                \
-           cp -RL $(DIST_ARCH_1)/test-stage/reftest/specialpowers \
-             $(DIST_ARCH_2)/test-stage/reftest/;              \
-           $(TOPSRCDIR)/build/macosx/universal/unify                 \
-             --unify-with-sort "\.manifest$$" \
-             --unify-with-sort "all-test-dirs\.list$$"               \
-             $(DIST_ARCH_1)/test-stage                          \
-             $(DIST_ARCH_2)/test-stage                          \
-             $(DIST_UNI)/test-stage; fi
-endif
--- a/build/macosx/universal/mozconfig
+++ b/build/macosx/universal/mozconfig
@@ -1,11 +1,11 @@
 # 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/.
 
 # i386/x86-64 Universal Build mozconfig
 
 # As used here, arguments in $MOZ_BUILD_PROJECTS are suitable as arguments
 # to gcc's -arch parameter.
-mk_add_options MOZ_BUILD_PROJECTS="i386 x86_64"
+mk_add_options MOZ_BUILD_PROJECTS="x86_64 i386"
 
 . $topsrcdir/build/macosx/universal/mozconfig.common
--- a/dom/media/webm/IntelWebMVideoDecoder.cpp
+++ b/dom/media/webm/IntelWebMVideoDecoder.cpp
@@ -361,17 +361,17 @@ IntelWebMVideoDecoder::PopSample()
       MOZ_ASSERT(!sample);
       return nullptr;
     }
     MOZ_ASSERT(sample);
     mSampleQueue.push_back(sample.forget());
   }
 
   MOZ_ASSERT(!mSampleQueue.empty());
-  sample = mSampleQueue.front();
+  sample = mSampleQueue.front().forget();
   mSampleQueue.pop_front();
   return sample.forget();
 }
 
 void
 IntelWebMVideoDecoder::Output(MediaData* aSample)
 {
 #ifdef LOG_SAMPLE_DECODE
--- a/dom/media/webm/NesteggPacketHolder.h
+++ b/dom/media/webm/NesteggPacketHolder.h
@@ -84,17 +84,17 @@ class WebMPacketQueue {
     mQueue.push_back(aItem);
   }
 
   void PushFront(NesteggPacketHolder* aItem) {
     mQueue.push_front(Move(aItem));
   }
 
   already_AddRefed<NesteggPacketHolder> PopFront() {
-    nsRefPtr<NesteggPacketHolder> result = mQueue.front();
+    nsRefPtr<NesteggPacketHolder> result = mQueue.front().forget();
     mQueue.pop_front();
     return result.forget();
   }
 
   void Reset() {
     while (!mQueue.empty()) {
       mQueue.pop_front();
     }
--- a/dom/media/webm/WebMDemuxer.h
+++ b/dom/media/webm/WebMDemuxer.h
@@ -28,17 +28,17 @@ class MediaRawDataQueue {
     mQueue.push_back(aItem);
   }
 
   void PushFront(MediaRawData* aItem) {
     mQueue.push_front(aItem);
   }
 
   already_AddRefed<MediaRawData> PopFront() {
-    nsRefPtr<MediaRawData> result = mQueue.front();
+    nsRefPtr<MediaRawData> result = mQueue.front().forget();
     mQueue.pop_front();
     return result.forget();
   }
 
   void Reset() {
     while (!mQueue.empty()) {
       mQueue.pop_front();
     }
--- a/dom/mobileconnection/tests/marionette/manifest.ini
+++ b/dom/mobileconnection/tests/marionette/manifest.ini
@@ -31,8 +31,9 @@ qemu = true
 [test_mobile_call_forwarding_set_error.js]
 [test_mobile_call_forwarding_get_error.js]
 [test_mobile_voice_privacy.js]
 [test_dsds_mobile_data_connection.js]
 [test_mobile_clir.js]
 [test_mobile_clir_radio_off.js]
 [test_mobile_neighboring_cell_ids.js]
 [test_mobile_cell_Info_list.js]
+skip-if = android_version < '19'
--- a/dom/mobileconnection/tests/marionette/test_mobile_cell_Info_list.js
+++ b/dom/mobileconnection/tests/marionette/test_mobile_cell_Info_list.js
@@ -1,40 +1,25 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 MARIONETTE_TIMEOUT = 60000;
 MARIONETTE_HEAD_JS = "head_chrome.js";
 
-function getAndroidVersion() {
-  return runEmulatorShellCmdSafe(["getprop", "ro.build.version.sdk"])
-    .then(aResults => aResults[0]);
-}
-
 // Start test.
 startTestBase(function() {
-  return getAndroidVersion().
-    then((aVersion) => {
-      if (aVersion < "19") {
-        // Only emulator-kk supports REQUEST_GET_CELL_INFO_LIST, so we skip this
-        // test if in older android version.
-        log("Skip test: AndroidVersion: " + aVersion);
-        return;
-      }
+    return getCellInfoList()
+      .then((aResults) => {
+        // Cell Info are hard-coded in hardware/ril/reference-ril/reference-ril.c.
+        is(aResults.length, 1, "Check number of cell Info");
 
-      return getCellInfoList()
-        .then((aResults) => {
-          // Cell Info are hard-coded in hardware/ril/reference-ril/reference-ril.c.
-          is(aResults.length, 1, "Check number of cell Info");
+        let cell = aResults[0];
+        is(cell.type, Ci.nsICellInfo.CELL_INFO_TYPE_GSM, "Check cell.type");
+        is(cell.registered, true, "Check cell.registered");
 
-          let cell = aResults[0];
-          is(cell.type, Ci.nsICellInfo.CELL_INFO_TYPE_GSM, "Check cell.type");
-          is(cell.registered, true, "Check cell.registered");
-
-          ok(cell instanceof Ci.nsIGsmCellInfo,
-             "cell.constructor is " + cell.constructor);
+        ok(cell instanceof Ci.nsIGsmCellInfo,
+           "cell.constructor is " + cell.constructor);
 
-          // The data hard-coded in hardware/ril/reference-ril/reference-ril.c
-          // isn't correct (missing timeStampType), so we skip to check other
-          // attributes first until we fix it.
-        });
-    });
-});
+        // The data hard-coded in hardware/ril/reference-ril/reference-ril.c
+        // isn't correct (missing timeStampType), so we skip to check other
+        // attributes first until we fix it.
+      });
+});
\ No newline at end of file
--- a/ipc/glue/GeckoChildProcessHost.cpp
+++ b/ipc/glue/GeckoChildProcessHost.cpp
@@ -978,16 +978,24 @@ GeckoChildProcessHost::PerformAsyncLaunc
     mSandboxBroker.LaunchApp(cmdLine.program().c_str(),
                              cmdLine.command_line_string().c_str(),
                              mEnableSandboxLogging,
                              &process);
   } else
 #endif
   {
     base::LaunchApp(cmdLine, false, false, &process);
+
+    // We need to be able to duplicate handles to non-sandboxed content
+    // processes, so add it as a target peer.
+    if (mProcessType == GeckoProcessType_Content) {
+      if (!mSandboxBroker.AddTargetPeer(process)) {
+        NS_WARNING("Failed to add content process as target peer.");
+      }
+    }
   }
 
 #else
 #  error Sorry
 #endif
 
   if (!process) {
     MonitorAutoLock lock(mMonitor);
--- a/media/mtransport/nriceresolver.cpp
+++ b/media/mtransport/nriceresolver.cpp
@@ -149,17 +149,17 @@ int NrIceResolver::resolve(nr_resolver_r
   int _status;
   MOZ_ASSERT(allocated_resolvers_ > 0);
   ASSERT_ON_THREAD(sts_thread_);
   nsRefPtr<PendingResolution> pr;
   uint32_t resolve_flags = 0;
 
   if (resource->transport_protocol != IPPROTO_UDP &&
       resource->transport_protocol != IPPROTO_TCP) {
-    MOZ_MTLOG(ML_ERROR, "Only UDP and TCP are is supported.");
+    MOZ_MTLOG(ML_ERROR, "Only UDP and TCP are supported.");
     ABORT(R_NOT_FOUND);
   }
   pr = new PendingResolution(sts_thread_,
                              resource->port? resource->port : 3478,
                              resource->transport_protocol ?
                              resource->transport_protocol :
                              IPPROTO_UDP,
                              cb, cb_arg);
--- a/media/mtransport/nriceresolver.h
+++ b/media/mtransport/nriceresolver.h
@@ -66,29 +66,29 @@ class NrIceResolver
  public:
   NrIceResolver();
 
   nsresult Init();
   nr_resolver *AllocateResolver();
   void DestroyResolver();
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceResolver)
 
+  int resolve(nr_resolver_resource *resource,
+              int (*cb)(void *cb_arg, nr_transport_addr *addr),
+              void *cb_arg, void **handle);
+
  private:
   // Implementations of vtbl functions
   static int destroy(void **objp);
   static int resolve(void *obj, nr_resolver_resource *resource,
                      int (*cb)(void *cb_arg, nr_transport_addr *addr),
                      void *cb_arg, void **handle);
   static void resolve_cb(NR_SOCKET s, int how, void *cb_arg);
   static int cancel(void *obj, void *handle);
 
-  int resolve(nr_resolver_resource *resource,
-              int (*cb)(void *cb_arg, nr_transport_addr *addr),
-              void *cb_arg, void **handle);
-
   class PendingResolution : public nsIDNSListener
   {
    public:
     PendingResolution(nsIEventTarget *thread,
                       uint16_t port,
                       int transport,
                       int (*cb)(void *cb_arg, nr_transport_addr *addr),
                       void *cb_arg) :
--- a/media/mtransport/test/ice_unittest.cpp
+++ b/media/mtransport/test/ice_unittest.cpp
@@ -45,44 +45,44 @@
 #include "mozilla/net/DNS.h"
 
 #include "ice_ctx.h"
 #include "ice_peer_ctx.h"
 #include "ice_media_stream.h"
 
 extern "C" {
 #include "r_data.h"
+#include "util.h"
 }
 
 #define GTEST_HAS_RTTI 0
 #include "gtest/gtest.h"
 #include "gtest_utils.h"
 
 using namespace mozilla;
 MtransportTestUtils *test_utils;
 
 bool stream_added = false;
 
 static unsigned int kDefaultTimeout = 7000;
 
 //TODO(nils@mozilla.com): This should get replaced with some non-external
 //solution like discussed in bug 860775.
-const std::string kDefaultStunServerAddress((char *)"52.27.56.60");
 const std::string kDefaultStunServerHostname(
     (char *)"global.stun.twilio.com");
 const std::string kBogusStunServerHostname(
     (char *)"stun-server-nonexistent.invalid");
 const uint16_t kDefaultStunServerPort=3478;
 const std::string kBogusIceCandidate(
     (char *)"candidate:0 2 UDP 2113601790 192.168.178.20 50769 typ");
 
 const std::string kUnreachableHostIceCandidate(
     (char *)"candidate:0 1 UDP 2113601790 192.168.178.20 50769 typ host");
 
-std::string g_stun_server_address(kDefaultStunServerAddress);
+std::string g_stun_server_address;
 std::string g_stun_server_hostname(kDefaultStunServerHostname);
 std::string g_turn_server;
 std::string g_turn_user;
 std::string g_turn_password;
 
 namespace {
 
 enum TrickleMode { TRICKLE_NONE, TRICKLE_SIMULATE, TRICKLE_REAL };
@@ -3055,27 +3055,70 @@ static std::string get_environment(const
   char *value = getenv(name);
 
   if (!value)
     return "";
 
   return value;
 }
 
+// DNS resolution helper code
+static std::string
+Resolve(const std::string& fqdn, int address_family)
+{
+  struct addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = address_family;
+  hints.ai_protocol = IPPROTO_UDP;
+  struct addrinfo *res;
+  int err = getaddrinfo(fqdn.c_str(), nullptr, &hints, &res);
+  if (err) {
+    std::cerr << "Error in getaddrinfo: " << err << std::endl;
+    return "";
+  }
+
+  char str_addr[64] = {0};
+  switch (res->ai_family) {
+    case AF_INET:
+      inet_ntop(
+          AF_INET,
+          &reinterpret_cast<struct sockaddr_in*>(res->ai_addr)->sin_addr,
+          str_addr,
+          sizeof(str_addr));
+    case AF_INET6:
+      inet_ntop(
+          AF_INET6,
+          &reinterpret_cast<struct sockaddr_in6*>(res->ai_addr)->sin6_addr,
+          str_addr,
+          sizeof(str_addr));
+    default:
+      std::cerr << "Got unexpected address family in DNS lookup: "
+                << res->ai_family << std::endl;
+      return "";
+  }
+
+  if (!strlen(str_addr)) {
+    std::cerr << "inet_ntop failed" << std::endl;
+  }
+
+  return str_addr;
+}
+
 int main(int argc, char **argv)
 {
 #ifdef ANDROID
   // This test can cause intermittent oranges on the builders on Linux
   CHECK_ENVIRONMENT_FLAG("MOZ_WEBRTC_TESTS")
 #endif
 
   g_turn_server = get_environment("TURN_SERVER_ADDRESS");
   g_turn_user = get_environment("TURN_SERVER_USER");
   g_turn_password = get_environment("TURN_SERVER_PASSWORD");
 
+
   if (g_turn_server.empty() ||
       g_turn_user.empty(),
       g_turn_password.empty()) {
     printf(
         "Set TURN_SERVER_ADDRESS, TURN_SERVER_USER, and TURN_SERVER_PASSWORD\n"
         "environment variables to run this test\n");
     g_turn_server="";
   }
@@ -3099,16 +3142,22 @@ int main(int argc, char **argv)
     g_stun_server_hostname = "";
     g_turn_server = "";
   }
 
   test_utils = new MtransportTestUtils();
   NSS_NoDB_Init(nullptr);
   NSS_SetDomesticPolicy();
 
+  // If only a STUN server FQDN was provided, look up its IP address for the
+  // address-only tests.
+  if (g_stun_server_address.empty() && !g_stun_server_hostname.empty()) {
+    g_stun_server_address = Resolve(g_stun_server_hostname, AF_INET);
+  }
+
   // Start the tests
   ::testing::InitGoogleTest(&argc, argv);
 
   ::testing::TestEventListeners& listeners =
         ::testing::UnitTest::GetInstance()->listeners();
   // Adds a listener to the end.  Google Test takes the ownership.
 
   listeners.Append(new test::RingbufferDumper(test_utils));
--- a/media/mtransport/third_party/nICEr/src/net/nr_resolver.h
+++ b/media/mtransport/third_party/nICEr/src/net/nr_resolver.h
@@ -37,17 +37,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 #define _nr_resolver_h
 
 #include "transport_addr.h"
 
 #define NR_RESOLVE_PROTOCOL_STUN 1
 #define NR_RESOLVE_PROTOCOL_TURN 2
 
 typedef struct nr_resolver_resource_ {
-  char *domain_name;
+  const char *domain_name;
   UINT2 port;
   int stun_turn;
   UCHAR transport_protocol;
   UCHAR address_family;
 } nr_resolver_resource;
 
 typedef struct nr_resolver_vtbl_ {
   int (*destroy)(void **obj);
--- a/modules/zlib/src/inflate.c
+++ b/modules/zlib/src/inflate.c
@@ -1499,14 +1499,15 @@ int subvert;
 #endif
 }
 
 long ZEXPORT inflateMark(strm)
 z_streamp strm;
 {
     struct inflate_state FAR *state;
 
-    if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
+    if (strm == Z_NULL || strm->state == Z_NULL)
+        return (long)(((unsigned long)0 - 1) << 16);
     state = (struct inflate_state FAR *)strm->state;
-    return ((long)(state->back) << 16) +
+    return (long)(((unsigned long)((long)state->back)) << 16) +
         (state->mode == COPY ? state->length :
             (state->mode == MATCH ? state->was - state->length : 0));
 }
--- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
+++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
@@ -434,16 +434,23 @@ SandboxBroker::AllowDirectory(wchar_t co
 {
   auto result =
     mPolicy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
                      sandbox::TargetPolicy::FILES_ALLOW_DIR_ANY,
                      dir);
   return (sandbox::SBOX_ALL_OK == result);
 }
 
+bool
+SandboxBroker::AddTargetPeer(HANDLE aPeerProcess)
+{
+  sandbox::ResultCode result = sBrokerService->AddTargetPeer(aPeerProcess);
+  return (sandbox::SBOX_ALL_OK == result);
+}
+
 SandboxBroker::~SandboxBroker()
 {
   if (mPolicy) {
     mPolicy->Release();
     mPolicy = nullptr;
   }
 }
 
--- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.h
+++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.h
@@ -9,16 +9,17 @@
 
 #ifdef SANDBOX_EXPORTS
 #define SANDBOX_EXPORT __declspec(dllexport)
 #else
 #define SANDBOX_EXPORT __declspec(dllimport)
 #endif
 
 #include <stdint.h>
+#include <windows.h>
 
 namespace sandbox {
   class BrokerServices;
   class TargetPolicy;
 }
 
 namespace mozilla {
 
@@ -40,16 +41,19 @@ public:
   bool SetSecurityLevelForIPDLUnitTestProcess();
   bool SetSecurityLevelForGMPlugin();
 
   // File system permissions
   bool AllowReadFile(wchar_t const *file);
   bool AllowReadWriteFile(wchar_t const *file);
   bool AllowDirectory(wchar_t const *dir);
 
+  // Exposes AddTargetPeer from broker services, so that none sandboxed
+  // processes can be added as handle duplication targets.
+  bool AddTargetPeer(HANDLE aPeerProcess);
 private:
   static sandbox::BrokerServices *sBrokerService;
   sandbox::TargetPolicy *mPolicy;
 };
 
 } // mozilla
 
 #endif
--- a/testing/docker/desktop-build/REGISTRY
+++ b/testing/docker/desktop-build/REGISTRY
@@ -1,1 +1,1 @@
-quay.io/djmitche
+taskcluster
--- a/testing/docker/desktop-build/VERSION
+++ b/testing/docker/desktop-build/VERSION
@@ -1,1 +1,1 @@
-0.1.1
+0.1.2
--- a/testing/docker/desktop-build/bin/checkout-sources.sh
+++ b/testing/docker/desktop-build/bin/checkout-sources.sh
@@ -20,20 +20,16 @@ set -x -e
 
 : TOOLS_REPOSITORY              ${TOOLS_REPOSITORY:=https://hg.mozilla.org/build/tools}
 : TOOLS_BASE_REPOSITORY         ${TOOLS_BASE_REPOSITORY:=${TOOLS_REPOSITORY}}
 : TOOLS_HEAD_REPOSITORY         ${TOOLS_HEAD_REPOSITORY:=${TOOLS_REPOSITORY}}
 : TOOLS_HEAD_REV                ${TOOLS_HEAD_REV:=default}
 : TOOLS_HEAD_REF                ${TOOLS_HEAD_REF:=${TOOLS_HEAD_REV}}
 : TOOLS_DISABLE                 ${TOOLS_DISABLE:=false}
 
-: MH_CUSTOM_BUILD_VARIANT_CFG   ${MH_CUSTOM_BUILD_VARIANT_CFG}
-: MH_BRANCH                     ${MH_BRANCH:=mozilla-central}
-: MH_BUILD_POOL                 ${MH_BUILD_POOL:=staging}
-
 : WORKSPACE                     ${WORKSPACE:=/home/worker/workspace}
 
 set -v
 
 # check out tools where mozharness expects it to be ($PWD/build/tools and $WORKSPACE/build/tools)
 if [ ! "$TOOLS_DISABLE" = true ]
 then
     tc-vcs checkout $WORKSPACE/build/tools $TOOLS_BASE_REPOSITORY $TOOLS_HEAD_REPOSITORY $TOOLS_HEAD_REV $TOOLS_HEAD_REF
--- a/testing/marionette/client/marionette/runner/base.py
+++ b/testing/marionette/client/marionette/runner/base.py
@@ -738,16 +738,27 @@ setReq.onerror = function() {
                 self.logger.info("starting httpd")
                 self.start_httpd(need_external_ip)
                 self.marionette.baseurl = self.httpd.get_url()
                 self.logger.info("running httpd on %s" % self.marionette.baseurl)
             else:
                 self.marionette.baseurl = self.server_root
                 self.logger.info("using remote content from %s" % self.marionette.baseurl)
 
+        device_info = None
+        if self.capabilities['device'] != 'desktop' and self.capabilities['browserName'] == 'B2G':
+            dm = get_dm(self.marionette)
+            device_info = dm.getInfo()
+            # Add Android version (SDK level) to mozinfo so that manifest entries
+            # can be conditional on android_version.
+            androidVersion = dm.shellCheckOutput(['getprop', 'ro.build.version.sdk'])
+            self.logger.info(
+                "Android sdk version '%s'; will use this to filter manifests" % androidVersion)
+            mozinfo.info['android_version'] = androidVersion
+
         for test in tests:
             self.add_test(test)
 
         # ensure we have only tests files with names starting with 'test_'
         invalid_tests = \
             [t['filepath'] for t in self.tests
              if not os.path.basename(t['filepath']).startswith('test_')]
         if invalid_tests:
@@ -757,21 +768,16 @@ setReq.onerror = function() {
 
         version_info = mozversion.get_version(binary=self.bin,
                                               sources=self.sources,
                                               dm_type=os.environ.get('DM_TRANS', 'adb'),
                                               device_serial=self.device_serial,
                                               adb_host=self.marionette.adb_host,
                                               adb_port=self.marionette.adb_port)
 
-        device_info = None
-        if self.capabilities['device'] != 'desktop' and self.capabilities['browserName'] == 'B2G':
-            dm = get_dm(self.marionette)
-            device_info = dm.getInfo()
-
         self.logger.suite_start(self.tests,
                                 version_info=version_info,
                                 device_info=device_info)
 
         for test in self.manifest_skipped_tests:
             name = os.path.basename(test['path'])
             self.logger.test_start(name)
             self.logger.test_end(name,
@@ -980,16 +986,18 @@ setReq.onerror = function() {
                 self.failed += len(results.unexpectedSuccesses)
                 self.unexpected_successes += len(results.unexpectedSuccesses)
                 for failure in results.unexpectedSuccesses:
                     self.failures.append((results.getInfo(failure), failure.output, 'TEST-UNEXPECTED-PASS'))
             if hasattr(results, 'expectedFailures'):
                 self.todo += len(results.expectedFailures)
 
             self.mixin_run_tests = []
+            for result in self.results:
+                result.result_modifiers = []
 
     def run_test_set(self, tests):
         if self.shuffle:
             random.seed(self.shuffle_seed)
             random.shuffle(tests)
 
         for test in tests:
             self.run_test(test['filepath'], test['expected'], test['test_container'])
--- a/testing/mozharness/configs/builds/releng_base_mac_64_builds.py
+++ b/testing/mozharness/configs/builds/releng_base_mac_64_builds.py
@@ -27,17 +27,17 @@ config = {
     },
     'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
     # decides whether we want to use moz_sign_cmd in env
     'enable_signing': True,
     'purge_skip': ['info', 'rel-*:10d', 'tb-rel-*:10d'],
     'purge_basedirs':  [],
     'enable_ccache': True,
     'vcs_share_base': '/builds/hg-shared',
-    'objdir': 'obj-firefox/i386',
+    'objdir': 'obj-firefox/x86_64',
     'tooltool_script': ["/builds/tooltool.py"],
     'tooltool_bootstrap': "setup.sh",
     'enable_count_ctors': False,
     'enable_talos_sendchange': True,
     'enable_unittest_sendchange': True,
     #########################################################################
 
 
--- a/testing/taskcluster/tasks/branches/try/job_flags.yml
+++ b/testing/taskcluster/tasks/branches/try/job_flags.yml
@@ -129,19 +129,19 @@ builds:
     types:
       opt:
         task: tasks/builds/android_api_11.yml
   linux64:
     platforms:
       - Linux64
     types:
       opt:
-        task: tasks/builds/opt_linux64.yml
+        task: tasks/builds/opt_linux64_clobber.yml
       debug:
-        task: tasks/builds/dbg_linux64.yml
+        task: tasks/builds/dbg_linux64_clobber.yml
   sm-plain:
     platforms:
       - Linux64
     types:
       opt:
         task: tasks/builds/sm_plain.yml
       debug:
        task: tasks/builds/sm_plaindebug.yml
--- a/testing/taskcluster/tasks/builds/dbg_linux64.yml
+++ b/testing/taskcluster/tasks/builds/dbg_linux64.yml
@@ -1,22 +1,10 @@
 $inherits:
-  from: 'tasks/builds/opt_linux64.yml'
-  variables:
-    build_name: 'linux64'
-    build_type: 'dbg'
+  from: 'tasks/builds/dbg_linux64_clobber.yml'
 task:
-  metadata:
-      name: '[TC] Linux64 Dbg'
-      description: 'Linux64 Dbg'
-
-  workerType: dbg-linux64
+  # same as clobber, but with a cached workspace
+  scopes:
+    - 'docker-worker:cache:build-linux64-c6-workspace'
 
   payload:
-    env:
-      MH_CUSTOM_BUILD_VARIANT_CFG: 'debug'
-  extra:
-    treeherder:
-      groupSymbol: tc
-      groupName: Submitted by taskcluster
-      symbol: B
-      collection:
-        debug: true
+    cache:
+      build-linux64-c6-workspace: '/home/worker/workspace'
new file mode 100644
--- /dev/null
+++ b/testing/taskcluster/tasks/builds/dbg_linux64_clobber.yml
@@ -0,0 +1,24 @@
+$inherits:
+  from: 'tasks/builds/linux64_clobber.yml'
+  variables:
+    build_name: 'linux64'
+    build_type: 'dbg'
+task:
+  metadata:
+      name: '[TC] Linux64 Dbg'
+      description: 'Linux64 Dbg'
+
+  workerType: dbg-linux64
+
+  payload:
+    env:
+      MH_CUSTOM_BUILD_VARIANT_CFG: 'debug'
+
+  extra:
+    treeherder:
+      groupSymbol: tc
+      groupName: Submitted by taskcluster
+      symbol: B
+      collection:
+        debug: true
+
new file mode 100644
--- /dev/null
+++ b/testing/taskcluster/tasks/builds/linux64_clobber.yml
@@ -0,0 +1,53 @@
+$inherits:
+  from: 'tasks/builds/firefox_base.yml'
+  variables:
+    build_name: 'linux64'
+task:
+  #workerType: ..
+
+  routes:
+    - 'index.buildbot.branches.{{project}}.linux64'
+    - 'index.buildbot.revisions.{{head_rev}}.{{project}}.linux64'
+
+  scopes:
+    - 'docker-worker:cache:tooltool-cache'
+    - 'docker-worker:relengapi-proxy:tooltool.download.public'
+
+  payload:
+    image: '{{#docker_image}}desktop-build{{/docker_image}}'
+    cache:
+      # "clobber" means no workspace cache; non-clobber subclasses should add that
+      tooltool-cache: '/home/worker/tooltool-cache'
+
+    features:
+      relengAPIProxy: true
+
+    env:
+      MOZHARNESS_SCRIPT: 'mozharness/scripts/fx_desktop_build.py'
+      MOZHARNESS_CONFIG: 'builds/releng_base_linux_64_builds.py balrog/production.py'
+      MH_BRANCH: {{project}}
+      MH_BUILD_POOL: taskcluster
+      # image paths
+      TOOLTOOL_CACHE: '/home/worker/tooltool-cache'
+      NEED_XVFB: true
+      DIST_UPLOADS: 'jsshell-linux-x86_64.zip'
+      DIST_TARGET_UPLOADS: 'x-test.linux-x86_64.tar.bz2 linux-x86_64.tar.bz2 linux-x86_64.json tests.zip crashreporter-symbols.zip'
+
+    maxRunTime: 36000
+
+    command: ["/bin/bash", "bin/build.sh"]
+
+  extra:
+    treeherderEnv:
+      - production
+      - staging
+    treeherder:
+      machine:
+        # see https://github.com/mozilla/treeherder/blob/master/ui/js/values.js
+        platform: linux64
+    # Rather then enforcing particular conventions we require that all build
+    # tasks provide the "build" extra field to specify where the build and tests
+    # files are located.
+    locations:
+      build: 'public/build/target.linux-x86_64.tar.bz2'
+      tests: 'public/build/target.tests.zip'
--- a/testing/taskcluster/tasks/builds/opt_linux64.yml
+++ b/testing/taskcluster/tasks/builds/opt_linux64.yml
@@ -1,60 +1,10 @@
 $inherits:
-  from: 'tasks/builds/firefox_base.yml'
-  variables:
-    build_name: 'linux64'
-    build_type: 'opt'
+  from: 'tasks/builds/opt_linux64_clobber.yml'
 task:
-  metadata:
-      name: '[TC] Linux64 Opt'
-      description: 'Linux64 Opt'
-
-  workerType: opt-linux64
-
-  routes:
-    - 'index.buildbot.branches.{{project}}.linux64'
-    - 'index.buildbot.revisions.{{head_rev}}.{{project}}.linux64'
-
+  # same as clobber, but with a cached workspace
   scopes:
     - 'docker-worker:cache:build-linux64-c6-workspace'
-    - 'docker-worker:cache:tooltool-cache'
-    - 'docker-worker:relengapi-proxy:tooltool.download.public'
 
   payload:
-    image: '{{#docker_image}}desktop-build{{/docker_image}}'
     cache:
       build-linux64-c6-workspace: '/home/worker/workspace'
-      tooltool-cache: '/home/worker/tooltool-cache'
-
-    features:
-      relengAPIProxy: true
-
-    env:
-      MOZHARNESS_SCRIPT: 'mozharness/scripts/fx_desktop_build.py'
-      MOZHARNESS_CONFIG: 'builds/releng_base_linux_64_builds.py balrog/production.py'
-      MH_BRANCH: {{project}}
-      MH_BUILD_POOL: taskcluster
-      # image paths
-      TOOLTOOL_CACHE: '/home/worker/tooltool-cache'
-      RELENGAPI_TOKEN: 'TODO' # 1164612: encrypt this secret
-      NEED_XVFB: true
-      DIST_UPLOADS: 'jsshell-linux-x86_64.zip'
-      DIST_TARGET_UPLOADS: 'x-test.linux-x86_64.tar.bz2 linux-x86_64.tar.bz2 linux-x86_64.json tests.zip crashreporter-symbols.zip'
-
-    maxRunTime: 36000
-
-    command: ["/bin/bash", "bin/build.sh"]
-
-  extra:
-    treeherderEnv:
-      - production
-      - staging
-    treeherder:
-      machine:
-        # see https://github.com/mozilla/treeherder/blob/master/ui/js/values.js
-        platform: linux64
-    # Rather then enforcing particular conventions we require that all build
-    # tasks provide the "build" extra field to specify where the build and tests
-    # files are located.
-    locations:
-      build: 'public/build/target.linux-x86_64.tar.bz2'
-      tests: 'public/build/target.tests.zip'
new file mode 100644
--- /dev/null
+++ b/testing/taskcluster/tasks/builds/opt_linux64_clobber.yml
@@ -0,0 +1,18 @@
+$inherits:
+  from: 'tasks/builds/linux64_clobber.yml'
+  variables:
+    build_name: 'linux64'
+    build_type: 'opt'
+task:
+  metadata:
+      name: '[TC] Linux64 Opt'
+      description: 'Linux64 Opt'
+
+  workerType: opt-linux64
+
+  extra:
+    treeherder:
+      groupSymbol: tc
+      groupName: Submitted by taskcluster
+      symbol: B
+
--- a/testing/testsuite-targets.mk
+++ b/testing/testsuite-targets.mk
@@ -364,18 +364,18 @@ jetpack-tests:
 	cd $(topsrcdir)/addon-sdk/source && $(PYTHON) bin/cfx -b $(abspath $(browser_path)) --parseable testpkgs
 
 pgo-profile-run:
 	$(PYTHON) $(topsrcdir)/build/pgo/profileserver.py $(EXTRA_TEST_ARGS)
 
 # Package up the tests and test harnesses
 include $(topsrcdir)/toolkit/mozapps/installer/package-name.mk
 
-ifndef UNIVERSAL_BINARY
 PKG_STAGE = $(DIST)/test-stage
+
 package-tests: \
   stage-config \
   stage-mach \
   stage-mochitest \
   stage-reftest \
   stage-xpcshell \
   stage-jstests \
   stage-jetpack \
@@ -388,59 +388,49 @@ package-tests: \
   stage-web-platform-tests \
   stage-luciddream \
   test-packages-manifest \
   test-packages-manifest-tc \
   $(NULL)
 ifdef MOZ_WEBRTC
 package-tests: stage-steeplechase
 endif
-else
-# This staging area has been built for us by universal/flight.mk
-PKG_STAGE = $(DIST)/universal/test-stage
-endif
 
 TEST_PKGS := \
   cppunittest \
   mochitest \
   reftest \
   xpcshell \
   web-platform \
   $(NULL)
 
 PKG_ARG = --$(1) '$(PKG_BASENAME).$(1).tests.zip'
 
 test-packages-manifest-tc:
 	@rm -f $(MOZ_TEST_PACKAGES_FILE_TC)
-ifndef UNIVERSAL_BINARY
 	$(NSINSTALL) -D $(dir $(MOZ_TEST_PACKAGES_FILE_TC))
-endif
 	$(PYTHON) $(topsrcdir)/build/gen_test_packages_manifest.py \
       --jsshell $(JSSHELL_NAME) \
       --dest-file $(MOZ_TEST_PACKAGES_FILE_TC) \
       --use-short-names \
       $(call PKG_ARG,common) \
       $(foreach pkg,$(TEST_PKGS),$(call PKG_ARG,$(pkg)))
 
 test-packages-manifest:
 	@rm -f $(MOZ_TEST_PACKAGES_FILE)
-ifndef UNIVERSAL_BINARY
 	$(NSINSTALL) -D $(dir $(MOZ_TEST_PACKAGES_FILE))
-endif
 	$(PYTHON) $(topsrcdir)/build/gen_test_packages_manifest.py \
       --jsshell $(JSSHELL_NAME) \
       --dest-file $(MOZ_TEST_PACKAGES_FILE) \
       $(call PKG_ARG,common) \
       $(foreach pkg,$(TEST_PKGS),$(call PKG_ARG,$(pkg)))
 
 package-tests:
 	@rm -f '$(DIST)/$(PKG_PATH)$(TEST_PACKAGE)'
-ifndef UNIVERSAL_BINARY
 	$(NSINSTALL) -D $(DIST)/$(PKG_PATH)
-endif
 # Exclude harness specific directories when generating the common zip.
 	$(MKDIR) -p $(abspath $(DIST))/$(PKG_PATH) && \
 	cd $(PKG_STAGE) && \
 	  zip -rq9D '$(abspath $(DIST))/$(PKG_PATH)$(TEST_PACKAGE)' \
 	  * -x \*/.mkdir.done \*.pyc $(foreach name,$(TEST_PKGS),$(name)\*) && \
 	$(foreach name,$(TEST_PKGS),rm -f '$(DIST)/$(PKG_PATH)$(PKG_BASENAME).'$(name)'.tests.zip' && \
                                 zip -rq9D '$(abspath $(DIST))/$(PKG_PATH)$(PKG_BASENAME).'$(name)'.tests.zip' \
                                 $(name) -x \*/.mkdir.done \*.pyc ;)