Merge b2g-inbound to m-c
authorWes Kocher <wkocher@mozilla.com>
Tue, 14 Jan 2014 15:44:06 -0800
changeset 163402 81bced59e8b3df898c3e6d644e7ed7ade7720291
parent 163378 4e671e3183c4b691ef39360345fa193c8fa3e361 (current diff)
parent 163401 53da7ae1a45f64bc470b191990b13b1db3cad5ee (diff)
child 163403 bda00523b05752bc722874528133c3938641052a
child 163409 43832758b909edda8eb14b4eb158f2532bd8a4c5
child 163478 588ec49aab13b91744844df882e1cc6ce06d44c8
child 163513 19b04c0b22fc512a0451f36df9d1ec59bb535e19
push id25994
push userkwierso@gmail.com
push dateTue, 14 Jan 2014 23:44:16 +0000
treeherdermozilla-central@81bced59e8b3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone29.0a1
first release with
nightly linux32
81bced59e8b3 / 29.0a1 / 20140115030229 / files
nightly linux64
81bced59e8b3 / 29.0a1 / 20140115030229 / files
nightly mac
81bced59e8b3 / 29.0a1 / 20140115030229 / files
nightly win32
81bced59e8b3 / 29.0a1 / 20140115030229 / files
nightly win64
81bced59e8b3 / 29.0a1 / 20140115030229 / 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 b2g-inbound to m-c
dom/fmradio/test/marionette/test_bug876597.js
dom/ipc/TabChild.cpp
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,4 +1,4 @@
 {
-    "revision": "c8716b0dcb8cc8946903355c3533481f967b52d3", 
+    "revision": "5fed274e799a9f111cdf6476ec53c9328c55c7b9", 
     "repo_path": "/integration/gaia-central"
 }
--- a/b2g/config/hamachi/releng-hamachi.tt
+++ b/b2g/config/hamachi/releng-hamachi.tt
@@ -1,12 +1,12 @@
 [
 {
-"size": 55073212,
-"digest": "10560463c0804186fc59a84ecab4d5ccd1ffdf298336d3b91065c38888698f4cfab4bad743d6170e73f9bc0538f47a96baf5f1381e8b4ab484d8721301bea31e",
+"size": 55276112,
+"digest": "035efc2064a88bdb6f60fd126f17ee0e35de708f4666837cbeb0f3381024044a6ec3a05c244c553f9c2d852d94706f5263edde3d7dbff33872bd05db0215f5e6",
 "algorithm": "sha512",
 "filename": "backup-hamachi.tar.xz"
 },
 {
 "size": 1570553,
 "digest": "ea03de74df73b05e939c314cd15c54aac7b5488a407b7cc4f5f263f3049a1f69642c567dd35c43d0bc3f0d599d0385a26ab2dd947a6b18f9044e4918b382eea7",
 "algorithm": "sha512",
 "filename": "Adreno200-AU_LINUX_ANDROID_ICS_CHOCO_CS.04.00.03.06.001.zip"
--- a/b2g/config/hamachi/releng-limited-memory.tt
+++ b/b2g/config/hamachi/releng-limited-memory.tt
@@ -1,12 +1,12 @@
 [
 {
-"size": 55073212,
-"digest": "10560463c0804186fc59a84ecab4d5ccd1ffdf298336d3b91065c38888698f4cfab4bad743d6170e73f9bc0538f47a96baf5f1381e8b4ab484d8721301bea31e",
+"size": 55276112,
+"digest": "035efc2064a88bdb6f60fd126f17ee0e35de708f4666837cbeb0f3381024044a6ec3a05c244c553f9c2d852d94706f5263edde3d7dbff33872bd05db0215f5e6",
 "algorithm": "sha512",
 "filename": "backup-hamachi.tar.xz"
 },
 {
 "size": 1570553,
 "digest": "ea03de74df73b05e939c314cd15c54aac7b5488a407b7cc4f5f263f3049a1f69642c567dd35c43d0bc3f0d599d0385a26ab2dd947a6b18f9044e4918b382eea7",
 "algorithm": "sha512",
 "filename": "Adreno200-AU_LINUX_ANDROID_ICS_CHOCO_CS.04.00.03.06.001.zip"
--- a/browser/base/content/test/general/accounts_testRemoteCommands.html
+++ b/browser/base/content/test/general/accounts_testRemoteCommands.html
@@ -21,17 +21,17 @@ let tests = [
   event: "login",
   data: {
     email: "foo@example.com",
     uid: "1234@lcip.org",
     assertion: "foobar",
     sessionToken: "dead",
     kA: "beef",
     kB: "cafe",
-    isVerified: true
+    verified: true
   },
   payloadType: "message",
   validateResponse: function(payload) {
     return checkStatusValue(payload, "login");
   },
 },
 ];
 
--- a/content/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp
+++ b/content/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp
@@ -451,17 +451,17 @@ MovieExtendsBox::MovieExtendsBox(ISOCont
 MovieExtendsBox::~MovieExtendsBox()
 {
   MOZ_COUNT_DTOR(MovieExtendsBox);
 }
 
 nsresult
 ChunkOffsetBox::Generate(uint32_t* aBoxSize)
 {
-  // fragmented, we don't need time to sample table
+  // We don't need time to sample table in fragmented mp4.
   entry_count = 0;
   size += sizeof(entry_count);
   *aBoxSize = size;
   return NS_OK;
 }
 
 nsresult
 ChunkOffsetBox::Write()
@@ -481,17 +481,17 @@ ChunkOffsetBox::ChunkOffsetBox(uint32_t 
 ChunkOffsetBox::~ChunkOffsetBox()
 {
   MOZ_COUNT_DTOR(ChunkOffsetBox);
 }
 
 nsresult
 SampleToChunkBox::Generate(uint32_t* aBoxSize)
 {
-  // fragmented, we don't need time to sample table
+  // We don't need time to sample table in fragmented mp4
   entry_count = 0;
   size += sizeof(entry_count);
   *aBoxSize = size;
   return NS_OK;
 }
 
 nsresult
 SampleToChunkBox::Write()
@@ -511,17 +511,17 @@ SampleToChunkBox::SampleToChunkBox(uint3
 SampleToChunkBox::~SampleToChunkBox()
 {
   MOZ_COUNT_DTOR(SampleToChunkBox);
 }
 
 nsresult
 TimeToSampleBox::Generate(uint32_t* aBoxSize)
 {
-  // fragmented, we don't need time to sample table
+  // We don't need time to sample table in fragmented mp4.
   entry_count = 0;
   size += sizeof(entry_count);
   *aBoxSize = size;
   return NS_OK;
 }
 
 nsresult
 TimeToSampleBox::Write()
--- a/content/media/encoder/fmp4_muxer/ISOMediaBoxes.h
+++ b/content/media/encoder/fmp4_muxer/ISOMediaBoxes.h
@@ -15,16 +15,22 @@
 #define WRITE_FULLBOX(_compositor, _size)       \
   BoxSizeChecker checker(_compositor, _size);   \
   FullBox::Write();
 
 #define FOURCC(a, b, c, d) ( ((a) << 24) | ((b) << 16) | ((c) << 8) | (d) )
 
 namespace mozilla {
 
+/**
+ * track type from spec 8.4.3.3
+ */
+#define Audio_Track 0x01
+#define Video_Track 0x02
+
 class AACTrackMetadata;
 class AVCTrackMetadata;
 class ES_Descriptor;
 class ISOControl;
 
 /**
  * This is the base class for all ISO media format boxes.
  * It provides the fields of box type(four CC) and size.
--- a/content/media/encoder/fmp4_muxer/ISOMediaWriter.cpp
+++ b/content/media/encoder/fmp4_muxer/ISOMediaWriter.cpp
@@ -23,17 +23,16 @@ namespace mozilla {
 const static uint32_t FRAG_DURATION = 2000000;    // microsecond per unit
 
 ISOMediaWriter::ISOMediaWriter(uint32_t aType)
   : ContainerWriter()
   , mState(MUXING_HEAD)
   , mBlobReady(false)
   , mType(0)
 {
-  // TODO: replace Audio_Track/Video_Track with HAS_AUDIO/HAS_VIDEO
   if (aType & HAS_AUDIO) {
     mType |= Audio_Track;
   }
   if (aType & HAS_VIDEO) {
     mType |= Video_Track;
   }
   mControl = new ISOControl();
   MOZ_COUNT_CTOR(ISOMediaWriter);
@@ -171,17 +170,17 @@ ISOMediaWriter::ReadyToRunState(bool& aE
     if (mAudioFragmentBuffer->EOS()) {
       aEOS = true;
       bReadyToMux = true;
     }
   } else if (mType == Video_Track) {
     if (!mVideoFragmentBuffer->HasEnoughData()) {
       bReadyToMux = false;
     }
-    if (mAudioFragmentBuffer->EOS()) {
+    if (mVideoFragmentBuffer->EOS()) {
       aEOS = true;
       bReadyToMux = true;
     }
   }
 
   return bReadyToMux;
 }
 
--- a/content/media/encoder/fmp4_muxer/ISOMediaWriter.h
+++ b/content/media/encoder/fmp4_muxer/ISOMediaWriter.h
@@ -76,14 +76,14 @@ private:
   nsAutoPtr<FragmentBuffer> mAudioFragmentBuffer;
   nsAutoPtr<FragmentBuffer> mVideoFragmentBuffer;
 
   MuxState mState;
 
   // A flag to indicate the output buffer is ready to blob out.
   bool mBlobReady;
 
-  // Combination of HAS_AUDIO or HAS_VIDEO.
+  // Combination of Audio_Track or Video_Track.
   uint32_t mType;
 };
 
 } // namespace mozilla
 #endif // ISOMediaWriter_h_
--- a/content/media/encoder/fmp4_muxer/ISOTrackMetadata.h
+++ b/content/media/encoder/fmp4_muxer/ISOTrackMetadata.h
@@ -5,22 +5,16 @@
 
 #ifndef ISOTrackMetadata_h_
 #define ISOTrackMetadata_h_
 
 #include "TrackMetadataBase.h"
 
 namespace mozilla {
 
-/**
- * track type from spec 8.4.3.3
- */
-#define Audio_Track 0x01
-#define Video_Track 0x02
-
 class AACTrackMetadata : public TrackMetadataBase {
 public:
   uint32_t SampleRate;     // From 14496-3 table 1.16, it could be 7350 ~ 96000.
   uint32_t FrameDuration;  // Audio frame duration based on SampleRate.
   uint32_t FrameSize;      // Audio frame size, 0 is variant size.
   uint32_t Channels;       // Channel number, it should be 1 or 2.
 
   AACTrackMetadata()
--- a/dom/downloads/tests/serve_file.sjs
+++ b/dom/downloads/tests/serve_file.sjs
@@ -48,31 +48,70 @@ function handleResponse() {
 
   // All done sending, go ahead and cancel our repeating timer.
   timer.cancel();
 }
 
 function handleRequest(request, response) {
   var query = getQuery(request);
 
+  // Default status when responding.
+  var version = "1.1";
+  var statusCode = 200;
+  var description = "OK";
+
   // Default values for content type, size and rate.
   var contentType = "text/plain";
+  var contentRange = null;
   var size = 1024;
   var rate = 0;
 
   // optional content type to be used by our response.
   if ("contentType" in query) {
     contentType = query["contentType"];
   }
 
   // optional size (in bytes) for generated file.
   if ("size" in query) {
     size = parseInt(query["size"]);
   }
 
+  // optional range request check.
+  if (request.hasHeader("range")) {
+    version = "1.1";
+    statusCode = 206;
+    description = "Partial Content";
+
+    // We'll only support simple range byte style requests.
+    var [offset, total] = request.getHeader("range").slice("bytes=".length).split("-");
+    // Enforce valid Number values.
+    offset = parseInt(offset);
+    offset = isNaN(offset) ? 0 : offset;
+    // Same.
+    total = parseInt(total);
+    total = isNaN(total) ? 0 : total;
+
+    // We'll need to original total size as part of the Content-Range header
+    // value in our response.
+    var originalSize = size;
+
+    // If we have a total size requested, we must make sure to send that number
+    // of bytes only (minus the start offset).
+    if (total && total < size) {
+      size = total - offset;
+    } else if (offset) {
+      // Looks like we just have a byte offset to deal with.
+      size = size - offset;
+    }
+
+    // We specifically need to add a Content-Range header to all responses for
+    // requests that include a range request header.
+    contentRange = "bytes " + offset + "-" + (size - 1) + "/" + originalSize;
+  }
+
   // optional rate (in bytes/s) at which to send the file.
   if ("rate" in query) {
     rate = parseInt(query["rate"]);
   }
 
   // The context for the responseHandler.
   var context = {
     response: response,
@@ -91,17 +130,21 @@ function handleRequest(request, response
     Components.classes["@mozilla.org/timer;1"]
               .createInstance(Components.interfaces.nsITimer);
 
   // sending at a specific rate requires our response to be asynchronous so
   // we handle all requests asynchronously. See handleResponse().
   response.processAsync();
 
   // generate the content.
+  response.setStatusLine(version, statusCode, description);
   response.setHeader("Content-Type", contentType, false);
+  if (contentRange) {
+    response.setHeader("Content-Range", contentRange, false);
+  }
   response.setHeader("Content-Length", size.toString(), false);
 
   // initialize the timer and start writing out the response.
   timer.initWithCallback(context,
                          1000,
                          Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
 
 }
--- a/dom/downloads/tests/test_downloads_pause_resume.html
+++ b/dom/downloads/tests/test_downloads_pause_resume.html
@@ -10,17 +10,17 @@ https://bugzilla.mozilla.org/show_bug.cg
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body>
 
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=938023">Mozilla Bug 938023</a>
 <p id="display"></p>
 <div id="content" style="display: none">
 </div>
-<a href="serve_file.sjs?contentType=application/octet-stream&size=102400&rate=1024" download="test.bin" id="download1">Large Download</a>
+<a href="serve_file.sjs?contentType=application/octet-stream&size=102400&rate=10240" download="test.bin" id="download1">Large Download</a>
 <pre id="test">
 <script class="testbody" type="text/javascript;version=1.7">
 
 // Testing pausing a download and then resuming it.
 
 SimpleTest.waitForExplicitFinish();
 
 var index = -1;
@@ -47,34 +47,33 @@ function error() {
   SimpleTest.finish();
 }
 
 function checkDownloadList(downloads) {
   ok(downloads.length == 0, "No downloads left");
   SimpleTest.finish();
 }
 
-function checkResumedFailed(download) {
-  ok(download.state == "stopped", "Download fails to resume.");
+function checkResumeSucceeded(download) {
+  ok(download.state == "succeeded", "Download resumed successfully.");
   navigator.mozDownloadManager.clearAllDone()
-           .then(checkDownloadList, error);
+             .then(checkDownloadList, error);
 }
 
 function downloadChange(evt) {
   var download = evt.download;
 
   if (download.state == "downloading" && !pausing) {
     pausing = true;
     download.pause();
   } else if (download.state == "stopped" && !resuming) {
     resuming = true;
     ok(pausing, "Download stopped by pause()");
-    // serve_file.sjs does not support resuming, so that should fail.
     download.resume()
-            .then(error, function() { checkResumedFailed(download); });
+            .then(function() { checkResumeSucceeded(download); }, error);
   }
 }
 
 var steps = [
   // Start by setting the pref to true.
   function() {
     SpecialPowers.pushPrefEnv({
       set: [["dom.mozDownloads.enabled", true]]
--- a/dom/fmradio/FMRadioService.cpp
+++ b/dom/fmradio/FMRadioService.cpp
@@ -19,19 +19,16 @@
 #define BAND_87500_108000_kHz 1
 #define BAND_76000_108000_kHz 2
 #define BAND_76000_90000_kHz  3
 
 #define CHANNEL_WIDTH_200KHZ 200
 #define CHANNEL_WIDTH_100KHZ 100
 #define CHANNEL_WIDTH_50KHZ  50
 
-#define MOZSETTINGS_CHANGED_ID "mozsettings-changed"
-#define SETTING_KEY_RIL_RADIO_DISABLED "ril.radio.disabled"
-
 using namespace mozilla::hal;
 using mozilla::Preferences;
 
 BEGIN_FMRADIO_NAMESPACE
 
 // static
 IFMRadioService*
 IFMRadioService::Singleton()
@@ -88,22 +85,16 @@ FMRadioService::FMRadioService()
     case CHANNEL_WIDTH_100KHZ:
     default:
       mChannelWidthInKHz = 100;
       break;
   }
 
   nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
 
-  if (NS_FAILED(obs->AddObserver(this,
-                                 MOZSETTINGS_CHANGED_ID,
-                                 /* useWeak */ false))) {
-    NS_WARNING("Failed to add settings change observer!");
-  }
-
   RegisterFMRadioObserver(this);
 }
 
 FMRadioService::~FMRadioService()
 {
   UnregisterFMRadioObserver(this);
 }
 
@@ -441,52 +432,45 @@ FMRadioService::Enable(double aFrequency
       TransitionState(ErrorResponse(
         NS_LITERAL_STRING("Can't create settings lock")), Disabled);
       return;
     }
 
     nsRefPtr<ReadRilSettingTask> callback =
       new ReadRilSettingTask(mPendingRequest);
 
-    rv = settingsLock->Get(SETTING_KEY_RIL_RADIO_DISABLED, callback);
+    rv = settingsLock->Get("ril.radio.disabled", callback);
     if (NS_FAILED(rv)) {
       TransitionState(ErrorResponse(
         NS_LITERAL_STRING("Can't get settings lock")), Disabled);
     }
 
     return;
   }
 
   NS_DispatchToMainThread(new EnableRunnable(mUpperBoundInKHz,
                                              mLowerBoundInKHz,
                                              mChannelWidthInKHz));
 }
 
 void
 FMRadioService::Disable(FMRadioReplyRunnable* aReplyRunnable)
 {
-  // When airplane-mode is enabled, we will call this function from
-  // FMRadioService::Observe without passing a FMRadioReplyRunnable,
-  // so we have to check if |aReplyRunnable| is null before we dispatch it.
   MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
 
   switch (mState) {
     case Disabling:
-      if (aReplyRunnable) {
-        aReplyRunnable->SetReply(
-          ErrorResponse(NS_LITERAL_STRING("FM radio currently disabling")));
-        NS_DispatchToMainThread(aReplyRunnable);
-      }
+      aReplyRunnable->SetReply(
+        ErrorResponse(NS_LITERAL_STRING("FM radio currently disabling")));
+      NS_DispatchToMainThread(aReplyRunnable);
       return;
     case Disabled:
-      if (aReplyRunnable) {
-        aReplyRunnable->SetReply(
-          ErrorResponse(NS_LITERAL_STRING("FM radio currently disabled")));
-        NS_DispatchToMainThread(aReplyRunnable);
-      }
+      aReplyRunnable->SetReply(
+        ErrorResponse(NS_LITERAL_STRING("FM radio currently disabled")));
+      NS_DispatchToMainThread(aReplyRunnable);
       return;
     case Enabled:
     case Enabling:
     case Seeking:
       break;
   }
 
   nsRefPtr<FMRadioReplyRunnable> enablingRequest = mPendingRequest;
@@ -510,20 +494,18 @@ FMRadioService::Disable(FMRadioReplyRunn
       ErrorResponse(NS_LITERAL_STRING("Enable action is cancelled")));
     NS_DispatchToMainThread(enablingRequest);
 
     // If we haven't read the ril settings yet we won't enable the FM radio HW,
     // so fail the disable request immediately.
     if (!mHasReadRilSetting) {
       SetState(Disabled);
 
-      if (aReplyRunnable) {
-        aReplyRunnable->SetReply(SuccessResponse());
-        NS_DispatchToMainThread(aReplyRunnable);
-      }
+      aReplyRunnable->SetReply(SuccessResponse());
+      NS_DispatchToMainThread(aReplyRunnable);
     }
 
     return;
   }
 
   DoDisable();
 }
 
@@ -644,75 +626,16 @@ FMRadioService::CancelSeek(FMRadioReplyR
 
   TransitionState(
     ErrorResponse(NS_LITERAL_STRING("Seek action is cancelled")), Enabled);
 
   aReplyRunnable->SetReply(SuccessResponse());
   NS_DispatchToMainThread(aReplyRunnable);
 }
 
-NS_IMETHODIMP
-FMRadioService::Observe(nsISupports * aSubject,
-                        const char * aTopic,
-                        const char16_t * aData)
-{
-  MOZ_ASSERT(NS_IsMainThread());
-  MOZ_ASSERT(sFMRadioService);
-
-  if (strcmp(aTopic, MOZSETTINGS_CHANGED_ID) != 0) {
-    return NS_OK;
-  }
-
-  // The string that we're interested in will be a JSON string looks like:
-  //  {"key":"ril.radio.disabled","value":true}
-  AutoSafeJSContext cx;
-  const nsDependentString dataStr(aData);
-  JS::Rooted<JS::Value> val(cx);
-  if (!JS_ParseJSON(cx, dataStr.get(), dataStr.Length(), &val) ||
-      !val.isObject()) {
-    return NS_OK;
-  }
-
-  JSObject& obj(val.toObject());
-  JS::Rooted<JS::Value> key(cx);
-  if (!JS_GetProperty(cx, &obj, "key", &key) ||
-      !key.isString()) {
-    return NS_OK;
-  }
-
-  JS::Rooted<JSString*> jsKey(cx, key.toString());
-  nsDependentJSString keyStr;
-  if (!keyStr.init(cx, jsKey)) {
-    return NS_OK;
-  }
-
-  JS::Rooted<JS::Value> value(cx);
-  if (!JS_GetProperty(cx, &obj, "value", &value)) {
-    return NS_OK;
-  }
-
-  if (keyStr.EqualsLiteral(SETTING_KEY_RIL_RADIO_DISABLED)) {
-    if (!value.isBoolean()) {
-      return NS_OK;
-    }
-
-    mRilDisabled = value.toBoolean();
-    mHasReadRilSetting = true;
-
-    // Disable the FM radio HW if Airplane mode is enabled.
-    if (mRilDisabled) {
-      Disable(nullptr);
-    }
-
-    return NS_OK;
-  }
-
-  return NS_OK;
-}
-
 void
 FMRadioService::NotifyFMRadioEvent(FMRadioEventType aType)
 {
   mObserverList.Broadcast(aType);
 }
 
 void
 FMRadioService::Notify(const FMRadioOperationInformation& aInfo)
@@ -804,12 +727,12 @@ FMRadioService::Singleton()
 
   if (!sFMRadioService) {
     sFMRadioService = new FMRadioService();
   }
 
   return sFMRadioService;
 }
 
-NS_IMPL_ISUPPORTS1(FMRadioService, nsIObserver)
+NS_IMPL_ISUPPORTS0(FMRadioService)
 
 END_FMRADIO_NAMESPACE
 
--- a/dom/fmradio/FMRadioService.h
+++ b/dom/fmradio/FMRadioService.h
@@ -8,17 +8,16 @@
 #define mozilla_dom_fmradioservice_h__
 
 #include "mozilla/dom/PFMRadioRequest.h"
 #include "FMRadioCommon.h"
 #include "mozilla/Hal.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/Services.h"
 #include "nsThreadUtils.h"
-#include "nsIObserver.h"
 #include "nsXULAppAPI.h"
 
 BEGIN_FMRADIO_NAMESPACE
 
 class FMRadioReplyRunnable : public nsRunnable
 {
 public:
   FMRadioReplyRunnable() : mResponseType(SuccessResponse()) {}
@@ -132,18 +131,18 @@ enum FMRadioState
   Disabled,
   Disabling,
   Enabling,
   Enabled,
   Seeking
 };
 
 class FMRadioService MOZ_FINAL : public IFMRadioService
+                               , public nsISupports
                                , public hal::FMRadioObserver
-                               , public nsIObserver
 {
   friend class ReadRilSettingTask;
   friend class SetFrequencyRunnable;
 
 public:
   static FMRadioService* Singleton();
   virtual ~FMRadioService();
 
@@ -167,18 +166,16 @@ public:
   virtual void AddObserver(FMRadioEventObserver* aObserver) MOZ_OVERRIDE;
   virtual void RemoveObserver(FMRadioEventObserver* aObserver) MOZ_OVERRIDE;
 
   virtual void EnableAudio(bool aAudioEnabled) MOZ_OVERRIDE;
 
   /* FMRadioObserver */
   void Notify(const hal::FMRadioOperationInformation& aInfo) MOZ_OVERRIDE;
 
-  NS_DECL_NSIOBSERVER
-
 protected:
   FMRadioService();
 
 private:
   int32_t RoundFrequency(double aFrequencyInMHz);
 
   void NotifyFMRadioEvent(FMRadioEventType aType);
   void DoDisable();
--- a/dom/fmradio/test/marionette/manifest.ini
+++ b/dom/fmradio/test/marionette/manifest.ini
@@ -5,10 +5,9 @@ browser = false
 qemu = false
 
 [test_enable_disable.js]
 [test_set_frequency.js]
 [test_cancel_seek.js]
 [test_one_seek_at_once.js]
 [test_seek_up_and_down.js]
 [test_bug862672.js]
-[test_bug876597.js]
 
deleted file mode 100644
--- a/dom/fmradio/test/marionette/test_bug876597.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-MARIONETTE_TIMEOUT = 10000;
-
-SpecialPowers.addPermission("fmradio", true, document);
-SpecialPowers.addPermission("settings-read", true, document);
-SpecialPowers.addPermission("settings-write", true, document);
-
-let FMRadio = window.navigator.mozFMRadio;
-let mozSettings = window.navigator.mozSettings;
-let KEY = "ril.radio.disabled";
-
-function verifyInitialState() {
-  log("Verifying initial state.");
-  ok(FMRadio);
-  is(FMRadio.enabled, false);
-  ok(mozSettings);
-
-  checkRilSettings();
-}
-
-function checkRilSettings() {
-  log("Checking airplane mode settings");
-  let req = mozSettings.createLock().get(KEY);
-  req.onsuccess = function(event) {
-    ok(!req.result[KEY], "Airplane mode is disabled.");
-    enableFMRadio();
-  };
-
-  req.onerror = function() {
-    ok(false, "Error occurs when reading settings value.");
-    finish();
-  };
-}
-
-function enableFMRadio() {
-  log("Enable FM radio");
-  let frequency = FMRadio.frequencyLowerBound + FMRadio.channelWidth;
-  let req = FMRadio.enable(frequency);
-
-  req.onsuccess = function() {
-    enableAirplaneMode();
-  };
-
-  req.onerror = function() {
-    ok(false, "Failed to enable FM radio.");
-  };
-}
-
-function enableAirplaneMode() {
-  log("Enable airplane mode");
-  FMRadio.ondisabled = function() {
-    FMRadio.ondisabled = null;
-    enableFMRadioWithAirplaneModeEnabled();
-  };
-
-  let settings = {};
-  settings[KEY] = true;
-  mozSettings.createLock().set(settings);
-}
-
-function enableFMRadioWithAirplaneModeEnabled() {
-  log("Enable FM radio with airplane mode enabled");
-  let frequency = FMRadio.frequencyLowerBound + FMRadio.channelWidth;
-  let req = FMRadio.enable(frequency);
-  req.onerror = cleanUp();
-
-  req.onsuccess = function() {
-    ok(false, "FMRadio could be enabled when airplane mode is enabled.");
-  };
-}
-
-function cleanUp() {
-  let settings = {};
-  settings[KEY] = false;
-  let req = mozSettings.createLock().set(settings);
-
-  req.onsuccess = function() {
-    ok(!FMRadio.enabled);
-    finish();
-  };
-
-  req.onerror = function() {
-    ok(false, "Error occurs when setting value");
-  };
-}
-
-verifyInitialState();
-
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -1233,22 +1233,24 @@ ContentParent::InitializeMembers()
 ContentParent::ContentParent(mozIApplication* aApp,
                              bool aIsForBrowser,
                              bool aIsForPreallocated,
                              ChildPrivileges aOSPrivileges,
                              ProcessPriority aInitialPriority /* = PROCESS_PRIORITY_FOREGROUND */,
                              bool aIsNuwaProcess /* = false */)
     : mOSPrivileges(aOSPrivileges)
     , mIsForBrowser(aIsForBrowser)
+    , mIsNuwaProcess(aIsNuwaProcess)
 {
     InitializeMembers();  // Perform common initialization.
 
-    // No more than one of !!aApp, aIsForBrowser, and aIsForPreallocated should
-    // be true.
-    MOZ_ASSERT(!!aApp + aIsForBrowser + aIsForPreallocated <= 1);
+    // No more than one of !!aApp, aIsForBrowser, aIsForPreallocated, and
+    // aIsNuwaProcess should be true.
+    MOZ_ASSERT(!!aApp + aIsForBrowser + aIsForPreallocated + aIsNuwaProcess <=
+               1);
 
     // Insert ourselves into the global linked list of ContentParent objects.
     if (!sContentParents) {
         sContentParents = new LinkedList<ContentParent>();
     }
     if (!aIsNuwaProcess) {
         sContentParents->insertBack(this);
     }
@@ -1312,16 +1314,17 @@ FindFdProtocolFdMapping(const nsTArray<P
 ContentParent::ContentParent(ContentParent* aTemplate,
                              const nsAString& aAppManifestURL,
                              base::ProcessHandle aPid,
                              const nsTArray<ProtocolFdMapping>& aFds,
                              ChildPrivileges aOSPrivileges)
     : mOSPrivileges(aOSPrivileges)
     , mAppManifestURL(aAppManifestURL)
     , mIsForBrowser(false)
+    , mIsNuwaProcess(false)
 {
     InitializeMembers();  // Perform common initialization.
 
     sContentParents->insertBack(this);
 
     // From this point on, NS_WARNING, NS_ASSERTION, etc. should print out the
     // PID along with the warning.
     nsDebugImpl::SetMultiprocessMode("Parent");
@@ -1492,16 +1495,24 @@ ContentParent::IsAlive()
 }
 
 bool
 ContentParent::IsForApp()
 {
     return !mAppManifestURL.IsEmpty();
 }
 
+#ifdef MOZ_NUWA_PROCESS
+bool
+ContentParent::IsNuwaProcess()
+{
+    return mIsNuwaProcess;
+}
+#endif
+
 int32_t
 ContentParent::Pid()
 {
     if (!mSubprocess || !mSubprocess->GetChildProcessHandle()) {
         return -1;
     }
     return base::GetProcId(mSubprocess->GetChildProcessHandle());
 }
@@ -1877,17 +1888,20 @@ ContentParent::Observe(nsISupports* aSub
     else if (!strcmp(aTopic, "alertfinished") ||
              !strcmp(aTopic, "alertclickcallback") ||
              !strcmp(aTopic, "alertshow") ) {
         if (!SendNotifyAlertsObserver(nsDependentCString(aTopic),
                                       nsDependentString(aData)))
             return NS_ERROR_NOT_AVAILABLE;
     }
     else if (!strcmp(aTopic, "child-memory-reporter-request")) {
-        unused << SendPMemoryReportRequestConstructor((uint32_t)(uintptr_t)aData);
+#ifdef MOZ_NUWA_PROCESS
+        if (!IsNuwaProcess())
+#endif
+            unused << SendPMemoryReportRequestConstructor((uint32_t)(uintptr_t)aData);
     }
     else if (!strcmp(aTopic, "child-gc-request")){
         unused << SendGarbageCollect();
     }
     else if (!strcmp(aTopic, "child-cc-request")){
         unused << SendCycleCollect();
     }
     else if (!strcmp(aTopic, "child-mmu-request")){
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -140,16 +140,19 @@ public:
     TestShellParent* GetTestShellSingleton();
     jsipc::JavaScriptParent *GetCPOWManager();
 
     void ReportChildAlreadyBlocked();
     bool RequestRunToCompletion();
 
     bool IsAlive();
     bool IsForApp();
+#ifdef MOZ_NUWA_PROCESS
+    bool IsNuwaProcess();
+#endif
 
     GeckoChildProcessHost* Process() {
         return mSubprocess;
     }
 
     int32_t Pid();
 
     bool NeedsPermissionsUpdate() {
@@ -555,16 +558,17 @@ private:
     // True only while this is ready to be used to host remote tabs.
     // This must not be used for new purposes after mIsAlive goes to
     // false, but some previously scheduled IPC traffic may still pass
     // through.
     bool mIsAlive;
 
     bool mSendPermissionUpdates;
     bool mIsForBrowser;
+    bool mIsNuwaProcess;
 
     // These variables track whether we've called Close(), CloseWithError()
     // and KillHard() on our channel.
     bool mCalledClose;
     bool mCalledCloseWithError;
     bool mCalledKillHard;
 
     friend class CrashReporterParent;
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -1618,18 +1618,19 @@ TabChild::RecvHandleSingleTap(const CSSI
 
 bool
 TabChild::RecvHandleLongTap(const CSSIntPoint& aPoint)
 {
   if (!mGlobal || !mTabChildGlobal) {
     return true;
   }
 
-  DispatchMouseEvent(NS_LITERAL_STRING("contextmenu"), aPoint, 2, 1, 0, false,
-                     nsIDOMMouseEvent::MOZ_SOURCE_TOUCH);
+  mContextMenuHandled =
+      DispatchMouseEvent(NS_LITERAL_STRING("contextmenu"), aPoint, 2, 1, 0, false,
+                         nsIDOMMouseEvent::MOZ_SOURCE_TOUCH);
 
   return true;
 }
 
 bool
 TabChild::RecvHandleLongTapUp(const CSSIntPoint& aPoint)
 {
   if (mContextMenuHandled) {
--- a/dom/system/gonk/nfc_worker.js
+++ b/dom/system/gonk/nfc_worker.js
@@ -362,40 +362,40 @@ NfcWorker[NFC_NOTIFICATION_INITIALIZED] 
     debug("Version Mismatch! Current Supported Version : " +
             NFC_MAJOR_VERSION + "." + NFC_MINOR_VERSION  +
            " Received Version : " + majorVersion + "." + minorVersion);
   }
 };
 
 NfcWorker[NFC_NOTIFICATION_TECH_DISCOVERED] = function NFC_NOTIFICATION_TECH_DISCOVERED() {
   debug("NFC_NOTIFICATION_TECH_DISCOVERED");
-  let techs     = [];
+  let techList  = [];
   let ndefMsgs  = [];
 
   let sessionId = Buf.readInt32();
   let techCount = Buf.readInt32();
   for (let count = 0; count < techCount; count++) {
     let tech = NFC_TECHS[Buf.readUint8()];
     if (tech) {
-      techs.push(tech);
+      techList.push(tech);
     }
   }
 
   let padding   = getPaddingLen(techCount);
   for (let i = 0; i < padding; i++) {
     Buf.readUint8();
   }
 
   let ndefMsgCount = Buf.readInt32();
   for (let count = 0; count < ndefMsgCount; count++) {
     ndefMsgs.push(this.unMarshallNdefMessage());
   }
   this.sendDOMMessage({type: "techDiscovered",
                        sessionId: sessionId,
-                       tech: techs,
+                       techList: techList,
                        ndef: ndefMsgs
                        });
 };
 
 NfcWorker[NFC_NOTIFICATION_TECH_LOST] = function NFC_NOTIFICATION_TECH_LOST() {
   debug("NFC_NOTIFICATION_TECH_LOST");
   let sessionId = Buf.readInt32();
   debug("sessionId = " + sessionId);
--- a/layout/generic/FrameChildList.h
+++ b/layout/generic/FrameChildList.h
@@ -91,34 +91,34 @@ class MOZ_STACK_CLASS FrameChildListIter
   : public FrameChildListArrayIterator {
  public:
   FrameChildListIterator(const nsIFrame* aFrame);
 
 protected:
   nsAutoTArray<FrameChildList,4> mLists;
 };
 
-} // namespace layout
-} // namespace mozilla
-
 inline mozilla::layout::FrameChildListIDs
 operator|(mozilla::layout::FrameChildListID aLeftOp,
           mozilla::layout::FrameChildListID aRightOp)
 {
   return mozilla::layout::FrameChildListIDs(aLeftOp) |
          mozilla::layout::FrameChildListIDs(aRightOp);
 }
 
 inline mozilla::layout::FrameChildListIDs
 operator|(mozilla::layout::FrameChildListID aLeftOp,
           mozilla::layout::FrameChildListIDs aRightOp)
 {
   return mozilla::layout::FrameChildListIDs(aLeftOp) | aRightOp;
 }
 
+} // namespace layout
+} // namespace mozilla
+
 inline void nsFrameList::AppendIfNonempty(
          nsTArray<mozilla::layout::FrameChildList>* aLists,
          mozilla::layout::FrameChildListID aListID) const
 {
   if (NotEmpty()) {
     aLists->AppendElement(mozilla::layout::FrameChildList(*this, aListID));
   }
 }
--- a/services/fxaccounts/FxAccounts.jsm
+++ b/services/fxaccounts/FxAccounts.jsm
@@ -125,17 +125,17 @@ InternalMethods.prototype = {
    * @return Promise
    *        The promise resolves to the credentials object of the signed-in user:
    *        {
    *          email: The user's email address
    *          uid: The user's unique id
    *          sessionToken: Session for the FxA server
    *          kA: An encryption key from the FxA server
    *          kB: An encryption key derived from the user's FxA password
-   *          isVerified: email verification status
+   *          verified: email verification status
    *        }
    *        or null if no user is signed in
    */
   getKeys: function() {
     return this.getUserAccountData().then((data) => {
       if (!data) {
         throw new Error("Can't get keys; User is not signed in");
       }
@@ -300,17 +300,17 @@ InternalMethods.prototype = {
         }
       }
     );
 
     return deferred.promise;
   },
 
   isUserEmailVerified: function isUserEmailVerified(data) {
-    return !!(data && data.isVerified);
+    return !!(data && data.verified);
   },
 
   /**
    * Setup for and if necessary do email verification polling.
    */
   loadAndPoll: function() {
     return this.getUserAccountData()
       .then(data => {
@@ -329,17 +329,17 @@ InternalMethods.prototype = {
     // Login is truly complete once keys have been fetched, so once getKeys()
     // obtains and stores kA and kB, it will fire the onlogin observer
     // notification.
     return this.whenVerified(data)
       .then((data) => this.getKeys(data));
   },
 
   whenVerified: function(data) {
-    if (data.isVerified) {
+    if (data.verified) {
       log.debug("already verified");
       return Promise.resolve(data);
     }
     if (!this.whenVerifiedPromise) {
       this.whenVerifiedPromise = Promise.defer();
       log.debug("whenVerified promise starts polling for verified email");
       this.pollEmailStatus(data.sessionToken, "start");
     }
@@ -383,17 +383,17 @@ InternalMethods.prototype = {
           return;
         }
 
         if (response && response.verified) {
           // Bug 947056 - Server should be able to tell FxAccounts.jsm to back
           // off or stop polling altogether
           this.getUserAccountData()
             .then((data) => {
-              data.isVerified = true;
+              data.verified = true;
               return this.setUserAccountData(data);
             })
             .then((data) => {
               // Now that the user is verified, we can proceed to fetch keys
               if (this.whenVerifiedPromise) {
                 this.whenVerifiedPromise.resolve(data);
                 delete this.whenVerifiedPromise;
               }
@@ -451,38 +451,38 @@ this.FxAccounts = function(mockInternal)
     this.internal = internal;
   }
 }
 this.FxAccounts.prototype = Object.freeze({
   version: DATA_FORMAT_VERSION,
 
   // set() makes sure that polling is happening, if necessary.
   // get() does not wait for verification, and returns an object even if
-  // unverified. The caller of get() must check .isVerified .
+  // unverified. The caller of get() must check .verified .
   // The "fxaccounts:onlogin" event will fire only when the verified state
   // goes from false to true, so callers must register their observer
   // and then call get(). In particular, it will not fire when the account
   // was found to be verified in a previous boot: if our stored state says
   // the account is verified, the event will never fire. So callers must do:
   //   register notification observer (go)
   //   userdata = get()
-  //   if (userdata.isVerified()) {go()}
+  //   if (userdata.verified()) {go()}
 
   /**
    * Set the current user signed in to Firefox Accounts.
    *
    * @param credentials
    *        The credentials object obtained by logging in or creating
    *        an account on the FxA server:
    *        {
    *          email: The users email address
    *          uid: The user's unique id
    *          sessionToken: Session for the FxA server
    *          keyFetchToken: an unused keyFetchToken
-   *          isVerified: true/false
+   *          verified: true/false
    *        }
    * @return Promise
    *         The promise resolves to null when the data is saved
    *         successfully and is rejected on error.
    */
   setSignedInUser: function setSignedInUser(credentials) {
     log.debug("setSignedInUser - aborting any existing flows");
     internal.abortExistingFlow();
@@ -507,17 +507,17 @@ this.FxAccounts.prototype = Object.freez
    * @return Promise
    *        The promise resolves to the credentials object of the signed-in user:
    *        {
    *          email: The user's email address
    *          uid: The user's unique id
    *          sessionToken: Session for the FxA server
    *          kA: An encryption key from the FxA server
    *          kB: An encryption key derived from the user's FxA password
-   *          isVerified: email verification status
+   *          verified: email verification status
    *        }
    *        or null if no user is signed in.
    */
   getSignedInUser: function getSignedInUser() {
     return internal.getUserAccountData()
       .then((data) => {
         if (!data) {
           return null;
--- a/services/fxaccounts/FxAccountsClient.jsm
+++ b/services/fxaccounts/FxAccountsClient.jsm
@@ -83,17 +83,17 @@ this.FxAccountsClient.prototype = {
    *        The email address for the account (utf8)
    * @param password
    *        The user's password
    * @return Promise
    *        Returns a promise that resolves to an object:
    *        {
    *          uid: the user's unique ID
    *          sessionToken: a session token
-   *          isVerified: flag indicating verification status of the email
+   *          verified: flag indicating verification status of the email
    *        }
    */
   signIn: function signIn(email, password) {
     let hexEmail = stringToHex(email);
     return this._request("/raw_password/session/create", "POST", null,
                          {email: hexEmail, password: password});
   },
 
--- a/services/fxaccounts/tests/xpcshell/test_accounts.js
+++ b/services/fxaccounts/tests/xpcshell/test_accounts.js
@@ -133,17 +133,17 @@ add_task(function test_get_signed_in_use
   let account = new FxAccounts({onlySetInternal: true})
   let credentials = {
     email: "foo@example.com",
     uid: "1234@lcip.org",
     assertion: "foobar",
     sessionToken: "dead",
     kA: "beef",
     kB: "cafe",
-    isVerified: true
+    verified: true
   };
 
   let result = yield account.getSignedInUser();
   do_check_eq(result, null);
 
   yield account.setSignedInUser(credentials);
 
   let result = yield account.getSignedInUser();
@@ -198,27 +198,27 @@ add_test(function test_verification_poll
   let fxa = new MockFxAccounts();
   let test_user = getTestUser("francine");
 
   makeObserver("fxaccounts:onlogin", function() {
     log.debug("test_verification_poll observed onlogin");
     // Once email verification is complete, we will observe onlogin
     fxa.internal.getUserAccountData().then(user => {
       // And confirm that the user's state has changed
-      do_check_eq(user.isVerified, true);
+      do_check_eq(user.verified, true);
       do_check_eq(user.email, test_user.email);
       do_test_finished();
       run_next_test();
     });
   });
 
   fxa.setSignedInUser(test_user).then(() => {
     fxa.internal.getUserAccountData().then(user => {
       // The user is signing in, but email has not been verified yet
-      do_check_eq(user.isVerified, false);
+      do_check_eq(user.verified, false);
       do_timeout(200, function() {
         // Mock email verification ...
         fxa.internal.fxAccountsClient._email = test_user.email;
         fxa.internal.fxAccountsClient._verified = true;
       });
     });
   });
 });
@@ -263,31 +263,31 @@ add_test(function test_polling_timeout()
 });
 
 add_test(function test_getKeys() {
   do_test_pending();
   let fxa = new MockFxAccounts();
   let user = getTestUser("eusebius");
 
   // Once email has been verified, we will be able to get keys
-  user.isVerified = true;
+  user.verified = true;
 
   fxa.setSignedInUser(user).then(() => {
     fxa.getSignedInUser().then((user) => {
       // Before getKeys, we have no keys
       do_check_eq(!!user.kA, false);
       do_check_eq(!!user.kB, false);
       // And we still have a key-fetch token to use
       do_check_eq(!!user.keyFetchToken, true);
 
       fxa.internal.getKeys().then(() => {
         fxa.getSignedInUser().then((user) => {
           // Now we should have keys
           do_check_eq(fxa.internal.isUserEmailVerified(user), true);
-          do_check_eq(!!user.isVerified, true);
+          do_check_eq(!!user.verified, true);
           do_check_eq(user.kA, expandHex("11"));
           do_check_eq(user.kB, expandHex("66"));
           do_check_eq(user.keyFetchToken, undefined);
           do_test_finished();
           run_next_test();
         });
       });
     });
@@ -329,28 +329,28 @@ add_test(function test_overlapping_signi
   let alice = getTestUser("alice");
   let bob = getTestUser("bob");
 
   makeObserver("fxaccounts:onlogin", function() {
     log.debug("test_overlapping_signins observed onlogin");
     // Once email verification is complete, we will observe onlogin
     fxa.internal.getUserAccountData().then(user => {
       do_check_eq(user.email, bob.email);
-      do_check_eq(user.isVerified, true);
+      do_check_eq(user.verified, true);
       do_test_finished();
       run_next_test();
     });
   });
 
   // Alice is the user signing in; her email is unverified.
   fxa.setSignedInUser(alice).then(() => {
     log.debug("Alice signing in ...");
     fxa.internal.getUserAccountData().then(user => {
       do_check_eq(user.email, alice.email);
-      do_check_eq(user.isVerified, false);
+      do_check_eq(user.verified, false);
       log.debug("Alice has not verified her email ...");
 
       // Now Bob signs in instead and actually verifies his email
       log.debug("Bob signing in ...");
       fxa.setSignedInUser(bob).then(() => {
         do_timeout(200, function() {
           // Mock email verification ...
           log.debug("Bob verifying his email ...");
@@ -367,19 +367,19 @@ add_task(function test_getAssertion() {
   do_check_throws(function() {
     yield fxa.getAssertion("nonaudience");
   });
 
   let creds = {
     sessionToken: "sessionToken",
     kA: expandHex("11"),
     kB: expandHex("66"),
-    isVerified: true
+    verified: true
   };
-  // By putting kA/kB/isVerified in "creds", we skip ahead
+  // By putting kA/kB/verified in "creds", we skip ahead
   // to the "we're ready" stage.
   yield fxa.setSignedInUser(creds);
 
   _("== ready to go\n");
   let now = 138000000*1000;
   let start = Date.now();
   fxa._now_is = now;
   let d = fxa.getAssertion("audience.example.com");
@@ -466,17 +466,17 @@ function expandBytes(two_hex) {
 
 function getTestUser(name) {
   return {
     email: name + "@example.com",
     uid: "1ad7f502-4cc7-4ec1-a209-071fd2fae348",
     sessionToken: name + "'s session token",
     keyFetchToken: name + "'s keyfetch token",
     unwrapBKey: expandHex("44"),
-    isVerified: false
+    verified: false
   };
 }
 
 function makeObserver(aObserveTopic, aObserveFunc) {
   let observer = {
     // nsISupports provides type management in C++
     // nsIObserver is to be an observer
     QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIObserver]),
--- a/services/sync/modules-testing/utils.js
+++ b/services/sync/modules-testing/utils.js
@@ -71,17 +71,17 @@ this.makeIdentityConfig = function(overr
     fxaccount: {
       user: {
         assertion: 'assertion',
         email: 'email',
         kA: 'kA',
         kB: 'kB',
         sessionToken: 'sessionToken',
         uid: 'user_uid',
-        isVerified: true,
+        verified: true,
       },
       token: {
         endpoint: Svc.Prefs.get("tokenServerURI"),
         duration: 300,
         id: "id",
         key: "key",
         // uid will be set to the username.
       }
--- a/testing/mochitest/b2g-debug.json
+++ b/testing/mochitest/b2g-debug.json
@@ -187,21 +187,23 @@
 
     "content/html/content/test/test_iframe_sandbox_inheritance.html":"Crash, bug 904659",
     "content/html/content/test/test_iframe_sandbox_navigation2.html":"Crash, bug 904659",
     "content/html/content/test/test_iframe_sandbox_navigation.html":"Crash, bug 904659",
 
     "content/html/content/test/test_iframe_sandbox_popups.html":"multiple concurrent window.open()s fail on B2G",
     "content/html/content/test/test_iframe_sandbox_popups_inheritance.html":"multiple concurrent window.open()s fail on B2G",
     "content/html/content/test/test_iframe_sandbox_modal.html":"modal tests fail on B2G",
+    "content/html/content/test/test_mozaudiochannel.html":"Perma-orange on debug emulator",
 
     "content/html/content/test/test_iframe_sandbox_plugins.html":"plugins not supported",
     "content/html/content/test/test_object_plugin_nav.html":"plugins not supported",
     "content/html/document/test/test_bug741266.html":"needs control of popup window size",
     "docshell/test/navigation/test_popup-navigates-children.html":"Needs multiple window.open support, also uses docshelltreenode",
+    "docshell/test/navigation/test_sessionhistory.html":"Perma-orange on debug emulator builds",
     "docshell/test/test_bug590573.html":"queryinterfaces into webnavigation, might suffer from something similar as bug 823022",
     "dom/devicestorage/ipc/test_ipc.html":"nested ipc not working",
 
     "dom/indexedDB/ipc/test_ipc.html":"nested ipc not working",
     "dom/indexedDB/test/test_lowDiskSpace.html":"this needs probably modification for notifyObserversInParentProcess to be similar as pushPermissions",
 
     "content/base/test/test_object.html":"needs plugin support",