merge mozilla-inbound to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sat, 21 Oct 2017 00:05:19 +0200
changeset 440713 a9131757dfdd4f2820c397523b54386f9675d607
parent 440667 69998f1363be6b359dc68339892973687b4e834a (current diff)
parent 440712 279674b701a825da09e8994a471796cd297dfde7 (diff)
child 440714 21a7ca043b346e0db74c394deae9eaa0f1b4694a
child 440729 7570b63d4eae2b82f74debec8a0ba948486906ba
child 440741 4588832bab797cf65523c645c6699a9f333cc226
push id1618
push userCallek@gmail.com
push dateThu, 11 Jan 2018 17:45:48 +0000
treeherdermozilla-release@882ca853e05a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
a9131757dfdd / 58.0a1 / 20171020221129 / files
nightly linux64
a9131757dfdd / 58.0a1 / 20171020221129 / files
nightly mac
a9131757dfdd / 58.0a1 / 20171020221129 / files
nightly win32
a9131757dfdd / 58.0a1 / 20171020221129 / files
nightly win64
a9131757dfdd / 58.0a1 / 20171020221129 / 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 mozilla-inbound to mozilla-central. r=merge a=merge MozReview-Commit-ID: Gu7wIBFJOqe
browser/base/content/tabbrowser.xml
layout/reftests/writing-mode/reftest.list
taskcluster/ci/test/mochitest.yml
testing/web-platform/meta/MANIFEST.json
testing/web-platform/tests/assumptions/OWNERS
testing/web-platform/tests/assumptions/canvas-background-ref.html
testing/web-platform/tests/assumptions/canvas-background.html
testing/web-platform/tests/assumptions/html-elements.html
testing/web-platform/tests/assumptions/initial-color-ref.html
testing/web-platform/tests/assumptions/initial-color.html
testing/web-platform/tests/assumptions/medium-font-size-ref.html
testing/web-platform/tests/assumptions/medium-font-size.html
testing/web-platform/tests/assumptions/min-font-size-ref.html
testing/web-platform/tests/assumptions/min-font-size.html
testing/web-platform/tests/assumptions/tools/build.sh
testing/web-platform/tests/cssom/MediaList.xhtml
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-exception.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-idle-periods.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-iframe.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-invoked.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-multiple-calls.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-removed-frame.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-xhr-sync.html
testing/web-platform/tests/html/webappapis/idle-callbacks/cancel-invoked.html
testing/web-platform/tests/html/webappapis/idle-callbacks/idlharness.html
testing/web-platform/tests/html/webappapis/idle-callbacks/resources/post_name_on_load.html
testing/web-platform/tests/infrastructure/failing-test.html
testing/web-platform/tests/old-tests/submission/Microsoft/dragdrop/dragdrop_support.js
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_002.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_003.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_006.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_007.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_012.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_023.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_024.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_028.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_029.htm
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/sandbox.pdf
testing/web-platform/tests/old-tests/submission/Microsoft/sandbox/sandbox_011.htm
testing/web-platform/tests/old-tests/submission/Microsoft/structuredclone/echo.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/023.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/050.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/067.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/069.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/075.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/077.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/078.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/079.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/101.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/106-import.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/106-noimport.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/107-import.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/107-noimport.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/111.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/112.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/119.html
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/css/background.css
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/css/import.css
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/count-script-tags.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/find-body.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/find-foo.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-1.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-10.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-11.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-2.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-3.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-4.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-5.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-6.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-7.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-8.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/scripts/include-9.js
testing/web-platform/tests/progress-events/interface.html
testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.html
testing/web-platform/tests/webrtc/RTCDTMFSender-ontonechange-long.html
testing/web-platform/tests/webrtc/RTCDTMFSender-ontonechange.html
testing/web-platform/tests/webrtc/RTCPeerConnection-addTrack.html
testing/web-platform/tests/webrtc/RTCPeerConnection-ontrack.html
testing/web-platform/tests/webrtc/RTCPeerConnection-removeTrack.html
testing/web-platform/tests/webrtc/RTCRtpReceiver-getContributingSources.html
testing/web-platform/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.html
--- a/.cron.yml
+++ b/.cron.yml
@@ -104,11 +104,9 @@ jobs:
           treeherder-symbol: Nfile
           target-tasks-method: file_update
       run-on-projects:
           - mozilla-central
       when:
           by-project:
               # No default branch
               mozilla-central:
-                  # Buildbot start time is 10:02am UTC, until we are able to
-                  # disable buildbot scheduling, use +12h
-                  - {hour: 22, minute: 0}
+                  - {hour: 10, minute: 0}
--- a/accessible/ipc/win/PlatformChild.cpp
+++ b/accessible/ipc/win/PlatformChild.cpp
@@ -1,47 +1,52 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#include "mozilla/a11y/AccessibleHandler.h"
 #include "mozilla/a11y/Compatibility.h"
 #include "mozilla/a11y/PlatformChild.h"
 #include "mozilla/mscom/EnsureMTA.h"
 #include "mozilla/mscom/InterceptorLog.h"
 
 #include "Accessible2.h"
 #include "Accessible2_2.h"
 #include "AccessibleHypertext2.h"
+#include "AccessibleTable2.h"
 #include "AccessibleTableCell.h"
 
 #include "AccessibleHypertext2_i.c"
 
 namespace mozilla {
 namespace a11y {
 
 /**
  * Unfortunately the COM interceptor does not intrinsically handle array
  * outparams. Instead we manually define the relevant metadata here, and
  * register it in a call to mozilla::mscom::RegisterArrayData.
  * @see mozilla::mscom::ArrayData
  */
 static const mozilla::mscom::ArrayData sPlatformChildArrayData[] = {
   {IID_IEnumVARIANT, 3, 1, VT_DISPATCH, IID_IDispatch, 2},
   {IID_IAccessible2, 30, 1, VT_UNKNOWN | VT_BYREF, IID_IAccessibleRelation, 2},
-  {IID_IAccessibleRelation, 7, 1, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 2},
-  {IID_IAccessible2_2, 48, 2, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 3,
+  {IID_IAccessibleRelation, 7, 1, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 2},
+  {IID_IAccessible2_2, 48, 2, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 3,
    mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
-  {IID_IAccessibleTableCell, 4, 0, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 1,
+  {IID_IAccessibleTableCell, 4, 0, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 1,
    mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
-  {IID_IAccessibleTableCell, 7, 0, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 1,
+  {IID_IAccessibleTableCell, 7, 0, VT_UNKNOWN | VT_BYREF, NEWEST_IA2_IID, 1,
    mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
-  {IID_IAccessibleHypertext2, 25, 0, VT_UNKNOWN | VT_BYREF, IID_IUnknown, 1,
-   mozilla::mscom::ArrayData::Flag::eAllocatedByServer}
+  {IID_IAccessibleHypertext2, 25, 0, VT_UNKNOWN | VT_BYREF,
+   IID_IAccessibleHyperlink, 1,
+   mozilla::mscom::ArrayData::Flag::eAllocatedByServer},
+  {IID_IAccessibleTable2, 12, 0, VT_UNKNOWN | VT_BYREF,
+   NEWEST_IA2_IID, 1, mozilla::mscom::ArrayData::Flag::eAllocatedByServer}
 };
 
 // Type libraries are thread-neutral, so we can register those from any
 // apartment. OTOH, proxies must be registered from within the apartment where
 // we intend to instantiate them. Therefore RegisterProxy() must be called
 // via EnsureMTA.
 PlatformChild::PlatformChild()
   : mAccTypelib(mozilla::mscom::RegisterTypelib(L"oleacc.dll",
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1620,16 +1620,25 @@
                 // At this point, we now have a URI.
                 // Let's try to unescape it using a character set
                 // in case the URI is not ASCII.
                 try {
                   var characterSet = browser.characterSet;
                   const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
                                                  .getService(Components.interfaces.nsITextToSubURI);
                   title = textToSubURI.unEscapeNonAsciiURI(characterSet, title);
+                  // If it's a long data: URI that uses base64 encoding, truncate to
+                  // a reasonable length rather than trying to display the entire thing.
+                  // We can't shorten arbitrary URIs like this, as bidi etc might mean
+                  // we need the trailing characters for display. But a base64-encoded
+                  // data-URI is plain ASCII, so this is OK for tab-title display.
+                  // (See bug 1408854.)
+                  if (title.length > 500 && title.match(/^data:[^,]+;base64,/)) {
+                    title = title.substring(0, 500) + "\u2026";
+                  }
                 } catch (ex) { /* Do nothing. */ }
               } else {
                 // Still no title? Fall back to our untitled string.
                 title = gTabBrowserBundle.GetStringFromName("tabs.emptyTabTitle");
               }
             }
 
             return this._setTabLabel(aTab, title, { isContentTitle });
--- a/dom/base/nsNodeUtils.cpp
+++ b/dom/base/nsNodeUtils.cpp
@@ -623,16 +623,25 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNod
             aNode->OwnerDoc()->RegisterActivityObserver(aNode->AsElement());
           }
           return nullptr;
         }
       }
     }
   }
 
+  if (aNodesWithProperties && aNode->HasProperties()) {
+    bool ok = aNodesWithProperties->AppendObject(aNode);
+    MOZ_RELEASE_ASSERT(ok, "Out of memory");
+    if (aClone) {
+      ok = aNodesWithProperties->AppendObject(clone);
+      MOZ_RELEASE_ASSERT(ok, "Out of memory");
+    }
+  }
+
   if (aDeep && (!aClone || !aNode->IsNodeOfType(nsINode::eATTRIBUTE))) {
     // aNode's children.
     for (nsIContent* cloneChild = aNode->GetFirstChild();
          cloneChild;
          cloneChild = cloneChild->GetNextSibling()) {
       nsCOMPtr<nsINode> child =
         CloneAndAdopt(cloneChild, aClone, true, nodeInfoManager,
                       aReparentScope, aNodesWithProperties, clone,
@@ -682,28 +691,16 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNod
 #ifdef MOZ_XUL
   if (aClone && !aParent && aNode->IsXULElement()) {
     if (!aNode->OwnerDoc()->IsLoadedAsInteractiveData()) {
       clone->SetFlags(NODE_FORCE_XBL_BINDINGS);
     }
   }
 #endif
 
-  if (aNodesWithProperties && aNode->HasProperties()) {
-    bool ok = aNodesWithProperties->AppendObject(aNode);
-    if (aClone) {
-      ok = ok && aNodesWithProperties->AppendObject(clone);
-    }
-
-    if (NS_WARN_IF(!ok)) {
-      aError.Throw(NS_ERROR_OUT_OF_MEMORY);
-      return nullptr;
-    }
-  }
-
   return clone.forget();
 }
 
 
 /* static */
 void
 nsNodeUtils::UnlinkUserData(nsINode *aNode)
 {
--- a/dom/canvas/test/webgl-conf/generated-mochitest.ini
+++ b/dom/canvas/test/webgl-conf/generated-mochitest.ini
@@ -7830,17 +7830,17 @@ fail-if = (os == 'mac' && os_version == 
 [generated/test_conformance__glsl__misc__non-ascii-comments.vert.html]
 [generated/test_conformance__glsl__misc__non-ascii.vert.html]
 [generated/test_conformance__glsl__misc__re-compile-re-link.html]
 fail-if = (os == 'android' && android_version == '10')
 [generated/test_conformance__glsl__misc__sequence-operator-returns-constant.html]
 [generated/test_conformance__glsl__misc__shader-precision-format-obeyed.html]
 [generated/test_conformance__glsl__misc__shader-struct-scope.html]
 [generated/test_conformance__glsl__misc__shader-uniform-packing-restrictions.html]
-skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug)
+skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug) || (os == 'linux' && debug)
 [generated/test_conformance__glsl__misc__shader-varying-packing-restrictions.html]
 [generated/test_conformance__glsl__misc__shader-with-256-character-define.html]
 [generated/test_conformance__glsl__misc__shader-with-256-character-identifier.frag.html]
 [generated/test_conformance__glsl__misc__shader-with-257-character-define.html]
 [generated/test_conformance__glsl__misc__shader-with-257-character-identifier.frag.html]
 [generated/test_conformance__glsl__misc__shader-with-_webgl-identifier.vert.html]
 [generated/test_conformance__glsl__misc__shader-with-arbitrary-indexing.frag.html]
 [generated/test_conformance__glsl__misc__shader-with-arbitrary-indexing.vert.html]
--- a/dom/canvas/test/webgl-conf/mochitest-errata.ini
+++ b/dom/canvas/test/webgl-conf/mochitest-errata.ini
@@ -528,18 +528,18 @@ fail-if = (os == 'android' && android_ve
 skip-if = (os == 'android')
 ####################
 # Timeouts
 [generated/test_conformance__context__context-release-upon-reload.html]
 skip-if = (os == 'android')
 [generated/test_conformance__context__context-release-with-workers.html]
 skip-if = (os == 'android')
 [generated/test_conformance__glsl__misc__shader-uniform-packing-restrictions.html]
-# Frequent timeout on win7 debug.
-skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug)
+# Frequent timeout on win7 and linux debug.
+skip-if = (os == 'android') || (os == 'win' && os_version == '6.1' && debug) || (os == 'linux' && debug)
 [generated/test_conformance__glsl__bugs__complex-glsl-does-not-crash.html]
 skip-if = (os == 'android')
 
 [generated/test_conformance__glsl__misc__shader-with-non-reserved-words.html]
 fail-if = (os == 'android')
 # (TODO) Generates results after calling finish()
 skip-if = 1
 
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -232,17 +232,17 @@ public:
   /**
    * this can be in response to our own RemoveListener() (via ::Remove()), or
    * because the DOM GC'd the DOMLocalMediaStream/etc we're attached to.
    */
   void NotifyRemoved();
 
   bool Activated() const
   {
-    return mActivated;
+    return mStream;
   }
 
   bool Stopped() const
   {
     return mStopped;
   }
 
   bool CapturingVideo() const;
@@ -261,20 +261,16 @@ public:
   ApplyConstraintsToTrack(nsPIDOMWindowInner* aWindow,
                           TrackID aTrackID,
                           const dom::MediaTrackConstraints& aConstraints,
                           dom::CallerType aCallerType);
 
   PrincipalHandle GetPrincipalHandle() const;
 
 private:
-  // true after this listener has been Activate()d in a WindowListener.
-  // MainThread only.
-  bool mActivated;
-
   // true after this listener has had all devices stopped. MainThread only.
   bool mStopped;
 
   // true after the stream this listener is listening to has finished in the
   // MediaStreamGraph. MainThread only.
   bool mFinished;
 
   // true after this listener has been removed from its MediaStream.
@@ -3540,18 +3536,17 @@ MediaManager::IsActivelyCapturingOrHasAP
       return false;
     }
   }
   return audio == nsIPermissionManager::ALLOW_ACTION ||
          video == nsIPermissionManager::ALLOW_ACTION;
 }
 
 SourceListener::SourceListener()
-  : mActivated(false)
-  , mStopped(false)
+  : mStopped(false)
   , mFinished(false)
   , mRemoved(false)
   , mAudioStopped(false)
   , mVideoStopped(false)
   , mMainThreadCheck(nullptr)
   , mPrincipalHandle(PRINCIPAL_HANDLE_NONE)
   , mWindowListener(nullptr)
 {}
@@ -3560,17 +3555,17 @@ void
 SourceListener::Register(GetUserMediaWindowListener* aListener)
 {
   LOG(("SourceListener %p registering with window listener %p", this, aListener));
 
   if (mWindowListener) {
     MOZ_ASSERT(false, "Already registered");
     return;
   }
-  if (mActivated) {
+  if (Activated()) {
     MOZ_ASSERT(false, "Already activated");
     return;
   }
   if (!aListener) {
     MOZ_ASSERT(false, "No listener");
     return;
   }
   mPrincipalHandle = aListener->GetPrincipalHandle();
@@ -3581,22 +3576,26 @@ void
 SourceListener::Activate(SourceMediaStream* aStream,
                          AudioDevice* aAudioDevice,
                          VideoDevice* aVideoDevice)
 {
   MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread");
 
   LOG(("SourceListener %p activating audio=%p video=%p", this, aAudioDevice, aVideoDevice));
 
-  if (mActivated) {
+  if (mStopped) {
+    MOZ_ASSERT(false, "Cannot activate stopped source listener");
+    return;
+  }
+
+  if (Activated()) {
     MOZ_ASSERT(false, "Already activated");
     return;
   }
 
-  mActivated = true;
   mMainThreadCheck = GetCurrentVirtualThread();
   mStream = aStream;
   mAudioDevice = aAudioDevice;
   mVideoDevice = aVideoDevice;
   mStream->AddListener(this);
 }
 
 void
@@ -3611,23 +3610,34 @@ SourceListener::Stop()
   LOG(("SourceListener %p stopping", this));
 
   // StopSharing() has some special logic, at least for audio capture.
   // It must be called when all tracks have stopped, before setting mStopped.
   StopSharing();
 
   mStopped = true;
 
+  if (!Activated()) {
+    MOZ_ASSERT(false, "There are no devices or any source stream to stop");
+    return;
+  }
+
   if (mAudioDevice && !mAudioStopped) {
     StopTrack(kAudioTrack);
   }
   if (mVideoDevice && !mVideoStopped) {
     StopTrack(kVideoTrack);
   }
-  RefPtr<SourceMediaStream> source = GetSourceStream();
+
+  RefPtr<SourceMediaStream> source = mStream;
+  if (!source) {
+    MOZ_ASSERT(false, "Can't end tracks. No source stream.");
+    return;
+  }
+
   MediaManager::PostTask(NewTaskFrom([source]() {
     MOZ_ASSERT(MediaManager::IsInMediaThread());
     source->EndAllTrackAndFinish();
   }));
 }
 
 void
 SourceListener::Remove()
@@ -3648,55 +3658,58 @@ SourceListener::Remove()
 }
 
 void
 SourceListener::StopTrack(TrackID aTrackID)
 {
   MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread");
 
   RefPtr<MediaDevice> device;
-  RefPtr<SourceMediaStream> source;
+
+  if (!Activated()) {
+    MOZ_ASSERT(false, "No device to stop");
+    return;
+  }
 
   switch (aTrackID) {
     case kAudioTrack: {
       LOG(("SourceListener %p stopping audio track %d", this, aTrackID));
       if (!mAudioDevice) {
         NS_ASSERTION(false, "Can't stop audio. No device.");
         return;
       }
       if (mAudioStopped) {
         // Audio already stopped
         return;
       }
       device = mAudioDevice;
-      source = GetSourceStream();
       mAudioStopped = true;
       break;
     }
     case kVideoTrack: {
       LOG(("SourceListener %p stopping video track %d", this, aTrackID));
       if (!mVideoDevice) {
         NS_ASSERTION(false, "Can't stop video. No device.");
         return;
       }
       if (mVideoStopped) {
         // Video already stopped
         return;
       }
       device = mVideoDevice;
-      source = GetSourceStream();
       mVideoStopped = true;
       break;
     }
     default: {
       MOZ_ASSERT(false, "Unknown track id");
       return;
     }
   }
 
+  RefPtr<SourceMediaStream> source = mStream;
   MediaManager::PostTask(NewTaskFrom([device, source, aTrackID]() {
     device->GetSource()->Stop(source, aTrackID);
     device->Deallocate();
   }));
 
   if ((!mAudioDevice || mAudioStopped) &&
       (!mVideoDevice || mVideoStopped)) {
     LOG(("SourceListener %p this was the last track stopped", this));
@@ -3743,20 +3756,17 @@ SourceListener::StopSharing()
     mStream->Destroy();
   }
 }
 
 SourceMediaStream*
 SourceListener::GetSourceStream()
 {
   NS_ASSERTION(mStream,"Getting stream from never-activated SourceListener");
-  if (!mStream) {
-    return nullptr;
-  }
-  return mStream->AsSourceStream();
+  return mStream;
 }
 
 void
 SourceListener::GetSettings(dom::MediaTrackSettings& aOutSettings, TrackID aTrackID)
 {
   switch (aTrackID) {
     case kVideoTrack: {
       if (mVideoDevice) {
@@ -3851,76 +3861,76 @@ SourceListener::NotifyFinished()
 
 void
 SourceListener::NotifyRemoved()
 {
   MOZ_ASSERT(NS_IsMainThread());
   LOG(("SourceListener removed, mFinished = %d", (int) mFinished));
   mRemoved = true;
 
-  if (!mFinished) {
+  if (Activated() && !mFinished) {
     NotifyFinished();
   }
 
   mWindowListener = nullptr;
 }
 
 bool
 SourceListener::CapturingVideo() const
 {
   MOZ_ASSERT(NS_IsMainThread());
-  return mActivated && mVideoDevice && !mVideoStopped &&
+  return Activated() && mVideoDevice && !mVideoStopped &&
          !mVideoDevice->GetSource()->IsAvailable() &&
          mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Camera &&
          (!mVideoDevice->GetSource()->IsFake() ||
           Preferences::GetBool("media.navigator.permission.fake"));
 }
 
 bool
 SourceListener::CapturingAudio() const
 {
   MOZ_ASSERT(NS_IsMainThread());
-  return mActivated && mAudioDevice && !mAudioStopped &&
+  return Activated() && mAudioDevice && !mAudioStopped &&
          !mAudioDevice->GetSource()->IsAvailable() &&
          (!mAudioDevice->GetSource()->IsFake() ||
           Preferences::GetBool("media.navigator.permission.fake"));
 }
 
 bool
 SourceListener::CapturingScreen() const
 {
   MOZ_ASSERT(NS_IsMainThread());
-  return mActivated && mVideoDevice && !mVideoStopped &&
+  return Activated() && mVideoDevice && !mVideoStopped &&
          !mVideoDevice->GetSource()->IsAvailable() &&
          mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Screen;
 }
 
 bool
 SourceListener::CapturingWindow() const
 {
   MOZ_ASSERT(NS_IsMainThread());
-  return mActivated && mVideoDevice && !mVideoStopped &&
+  return Activated() && mVideoDevice && !mVideoStopped &&
          !mVideoDevice->GetSource()->IsAvailable() &&
          mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Window;
 }
 
 bool
 SourceListener::CapturingApplication() const
 {
   MOZ_ASSERT(NS_IsMainThread());
-  return mActivated && mVideoDevice && !mVideoStopped &&
+  return Activated() && mVideoDevice && !mVideoStopped &&
          !mVideoDevice->GetSource()->IsAvailable() &&
          mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Application;
 }
 
 bool
 SourceListener::CapturingBrowser() const
 {
   MOZ_ASSERT(NS_IsMainThread());
-  return mActivated && mVideoDevice && !mVideoStopped &&
+  return Activated() && mVideoDevice && !mVideoStopped &&
          !mVideoDevice->GetSource()->IsAvailable() &&
          mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Browser;
 }
 
 already_AddRefed<PledgeVoid>
 SourceListener::ApplyConstraintsToTrack(
     nsPIDOMWindowInner* aWindow,
     TrackID aTrackID,
copy from extensions/cookie/test/unit/test_cookies_thirdparty_session.js
copy to extensions/cookie/test/unit/test_cookies_thirdparty_nonsecure_session.js
--- a/extensions/cookie/test/unit/test_cookies_thirdparty_session.js
+++ b/extensions/cookie/test/unit/test_cookies_thirdparty_nonsecure_session.js
@@ -1,14 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// test third party persistence across sessions, for the cases:
-// 1) network.cookie.thirdparty.sessionOnly = false
-// 2) network.cookie.thirdparty.sessionOnly = true
+// test nonsecure third party persistence across sessions, for the cases:
+// 1) network.cookie.thirdparty.nonsecureSessionOnly = false
+// 2) network.cookie.thirdparty.nonsecureSessionOnly = true
+
+"use strict";
 
 var test_generator = do_run_test();
 
 function run_test() {
   do_test_pending();
   test_generator.next();
 }
 
@@ -21,49 +23,49 @@ function finish_test() {
 
 function* do_run_test() {
   // Set up a profile.
   let profile = do_get_profile();
 
   // Create URIs and channels pointing to foo.com and bar.com.
   // We will use these to put foo.com into first and third party contexts.
   var spec1 = "http://foo.com/foo.html";
-  var spec2 = "http://bar.com/bar.html";
+  var spec2 = "https://bar.com/bar.html";
   var uri1 = NetUtil.newURI(spec1);
   var uri2 = NetUtil.newURI(spec2);
   var channel1 = NetUtil.newChannel({uri: uri1, loadUsingSystemPrincipal: true});
   var channel2 = NetUtil.newChannel({uri: uri2, loadUsingSystemPrincipal: true});
 
   // Force the channel URI to be used when determining the originating URI of
   // the channel.
   var httpchannel1 = channel1.QueryInterface(Ci.nsIHttpChannelInternal);
   var httpchannel2 = channel2.QueryInterface(Ci.nsIHttpChannelInternal);
   httpchannel1.forceAllowThirdPartyCookie = true;
   httpchannel2.forceAllowThirdPartyCookie = true;
 
-  // test with cookies enabled, and third party cookies persistent.
+  // test with cookies enabled and nonsecure third party cookies persistent.
   Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
-  Services.prefs.setBoolPref("network.cookie.thirdparty.sessionOnly", false);
-  do_set_cookies(uri1, channel2, false, [1, 2, 3, 4]);
-  do_set_cookies(uri2, channel1, true, [1, 2, 3, 4]);
+  Services.prefs.setBoolPref("network.cookie.thirdparty.nonsecureSessionOnly", false);
+  do_set_cookies(uri1, channel2, false, [1, 2, 3, 4]); // third-party HTTP
+  do_set_cookies(uri2, channel1, false, [1, 2, 3, 4]); // third-party HTTPS
 
   // fake a profile change
   do_close_profile(test_generator);
   yield;
   do_load_profile();
-  do_check_eq(Services.cookies.countCookiesFromHost(uri1.host), 4);
-  do_check_eq(Services.cookies.countCookiesFromHost(uri2.host), 0);
+  do_check_eq(Services.cookies.countCookiesFromHost(uri1.host), 4); // HTTP cookies OK
+  do_check_eq(Services.cookies.countCookiesFromHost(uri2.host), 4); // HTTPS cookies OK
 
-  // test with third party cookies for session only.
-  Services.prefs.setBoolPref("network.cookie.thirdparty.sessionOnly", true);
+  // test with nonsecure third party cookies for session only.
+  Services.prefs.setBoolPref("network.cookie.thirdparty.nonsecureSessionOnly", true);
   Services.cookies.removeAll();
-  do_set_cookies(uri1, channel2, false, [1, 2, 3, 4]);
-  do_set_cookies(uri2, channel1, true, [1, 2, 3, 4]);
+  do_set_cookies(uri1, channel2, false, [1, 2, 3, 4]); // third-party HTTP
+  do_set_cookies(uri2, channel1, false, [1, 2, 3, 4]); // third-party HTTPS
 
   // fake a profile change
   do_close_profile(test_generator);
   yield;
   do_load_profile();
-  do_check_eq(Services.cookies.countCookiesFromHost(uri1.host), 0);
-  do_check_eq(Services.cookies.countCookiesFromHost(uri2.host), 0);
+  do_check_eq(Services.cookies.countCookiesFromHost(uri1.host), 0); // no HTTP cookies!
+  do_check_eq(Services.cookies.countCookiesFromHost(uri2.host), 4); // HTTPS cookies OK
 
   finish_test();
 }
--- a/extensions/cookie/test/unit/xpcshell.ini
+++ b/extensions/cookie/test/unit/xpcshell.ini
@@ -8,16 +8,17 @@ skip-if = toolkit == 'android'
 [test_cookies_async_failure.js]
 [test_cookies_persistence.js]
 skip-if = true # Bug 863738
 [test_cookies_privatebrowsing.js]
 [test_cookies_profile_close.js]
 [test_cookies_read.js]
 [test_cookies_sync_failure.js]
 [test_cookies_thirdparty.js]
+[test_cookies_thirdparty_nonsecure_session.js]
 [test_cookies_thirdparty_session.js]
 [test_domain_eviction.js]
 [test_eviction.js]
 [test_permmanager_default_pref.js]
 [test_permmanager_defaults.js]
 [test_permmanager_expiration.js]
 [test_permmanager_getAllForURI.js]
 [test_permmanager_getPermissionObject.js]
--- a/gfx/layers/ipc/PWebRenderBridge.ipdl
+++ b/gfx/layers/ipc/PWebRenderBridge.ipdl
@@ -49,21 +49,16 @@ parent:
 
   sync Create(IntSize aSize);
   async DeleteCompositorAnimations(uint64_t[] aIds);
   async SetDisplayList(IntSize aSize, WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
                        LayoutSize aContentSize, ByteBuffer aDL, BuiltDisplayListDescriptor aDLDesc,
                        WebRenderScrollData aScrollData,
                        OpUpdateResource[] aResourceUpdates, Shmem[] aSmallShmems, Shmem[] aLargeShmems,
                        IdNamespace aIdNamespace, TimeStamp txnStartTime, TimeStamp fwdTime);
-  sync SetDisplayListSync(IntSize aSize, WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
-                          LayoutSize aContentSize, ByteBuffer aDL, BuiltDisplayListDescriptor aDLDesc,
-                          WebRenderScrollData aScrollData,
-                          OpUpdateResource[] aResourceUpdates, Shmem[] aSmallShmems, Shmem[] aLargeShmems,
-                          IdNamespace aIdNamespace, TimeStamp txnStartTime, TimeStamp fwdTime);
   async EmptyTransaction(FocusTarget focusTarget,
                          WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
                          IdNamespace aIdNamespace, TimeStamp txnStartTime, TimeStamp fwdTime);
   async SetFocusTarget(FocusTarget focusTarget);
   async UpdateResources(OpUpdateResource[] aResourceUpdates, Shmem[] aSmallShmems, Shmem[] aLargeShmems);
   async ParentCommands(WebRenderParentCommand[] commands);
   sync GetSnapshot(PTexture texture);
   async AddPipelineIdForCompositable(PipelineId aImageId, CompositableHandle aHandle, bool aAsync);
--- a/gfx/layers/wr/AsyncImagePipelineManager.cpp
+++ b/gfx/layers/wr/AsyncImagePipelineManager.cpp
@@ -267,17 +267,20 @@ AsyncImagePipelineManager::ApplyAsyncIma
 
     nsTArray<wr::ImageKey> keys;
     auto op = UpdateImageKeys(resourceUpdates, pipeline, keys);
 
     if (op != Some(TextureHost::ADD_IMAGE)) {
       // We don't need to update the display list, either because we can't or because
       // the previous one is still up to date.
       // We may, however, have updated some resources.
-      mApi->UpdateResources(resourceUpdates);
+      mApi->UpdatePipelineResources(resourceUpdates, pipelineId, epoch);
+      if (pipeline->mCurrentTexture) {
+        HoldExternalImage(pipelineId, epoch, pipeline->mCurrentTexture->AsWebRenderTextureHost());
+      }
       continue;
     }
 
     wr::LayoutSize contentSize { pipeline->mScBounds.Width(), pipeline->mScBounds.Height() };
     wr::DisplayListBuilder builder(pipelineId, contentSize);
 
     MOZ_ASSERT(!keys.IsEmpty());
     MOZ_ASSERT(pipeline->mCurrentTexture.get());
--- a/gfx/layers/wr/WebRenderBridgeChild.cpp
+++ b/gfx/layers/wr/WebRenderBridgeChild.cpp
@@ -117,17 +117,16 @@ WebRenderBridgeChild::UpdateResources(wr
   this->SendUpdateResources(resourceUpdates, Move(smallShmems), Move(largeShmems));
 }
 
 void
 WebRenderBridgeChild::EndTransaction(const wr::LayoutSize& aContentSize,
                                      wr::BuiltDisplayList& aDL,
                                      wr::IpcResourceUpdateQueue& aResources,
                                      const gfx::IntSize& aSize,
-                                     bool aIsSync,
                                      uint64_t aTransactionId,
                                      const WebRenderScrollData& aScrollData,
                                      const mozilla::TimeStamp& aTxnStartTime)
 {
   MOZ_ASSERT(!mDestroyed);
   MOZ_ASSERT(mIsInTransaction);
 
   ByteBuffer dlData(Move(aDL.dl));
@@ -137,29 +136,21 @@ WebRenderBridgeChild::EndTransaction(con
   fwdTime = TimeStamp::Now();
 #endif
 
   nsTArray<OpUpdateResource> resourceUpdates;
   nsTArray<ipc::Shmem> smallShmems;
   nsTArray<ipc::Shmem> largeShmems;
   aResources.Flush(resourceUpdates, smallShmems, largeShmems);
 
-  if (aIsSync) {
-    this->SendSetDisplayListSync(aSize, mParentCommands, mDestroyedActors,
-                                 GetFwdTransactionId(), aTransactionId,
-                                 aContentSize, dlData, aDL.dl_desc, aScrollData,
-                                 Move(resourceUpdates), Move(smallShmems), Move(largeShmems),
-                                 mIdNamespace, aTxnStartTime, fwdTime);
-  } else {
-    this->SendSetDisplayList(aSize, mParentCommands, mDestroyedActors,
-                             GetFwdTransactionId(), aTransactionId,
-                             aContentSize, dlData, aDL.dl_desc, aScrollData,
-                             Move(resourceUpdates), Move(smallShmems), Move(largeShmems),
-                             mIdNamespace, aTxnStartTime, fwdTime);
-  }
+  this->SendSetDisplayList(aSize, mParentCommands, mDestroyedActors,
+                           GetFwdTransactionId(), aTransactionId,
+                           aContentSize, dlData, aDL.dl_desc, aScrollData,
+                           Move(resourceUpdates), Move(smallShmems), Move(largeShmems),
+                           mIdNamespace, aTxnStartTime, fwdTime);
 
   mParentCommands.Clear();
   mDestroyedActors.Clear();
   mIsInTransaction = false;
 }
 
 void
 WebRenderBridgeChild::EndEmptyTransaction(const FocusTarget& aFocusTarget,
--- a/gfx/layers/wr/WebRenderBridgeChild.h
+++ b/gfx/layers/wr/WebRenderBridgeChild.h
@@ -68,17 +68,17 @@ public:
   void AddWebRenderParentCommands(const nsTArray<WebRenderParentCommand>& aCommands);
 
   void UpdateResources(wr::IpcResourceUpdateQueue& aResources);
   void BeginTransaction();
   void EndTransaction(const wr::LayoutSize& aContentSize,
                       wr::BuiltDisplayList& dl,
                       wr::IpcResourceUpdateQueue& aResources,
                       const gfx::IntSize& aSize,
-                      bool aIsSync, uint64_t aTransactionId,
+                      uint64_t aTransactionId,
                       const WebRenderScrollData& aScrollData,
                       const mozilla::TimeStamp& aTxnStartTime);
   void EndEmptyTransaction(const FocusTarget& aFocusTarget,
                            uint64_t aTransactionId,
                            const mozilla::TimeStamp& aTxnStartTime);
   void ProcessWebRenderParentCommands();
 
   CompositorBridgeChild* GetCompositorBridgeChild();
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -586,40 +586,16 @@ WebRenderBridgeParent::RecvSetDisplayLis
   }
 
   DeallocShmems(aSmallShmems);
   DeallocShmems(aLargeShmems);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
-WebRenderBridgeParent::RecvSetDisplayListSync(const gfx::IntSize &aSize,
-                                              InfallibleTArray<WebRenderParentCommand>&& aCommands,
-                                              InfallibleTArray<OpDestroy>&& aToDestroy,
-                                              const uint64_t& aFwdTransactionId,
-                                              const uint64_t& aTransactionId,
-                                              const wr::LayoutSize& aContentSize,
-                                              const wr::ByteBuffer& dl,
-                                              const wr::BuiltDisplayListDescriptor& dlDesc,
-                                              const WebRenderScrollData& aScrollData,
-                                              nsTArray<OpUpdateResource>&& aResourceUpdates,
-                                              nsTArray<ipc::Shmem>&& aSmallShmems,
-                                              nsTArray<ipc::Shmem>&& aLargeShmems,
-                                              const wr::IdNamespace& aIdNamespace,
-                                              const TimeStamp& aTxnStartTime,
-                                              const TimeStamp& aFwdTime)
-{
-  return RecvSetDisplayList(aSize, Move(aCommands), Move(aToDestroy),
-                            aFwdTransactionId, aTransactionId,
-                            aContentSize, dl, dlDesc, aScrollData,
-                            Move(aResourceUpdates), Move(aSmallShmems), Move(aLargeShmems),
-                            aIdNamespace, aTxnStartTime, aFwdTime);
-}
-
-mozilla::ipc::IPCResult
 WebRenderBridgeParent::RecvEmptyTransaction(const FocusTarget& aFocusTarget,
                                             InfallibleTArray<WebRenderParentCommand>&& aCommands,
                                             InfallibleTArray<OpDestroy>&& aToDestroy,
                                             const uint64_t& aFwdTransactionId,
                                             const uint64_t& aTransactionId,
                                             const wr::IdNamespace& aIdNamespace,
                                             const TimeStamp& aTxnStartTime,
                                             const TimeStamp& aFwdTime)
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -86,31 +86,16 @@ public:
                                              const wr::BuiltDisplayListDescriptor& dlDesc,
                                              const WebRenderScrollData& aScrollData,
                                              nsTArray<OpUpdateResource>&& aResourceUpdates,
                                              nsTArray<ipc::Shmem>&& aSmallShmems,
                                              nsTArray<ipc::Shmem>&& aLargeShmems,
                                              const wr::IdNamespace& aIdNamespace,
                                              const TimeStamp& aTxnStartTime,
                                              const TimeStamp& aFwdTime) override;
-  mozilla::ipc::IPCResult RecvSetDisplayListSync(const gfx::IntSize& aSize,
-                                                 InfallibleTArray<WebRenderParentCommand>&& aCommands,
-                                                 InfallibleTArray<OpDestroy>&& aToDestroy,
-                                                 const uint64_t& aFwdTransactionId,
-                                                 const uint64_t& aTransactionId,
-                                                 const wr::LayoutSize& aContentSize,
-                                                 const wr::ByteBuffer& dl,
-                                                 const wr::BuiltDisplayListDescriptor& dlDesc,
-                                                 const WebRenderScrollData& aScrollData,
-                                                 nsTArray<OpUpdateResource>&& aResourceUpdates,
-                                                 nsTArray<ipc::Shmem>&& aSmallShmems,
-                                                 nsTArray<ipc::Shmem>&& aLargeShmems,
-                                                 const wr::IdNamespace& aIdNamespace,
-                                                 const TimeStamp& aTxnStartTime,
-                                                 const TimeStamp& aFwdTime) override;
   mozilla::ipc::IPCResult RecvEmptyTransaction(const FocusTarget& aFocusTarget,
                                                InfallibleTArray<WebRenderParentCommand>&& aCommands,
                                                InfallibleTArray<OpDestroy>&& aToDestroy,
                                                const uint64_t& aFwdTransactionId,
                                                const uint64_t& aTransactionId,
                                                const wr::IdNamespace& aIdNamespace,
                                                const TimeStamp& aTxnStartTime,
                                                const TimeStamp& aFwdTime) override;
--- a/gfx/layers/wr/WebRenderImageHost.cpp
+++ b/gfx/layers/wr/WebRenderImageHost.cpp
@@ -183,16 +183,17 @@ WebRenderImageHost::GetAsTextureHostForC
 void
 WebRenderImageHost::SetCurrentTextureHost(TextureHost* aTexture)
 {
   if (aTexture == mCurrentTextureHost.get()) {
     return;
   }
 
   if (mWrBridge &&
+      !mAsyncRef &&
       !!mCurrentTextureHost &&
       mCurrentTextureHost != aTexture &&
       mCurrentTextureHost->AsWebRenderTextureHost()) {
     MOZ_ASSERT(mWrBridge->AsyncImageManager());
     wr::PipelineId piplineId = mWrBridge->PipelineId();
     wr::Epoch epoch = mWrBridge->WrEpoch();
     mWrBridge->AsyncImageManager()->HoldExternalImage(
       piplineId,
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -294,17 +294,16 @@ WebRenderLayerManager::EndTransactionWit
 
     if (mIsFirstPaint) {
       mScrollData.SetIsFirstPaint();
       mIsFirstPaint = false;
     }
     mScrollData.SetPaintSequenceNumber(mPaintSequenceNumber);
   }
 
-  bool sync = mTarget != nullptr;
   mLatestTransactionId = mTransactionIdAllocator->GetTransactionId(/*aThrottle*/ true);
   TimeStamp transactionStart = mTransactionIdAllocator->GetTransactionStart();
 
   for (const auto& key : mImageKeysToDelete) {
     resourceUpdates.DeleteImage(key);
   }
   mImageKeysToDelete.Clear();
   mImageKeysToDelete.SwapElements(mImageKeysToDeleteLater);
@@ -318,19 +317,18 @@ WebRenderLayerManager::EndTransactionWit
     }
   }
 
   wr::BuiltDisplayList dl;
   builder.Finalize(contentSize, dl);
   mLastDisplayListSize = dl.dl.inner.capacity;
 
   {
-    AUTO_PROFILER_TRACING("Paint", sync ? "ForwardDPTransactionSync"
-                                        : "ForwardDPTransaction");
-    WrBridge()->EndTransaction(contentSize, dl, resourceUpdates, size.ToUnknownSize(), sync,
+    AUTO_PROFILER_TRACING("Paint", "ForwardDPTransaction");
+    WrBridge()->EndTransaction(contentSize, dl, resourceUpdates, size.ToUnknownSize(),
                                mLatestTransactionId, mScrollData, transactionStart);
   }
 
   MakeSnapshotIfRequired(size);
   mNeedsComposite = false;
 
   ClearDisplayItemLayers();
 }
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -2970,17 +2970,17 @@ inline static bool HasSpaces(const char1
 template<typename T>
 bool
 gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
                              gfxTextRun *aTextRun,
                              const T *aString, // text for this font run
                              uint32_t aRunStart, // position in the textrun
                              uint32_t aRunLength,
                              Script aRunScript,
-                             bool aVertical)
+                             ShapedTextFlags aOrientation)
 {
     if (aRunLength == 0) {
         return true;
     }
 
     gfxTextPerfMetrics *tp = nullptr;
     RoundingFlags rounding = GetRoundOffsetsToPixels(aDrawTarget);
 
@@ -2997,27 +2997,30 @@ gfxFont::SplitAndInitTextRun(DrawTarget 
             tp->current.maxTextRunLen = aRunLength;
         }
     }
 #endif
 
     uint32_t wordCacheCharLimit =
         gfxPlatform::GetPlatform()->WordCacheCharLimit();
 
+    bool vertical =
+        aOrientation == ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
+
     // If spaces can participate in shaping (e.g. within lookups for automatic
     // fractions), need to shape without using the word cache which segments
     // textruns on space boundaries. Word cache can be used if the textrun
     // is short enough to fit in the word cache and it lacks spaces.
     if (SpaceMayParticipateInShaping(aRunScript)) {
         if (aRunLength > wordCacheCharLimit ||
             HasSpaces(aString, aRunLength)) {
             TEXT_PERF_INCR(tp, wordCacheSpaceRules);
             return ShapeTextWithoutWordCache(aDrawTarget, aString,
                                              aRunStart, aRunLength,
-                                             aRunScript, aVertical,
+                                             aRunScript, vertical,
                                              rounding, aTextRun);
         }
     }
 
     InitWordCache();
 
     // the only flags we care about for ShapedWord construction/caching
     gfx::ShapedTextFlags flags = aTextRun->GetFlags();
@@ -3060,17 +3063,17 @@ gfxFont::SplitAndInitTextRun(DrawTarget 
         // font's word cache but just shape directly into the textrun.
         if (length > wordCacheCharLimit) {
             TEXT_PERF_INCR(tp, wordCacheLong);
             bool ok = ShapeFragmentWithoutWordCache(aDrawTarget,
                                                     aString + wordStart,
                                                     aRunStart + wordStart,
                                                     length,
                                                     aRunScript,
-                                                    aVertical,
+                                                    vertical,
                                                     rounding,
                                                     aTextRun);
             if (!ok) {
                 return false;
             }
         } else if (length > 0) {
             gfx::ShapedTextFlags wordFlags = flags;
             // in the 8-bit version of this method, TEXT_IS_8BIT was
@@ -3078,49 +3081,45 @@ gfxFont::SplitAndInitTextRun(DrawTarget 
             // adjustment here
             if (sizeof(T) == sizeof(char16_t)) {
                 if (wordIs8Bit) {
                     wordFlags |= gfx::ShapedTextFlags::TEXT_IS_8BIT;
                 }
             }
             gfxShapedWord* sw = GetShapedWord(aDrawTarget,
                                               aString + wordStart, length,
-                                              hash, aRunScript, aVertical,
+                                              hash, aRunScript, vertical,
                                               appUnitsPerDevUnit,
                                               wordFlags, rounding, tp);
             if (sw) {
                 aTextRun->CopyGlyphDataFrom(sw, aRunStart + wordStart);
             } else {
                 return false; // failed, presumably out of memory?
             }
         }
 
         if (boundary) {
             // word was terminated by a space: add that to the textrun
-            gfx::ShapedTextFlags orientation =
-                flags & gfx::ShapedTextFlags::TEXT_ORIENT_MASK;
-            if (orientation == gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_MIXED) {
-                orientation = aVertical ?
-                    gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT :
-                    gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_SIDEWAYS_RIGHT;
-            }
+            MOZ_ASSERT(aOrientation !=
+                       ShapedTextFlags::TEXT_ORIENT_VERTICAL_MIXED,
+                       "text-orientation:mixed should be resolved earlier");
             if (boundary != ' ' ||
                 !aTextRun->SetSpaceGlyphIfSimple(this, aRunStart + i, ch,
-                                                 orientation)) {
+                                                 aOrientation)) {
                 // Currently, the only "boundary" characters we recognize are
                 // space and no-break space, which are both 8-bit, so we force
                 // that flag (below). If we ever change IsBoundarySpace, we
                 // may need to revise this.
                 // Avoid tautological-constant-out-of-range-compare in 8-bit:
                 DebugOnly<char16_t> boundary16 = boundary;
                 NS_ASSERTION(boundary16 < 256, "unexpected boundary!");
                 gfxShapedWord *sw =
                     GetShapedWord(aDrawTarget, &boundary, 1,
                                   gfxShapedWord::HashMix(0, boundary),
-                                  aRunScript, aVertical, appUnitsPerDevUnit,
+                                  aRunScript, vertical, appUnitsPerDevUnit,
                                   flags | gfx::ShapedTextFlags::TEXT_IS_8BIT,
                                   rounding, tp);
                 if (sw) {
                     aTextRun->CopyGlyphDataFrom(sw, aRunStart + i);
                 } else {
                     return false;
                 }
             }
@@ -3144,17 +3143,17 @@ gfxFont::SplitAndInitTextRun(DrawTarget 
             aTextRun->SetIsTab(aRunStart + i);
         } else if (ch == '\n') {
             aTextRun->SetIsNewline(aRunStart + i);
         } else if (IsInvalidControlChar(ch) &&
             !(aTextRun->GetFlags() & gfx::ShapedTextFlags::TEXT_HIDE_CONTROL_CHARACTERS)) {
             if (GetFontEntry()->IsUserFont() && HasCharacter(ch)) {
                 ShapeFragmentWithoutWordCache(aDrawTarget, aString + i,
                                               aRunStart + i, 1,
-                                              aRunScript, aVertical,
+                                              aRunScript, vertical,
                                               rounding, aTextRun);
             } else {
                 aTextRun->SetMissingGlyph(aRunStart + i, ch, this);
             }
         }
 
         hash = 0;
         wordStart = i + 1;
@@ -3167,25 +3166,25 @@ gfxFont::SplitAndInitTextRun(DrawTarget 
 // Explicit instantiations of SplitAndInitTextRun, to avoid libxul link failure
 template bool
 gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
                              gfxTextRun *aTextRun,
                              const uint8_t *aString,
                              uint32_t aRunStart,
                              uint32_t aRunLength,
                              Script aRunScript,
-                             bool aVertical);
+                             ShapedTextFlags aOrientation);
 template bool
 gfxFont::SplitAndInitTextRun(DrawTarget *aDrawTarget,
                              gfxTextRun *aTextRun,
                              const char16_t *aString,
                              uint32_t aRunStart,
                              uint32_t aRunLength,
                              Script aRunScript,
-                             bool aVertical);
+                             ShapedTextFlags aOrientation);
 
 template<>
 bool
 gfxFont::InitFakeSmallCapsRun(DrawTarget     *aDrawTarget,
                               gfxTextRun     *aTextRun,
                               const char16_t *aText,
                               uint32_t        aOffset,
                               uint32_t        aLength,
@@ -3206,18 +3205,16 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget
     enum RunCaseAction {
         kNoChange,
         kUppercaseReduce,
         kUppercase
     };
 
     RunCaseAction runAction = kNoChange;
     uint32_t runStart = 0;
-    bool vertical =
-        aOrientation == gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
 
     for (uint32_t i = 0; i <= aLength; ++i) {
         uint32_t extraCodeUnits = 0; // Will be set to 1 if we need to consume
                                      // a trailing surrogate as well as the
                                      // current code unit.
         RunCaseAction chAction = kNoChange;
         // Unless we're at the end, figure out what treatment the current
         // character will need.
@@ -3270,17 +3267,17 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget
             switch (runAction) {
             case kNoChange:
                 // just use the current font and the existing string
                 aTextRun->AddGlyphRun(f, aMatchType, aOffset + runStart, true,
                                       aOrientation);
                 if (!f->SplitAndInitTextRun(aDrawTarget, aTextRun,
                                             aText + runStart,
                                             aOffset + runStart, runLength,
-                                            aScript, vertical)) {
+                                            aScript, aOrientation)) {
                     ok = false;
                 }
                 break;
 
             case kUppercaseReduce:
                 // use reduced-size font, then fall through to uppercase the text
                 f = smallCapsFont;
                 MOZ_FALLTHROUGH;
@@ -3314,17 +3311,17 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget
                         gfxTextRun::Create(&params, convertedString.Length(),
                                            aTextRun->GetFontGroup(),
                                            gfx::ShapedTextFlags(), 
                                            nsTextFrameUtils::Flags()));
                     tempRun->AddGlyphRun(f, aMatchType, 0, true, aOrientation);
                     if (!f->SplitAndInitTextRun(aDrawTarget, tempRun.get(),
                                                 convertedString.BeginReading(),
                                                 0, convertedString.Length(),
-                                                aScript, vertical)) {
+                                                aScript, aOrientation)) {
                         ok = false;
                     } else {
                         RefPtr<gfxTextRun> mergedRun(
                             gfxTextRun::Create(&params, runLength,
                                                aTextRun->GetFontGroup(),
                                                gfx::ShapedTextFlags(), 
                                                nsTextFrameUtils::Flags()));
                         MergeCharactersInTextRun(mergedRun.get(), tempRun.get(),
@@ -3335,17 +3332,17 @@ gfxFont::InitFakeSmallCapsRun(DrawTarget
                                                     aOffset + runStart);
                     }
                 } else {
                     aTextRun->AddGlyphRun(f, aMatchType, aOffset + runStart,
                                           true, aOrientation);
                     if (!f->SplitAndInitTextRun(aDrawTarget, aTextRun,
                                                 convertedString.BeginReading(),
                                                 aOffset + runStart, runLength,
-                                                aScript, vertical)) {
+                                                aScript, aOrientation)) {
                         ok = false;
                     }
                 }
                 break;
             }
 
             runStart = i;
         }
--- a/gfx/thebes/gfxFont.h
+++ b/gfx/thebes/gfxFont.h
@@ -1821,17 +1821,17 @@ public:
     // segments if necessary
     template<typename T>
     bool SplitAndInitTextRun(DrawTarget *aDrawTarget,
                              gfxTextRun *aTextRun,
                              const T *aString,
                              uint32_t aRunStart,
                              uint32_t aRunLength,
                              Script aRunScript,
-                             bool aVertical);
+                             mozilla::gfx::ShapedTextFlags aOrientation);
 
     // Get a ShapedWord representing the given text (either 8- or 16-bit)
     // for use in setting up a gfxTextRun.
     template<typename T>
     gfxShapedWord* GetShapedWord(DrawTarget *aDrawTarget,
                                  const T *aText,
                                  uint32_t aLength,
                                  uint32_t aHash,
--- a/gfx/thebes/gfxTextRun.cpp
+++ b/gfx/thebes/gfxTextRun.cpp
@@ -2564,42 +2564,53 @@ gfxFontGroup::InitScriptRun(DrawTarget* 
     // confirm the load state of userfonts in the list
     if (mUserFontSet &&
         mCurrGeneration != mUserFontSet->GetGeneration()) {
         UpdateUserFonts();
     }
 
     gfxFont *mainFont = GetFirstValidFont();
 
+    ShapedTextFlags orientation =
+        aTextRun->GetFlags() & ShapedTextFlags::TEXT_ORIENT_MASK;
+
+    if (orientation != ShapedTextFlags::TEXT_ORIENT_HORIZONTAL &&
+        (aRunScript == Script::MONGOLIAN || aRunScript == Script::PHAGS_PA)) {
+        // Mongolian and Phags-pa text should ignore text-orientation and
+        // always render in its "native" vertical mode, implemented by fonts
+        // as sideways-right (i.e as if shaped horizontally, and then the
+        // entire line is rotated to render vertically). Therefore, we ignore
+        // the aOrientation value from the textrun's flags, and make all
+        // vertical Mongolian/Phags-pa use sideways-right.
+        orientation = ShapedTextFlags::TEXT_ORIENT_VERTICAL_SIDEWAYS_RIGHT;
+    }
+
     uint32_t runStart = 0;
     AutoTArray<gfxTextRange,3> fontRanges;
-    ComputeRanges(fontRanges, aString, aLength, aRunScript,
-                  aTextRun->GetFlags() & ShapedTextFlags::TEXT_ORIENT_MASK);
+    ComputeRanges(fontRanges, aString, aLength, aRunScript, orientation);
     uint32_t numRanges = fontRanges.Length();
     bool missingChars = false;
 
     for (uint32_t r = 0; r < numRanges; r++) {
         const gfxTextRange& range = fontRanges[r];
         uint32_t matchedLength = range.Length();
         gfxFont *matchedFont = range.font;
-        bool vertical =
-            range.orientation == ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
         // create the glyph run for this range
         if (matchedFont && mStyle.noFallbackVariantFeatures) {
             // common case - just do glyph layout and record the
             // resulting positioned glyphs
             aTextRun->AddGlyphRun(matchedFont, range.matchType,
                                   aOffset + runStart, (matchedLength > 0),
                                   range.orientation);
             if (!matchedFont->SplitAndInitTextRun(aDrawTarget, aTextRun,
                                                   aString + runStart,
                                                   aOffset + runStart,
                                                   matchedLength,
                                                   aRunScript,
-                                                  vertical)) {
+                                                  range.orientation)) {
                 // glyph layout failed! treat as missing glyphs
                 matchedFont = nullptr;
             }
         } else if (matchedFont) {
             // shape with some variant feature that requires fallback handling
             bool petiteToSmallCaps = false;
             bool syntheticLower = false;
             bool syntheticUpper = false;
@@ -2629,17 +2640,17 @@ gfxFontGroup::InitScriptRun(DrawTarget* 
                 aTextRun->AddGlyphRun(subSuperFont, range.matchType,
                                       aOffset + runStart, (matchedLength > 0),
                                       range.orientation);
                 if (!subSuperFont->SplitAndInitTextRun(aDrawTarget, aTextRun,
                                                        aString + runStart,
                                                        aOffset + runStart,
                                                        matchedLength,
                                                        aRunScript,
-                                                       vertical)) {
+                                                       range.orientation)) {
                     // glyph layout failed! treat as missing glyphs
                     matchedFont = nullptr;
                 }
             } else if (mStyle.variantCaps != NS_FONT_VARIANT_CAPS_NORMAL &&
                        !matchedFont->SupportsVariantCaps(aRunScript,
                                                          mStyle.variantCaps,
                                                          petiteToSmallCaps,
                                                          syntheticLower,
@@ -2674,17 +2685,17 @@ gfxFontGroup::InitScriptRun(DrawTarget* 
                 aTextRun->AddGlyphRun(matchedFont, range.matchType,
                                       aOffset + runStart, (matchedLength > 0),
                                       range.orientation);
                 if (!matchedFont->SplitAndInitTextRun(aDrawTarget, aTextRun,
                                                       aString + runStart,
                                                       aOffset + runStart,
                                                       matchedLength,
                                                       aRunScript,
-                                                      vertical)) {
+                                                      range.orientation)) {
                     // glyph layout failed! treat as missing glyphs
                     matchedFont = nullptr;
                 }
             }
         } else {
             aTextRun->AddGlyphRun(mainFont, gfxTextRange::kFontGroup,
                                   aOffset + runStart, (matchedLength > 0),
                                   range.orientation);
--- a/gfx/webrender_bindings/RenderD3D11TextureHostOGL.cpp
+++ b/gfx/webrender_bindings/RenderD3D11TextureHostOGL.cpp
@@ -45,16 +45,17 @@ RenderDXGITextureHostOGL::RenderDXGIText
   , mTextureHandle{0}
   , mFormat(aFormat)
   , mSize(aSize)
   , mLocked(false)
 {
   MOZ_COUNT_CTOR_INHERITED(RenderDXGITextureHostOGL, RenderTextureHostOGL);
   MOZ_ASSERT(mFormat != gfx::SurfaceFormat::NV12 ||
              (mSize.width % 2 == 0 && mSize.height % 2 == 0));
+  MOZ_ASSERT(aHandle);
 }
 
 RenderDXGITextureHostOGL::~RenderDXGITextureHostOGL()
 {
   MOZ_COUNT_DTOR_INHERITED(RenderDXGITextureHostOGL, RenderTextureHostOGL);
   DeleteTextureHandle();
 }
 
@@ -77,16 +78,19 @@ RenderDXGITextureHostOGL::EnsureLockable
   }
 
   const auto& egl = &gl::sEGLLibrary;
 
   if (mFormat != gfx::SurfaceFormat::NV12) {
     // The non-nv12 format.
     // Use eglCreatePbufferFromClientBuffer get the gl handle from the d3d
     // shared handle.
+    if (!egl->IsExtensionSupported(gl::GLLibraryEGL::ANGLE_d3d_share_handle_client_buffer)) {
+      return false;
+    }
 
     // Get gl texture handle from shared handle.
     EGLint pbufferAttributes[] = {
         LOCAL_EGL_WIDTH, mSize.width,
         LOCAL_EGL_HEIGHT, mSize.height,
         LOCAL_EGL_TEXTURE_TARGET, LOCAL_EGL_TEXTURE_2D,
         LOCAL_EGL_TEXTURE_FORMAT, GetEGLTextureFormat(mFormat),
         LOCAL_EGL_MIPMAP_TEXTURE, LOCAL_EGL_FALSE,
@@ -111,19 +115,18 @@ RenderDXGITextureHostOGL::EnsureLockable
     mGL->TexParams_SetClampNoMips(LOCAL_GL_TEXTURE_2D);
     egl->fBindTexImage(egl->Display(), mSurface, LOCAL_EGL_BACK_BUFFER);
   } else {
     // The nv12 format.
     // The eglCreatePbufferFromClientBuffer doesn't support nv12 format, so we
     // use EGLStream to get the converted gl handle from d3d nv12 texture.
 
     if (!egl->IsExtensionSupported(gl::GLLibraryEGL::NV_stream_consumer_gltexture_yuv) ||
-        !egl->IsExtensionSupported(gl::GLLibraryEGL::ANGLE_stream_producer_d3d_texture_nv12))
-    {
-        return false;
+        !egl->IsExtensionSupported(gl::GLLibraryEGL::ANGLE_stream_producer_d3d_texture_nv12)) {
+      return false;
     }
 
     // Fetch the D3D11 device.
     EGLDeviceEXT eglDevice = nullptr;
     egl->fQueryDisplayAttribEXT(egl->Display(), LOCAL_EGL_DEVICE_EXT, (EGLAttrib*)&eglDevice);
     MOZ_ASSERT(eglDevice);
     ID3D11Device* device = nullptr;
     egl->fQueryDeviceAttribEXT(eglDevice, LOCAL_EGL_D3D11_DEVICE_ANGLE, (EGLAttrib*)&device);
@@ -272,16 +275,17 @@ RenderDXGIYCbCrTextureHostOGL::RenderDXG
   , mTextureHandles{0}
   , mSize(aSize)
   , mLocked(false)
 {
     MOZ_COUNT_CTOR_INHERITED(RenderDXGIYCbCrTextureHostOGL, RenderTextureHostOGL);
     // The size should be even.
     MOZ_ASSERT(mSize.width % 2 == 0);
     MOZ_ASSERT(mSize.height % 2 == 0);
+    MOZ_ASSERT(aHandles[0] && aHandles[1] && aHandles[2]);
 }
 
 RenderDXGIYCbCrTextureHostOGL::~RenderDXGIYCbCrTextureHostOGL()
 {
   MOZ_COUNT_CTOR_INHERITED(RenderDXGIYCbCrTextureHostOGL, RenderTextureHostOGL);
   DeleteTextureHandle();
 }
 
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -425,16 +425,22 @@ WebRenderAPI::SetRootPipeline(PipelineId
 }
 
 void
 WebRenderAPI::UpdateResources(ResourceUpdateQueue& aUpdates)
 {
   wr_api_update_resources(mDocHandle, aUpdates.Raw());
 }
 
+void
+WebRenderAPI::UpdatePipelineResources(ResourceUpdateQueue& aUpdates, PipelineId aPipeline, Epoch aEpoch)
+{
+  wr_api_update_pipeline_resources(mDocHandle, aPipeline, aEpoch, aUpdates.Raw());
+}
+
 ResourceUpdateQueue::ResourceUpdateQueue()
 {
   mUpdates = wr_resource_updates_new();
 }
 
 ResourceUpdateQueue::ResourceUpdateQueue(ResourceUpdateQueue&& aFrom)
 {
   mUpdates = aFrom.mUpdates;
--- a/gfx/webrender_bindings/WebRenderAPI.h
+++ b/gfx/webrender_bindings/WebRenderAPI.h
@@ -153,16 +153,18 @@ public:
                       ResourceUpdateQueue& aResources);
 
   void ClearDisplayList(Epoch aEpoch, wr::WrPipelineId pipeline_id);
 
   void SetRootPipeline(wr::PipelineId aPipeline);
 
   void UpdateResources(ResourceUpdateQueue& aUpdates);
 
+  void UpdatePipelineResources(ResourceUpdateQueue& aUpdates, PipelineId aPipeline, Epoch aEpoch);
+
   void SetFrameStartTime(const TimeStamp& aTime);
 
   void RunOnRenderThread(UniquePtr<RendererEvent> aEvent);
 
   void Readback(gfx::IntSize aSize, uint8_t *aBuffer, uint32_t aBufferSize);
 
   void Pause();
   bool Resume();
--- a/gfx/webrender_bindings/src/bindings.rs
+++ b/gfx/webrender_bindings/src/bindings.rs
@@ -810,16 +810,28 @@ pub extern "C" fn wr_api_update_resource
     dh: &mut DocumentHandle,
     resources: &mut ResourceUpdates
 ) {
     let resource_updates = mem::replace(resources, ResourceUpdates::new());
     dh.api.update_resources(resource_updates);
 }
 
 #[no_mangle]
+pub extern "C" fn wr_api_update_pipeline_resources(
+    dh: &mut DocumentHandle,
+    pipeline_id: WrPipelineId,
+    epoch: WrEpoch,
+    resources: &mut ResourceUpdates
+) {
+    let resource_updates = mem::replace(resources, ResourceUpdates::new());
+    dh.api.update_pipeline_resources(resource_updates, dh.document_id, pipeline_id, epoch);
+}
+
+
+#[no_mangle]
 pub extern "C" fn wr_api_set_root_pipeline(dh: &mut DocumentHandle,
                                            pipeline_id: WrPipelineId) {
     dh.api.set_root_pipeline(dh.document_id, pipeline_id);
 }
 
 #[no_mangle]
 pub extern "C" fn wr_api_set_window_parameters(dh: &mut DocumentHandle,
                                                width: i32,
--- a/gfx/webrender_bindings/webrender_ffi_generated.h
+++ b/gfx/webrender_bindings/webrender_ffi_generated.h
@@ -910,16 +910,23 @@ WR_FUNC;
 
 WR_INLINE
 void wr_api_set_window_parameters(DocumentHandle *aDh,
                                   int32_t aWidth,
                                   int32_t aHeight)
 WR_FUNC;
 
 WR_INLINE
+void wr_api_update_pipeline_resources(DocumentHandle *aDh,
+                                      WrPipelineId aPipelineId,
+                                      WrEpoch aEpoch,
+                                      ResourceUpdates *aResources)
+WR_FUNC;
+
+WR_INLINE
 void wr_api_update_resources(DocumentHandle *aDh,
                              ResourceUpdates *aResources)
 WR_FUNC;
 
 WR_INLINE
 void wr_dec_ref_arc(const VecU8 *aArc)
 WR_FUNC;
 
--- a/ipc/ipdl/sync-messages.ini
+++ b/ipc/ipdl/sync-messages.ini
@@ -1012,18 +1012,16 @@ description = bug 1350634
 [PUiCompositorController::Pause]
 description =
 [PUiCompositorController::Resume]
 description =
 [PUiCompositorController::ResumeAndResize]
 description =
 [PWebRenderBridge::Create]
 description =
-[PWebRenderBridge::SetDisplayListSync]
-description =
 [PWebRenderBridge::GetSnapshot]
 description =
 [PWebRenderBridge::SetTestSampleTime]
 description = test only
 [PWebRenderBridge::LeaveTestMode]
 description = test only
 [PWebRenderBridge::GetAnimationOpacity]
 description = test only
--- a/js/src/builtin/Promise.cpp
+++ b/js/src/builtin/Promise.cpp
@@ -2114,16 +2114,20 @@ PromiseAllResolveElementFunction(JSConte
     RootedValue valuesVal(cx, data->valuesArray());
     RootedObject valuesObj(cx, &valuesVal.toObject());
     bool valuesListIsWrapped = false;
     if (IsWrapper(valuesObj)) {
         valuesListIsWrapped = true;
         // See comment for PerformPromiseAll, step 3 for why we unwrap here.
         valuesObj = UncheckedUnwrap(valuesObj);
     }
+    if (JS_IsDeadWrapper(valuesObj)) {
+        JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DEAD_OBJECT);
+        return false;
+    }
     RootedNativeObject values(cx, &valuesObj->as<NativeObject>());
 
     // Step 6 (moved under step 10).
     // Step 7 (moved to step 9).
 
     // Step 8.
     // The index is guaranteed to be initialized to `undefined`.
     if (valuesListIsWrapped) {
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -2766,17 +2766,17 @@ class CloneBufferObject : public NativeO
                 return false;
             data = reinterpret_cast<uint8_t*>(JS_EncodeString(cx, str));
             if (!data)
                 return false;
             dataOwner.reset(data);
             nbytes = JS_GetStringLength(str);
         }
 
-        if (nbytes % sizeof(uint64_t) != 0) {
+        if (nbytes == 0 || (nbytes % sizeof(uint64_t) != 0)) {
             JS_ReportErrorASCII(cx, "Invalid length for clonebuffer data");
             return false;
         }
 
         auto buf = js::MakeUnique<JSStructuredCloneData>(0, 0, nbytes);
         if (!buf->Init(nbytes, nbytes))
             return false;
         js_memcpy(buf->Start(), data, nbytes);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/promise/bug1406463.js
@@ -0,0 +1,16 @@
+// |jit-test| error:dead object
+
+var P = newGlobal().eval(`
+(class extends Promise {
+    static resolve(o) {
+        return o;
+    }
+});
+`);
+
+Promise.all.call(P, [{
+    then(r) {
+        nukeAllCCWs();
+        r();
+    }
+}]);
--- a/js/src/jsapi-tests/tests.cpp
+++ b/js/src/jsapi-tests/tests.cpp
@@ -81,17 +81,16 @@ bool JSAPITest::definePrint()
 JSObject* JSAPITest::createGlobal(JSPrincipals* principals)
 {
     /* Create the global object. */
     JS::RootedObject newGlobal(cx);
     JS::CompartmentOptions options;
 #ifdef ENABLE_STREAMS
     options.creationOptions().setStreamsEnabled(true);
 #endif
-    printf("enabled\n");
     options.behaviors().setVersion(JSVERSION_DEFAULT);
     newGlobal = JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook,
                                    options);
     if (!newGlobal)
         return nullptr;
 
     JSAutoCompartment ac(cx, newGlobal);
 
--- a/layout/reftests/font-face/reftest.list
+++ b/layout/reftests/font-face/reftest.list
@@ -173,17 +173,17 @@ pref(gfx.downloadable_fonts.woff2.enable
 
 # sanity tests for reflow behavior with downloadable fonts
 HTTP(..) == reflow-sanity-1.html reflow-sanity-1-ref.html
 HTTP(..) == reflow-sanity-1-data.html reflow-sanity-1-ref.html
 HTTP(..) == reflow-sanity-1.html reflow-sanity-1-data.html
 HTTP(..) == reflow-sanity-delay-1a.html reflow-sanity-1-ref.html
 HTTP(..) == reflow-sanity-delay-1b.html reflow-sanity-1-ref.html
 HTTP(..) == reflow-sanity-delay-1c.html reflow-sanity-1-ref.html
-skip-if(winWidget&&!isDebugBuild) HTTP(..) == reflow-sanity-delay-1-metrics.html reflow-sanity-1-ref.html
+HTTP(..) == reflow-sanity-delay-1-metrics.html reflow-sanity-1-ref.html
 
 # font-display
 skip-if(/^Linux\x20i686/.test(http.oscpu)) HTTP(..) == font-display-1.html font-display-1-ref.html # normal font load (~500ms)
 # ^ disabled due to intermittents due to timing issues -- Bug 1238222
 fuzzy-if(OSX==1010,3,5) HTTP(..) == font-display-2.html font-display-2-ref.html # font load takes 4500ms
 
 # Testing hack for Meiryo
 == meiryo-en.html meiryo-ja.html
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..29fbdadef4cd0c4cde516a738e9edec02b6dc8a9
GIT binary patch
literal 135484
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
Q7#EuAZ~m6iy5O1pAJ_@bcK`qY
new file mode 100644
--- /dev/null
+++ b/layout/reftests/writing-mode/1361631-mongolian-upright-1-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<style>
+@font-face {
+  font-family: test;
+  src: url(../fonts/NotoSansMongolian-Regular.ttf);
+}
+div {
+  writing-mode: vertical-lr;
+  text-orientation: mixed;
+  font-family: test;
+  font-size: 32px;
+}
+</style>
+<div>
+ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ
new file mode 100644
--- /dev/null
+++ b/layout/reftests/writing-mode/1361631-mongolian-upright-1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<style>
+@font-face {
+  font-family: test;
+  src: url(../fonts/NotoSansMongolian-Regular.ttf);
+}
+div {
+  writing-mode: vertical-lr;
+  text-orientation: upright; /* should have no effect on Mongolian */
+  font-family: test;
+  font-size: 32px;
+}
+</style>
+<div>
+ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ
--- a/layout/reftests/writing-mode/reftest.list
+++ b/layout/reftests/writing-mode/reftest.list
@@ -173,14 +173,16 @@ skip-if(Android) HTTP(..) == 1248248-1-o
 fuzzy-if(Android,54,852) == 1302389-scrolled-rect-1b.html 1302389-scrolled-rect-1-ref.html
 fuzzy-if(Android,54,852) fuzzy-if(gtkWidget,1,25) fuzzy-if(cocoaWidget,1,2) == 1302389-scrolled-rect-1c.html 1302389-scrolled-rect-1-ref.html
 fuzzy-if(gtkWidget,1,25) fuzzy-if(cocoaWidget,1,2) == 1302389-scrolled-rect-1d.html 1302389-scrolled-rect-1-ref.html
 fuzzy-if(Android,54,852) fuzzy-if(gtkWidget,1,25) fuzzy-if(cocoaWidget,1,2) == 1302389-scrolled-rect-2a.html 1302389-scrolled-rect-2-ref.html
 fuzzy-if(gtkWidget,1,25) fuzzy-if(cocoaWidget,1,2) == 1302389-scrolled-rect-2b.html 1302389-scrolled-rect-2-ref.html
 == 1302389-scrolled-rect-2c.html 1302389-scrolled-rect-2-ref.html
 fuzzy-if(Android,54,852) == 1302389-scrolled-rect-2d.html 1302389-scrolled-rect-2-ref.html
 
+== 1361631-mongolian-upright-1.html 1361631-mongolian-upright-1-ref.html
+
 # Suite of tests from Gérard Talbot in bug 1079151
 # Frequent Windows 7 load failed: timed out waiting for test to complete (waiting for onload scripts to complete), bug 1167155 and friends
 skip-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) include abspos/reftest.list
 
 # Tests for tables with vertical writing modes
 include tables/reftest.list
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2283,16 +2283,17 @@ pref("network.proxy.proxy_over_tls",    
 pref("network.proxy.no_proxies_on",         "localhost, 127.0.0.1");
 pref("network.proxy.failover_timeout",      1800); // 30 minutes
 pref("network.online",                      true); //online/offline
 pref("network.cookie.cookieBehavior",       0); // 0-Accept, 1-dontAcceptForeign, 2-dontAcceptAny, 3-limitForeign
 #ifdef ANDROID
 pref("network.cookie.cookieBehavior",       0); // Keep the old default of accepting all cookies
 #endif
 pref("network.cookie.thirdparty.sessionOnly", false);
+pref("network.cookie.thirdparty.nonsecureSessionOnly", false);
 pref("network.cookie.leave-secure-alone",   true);
 pref("network.cookie.ipc.sync",             false);
 pref("network.cookie.lifetimePolicy",       0); // 0-accept, 1-dontUse 2-acceptForSession, 3-acceptForNDays
 pref("network.cookie.prefsMigrated",        false);
 pref("network.cookie.lifetime.days",        90); // Ignored unless network.cookie.lifetimePolicy is 3.
 
 // The PAC file to load.  Ignored unless network.proxy.type is 2.
 pref("network.proxy.autoconfig_url", "");
--- a/netwerk/cookie/CookieServiceChild.cpp
+++ b/netwerk/cookie/CookieServiceChild.cpp
@@ -29,16 +29,18 @@ using mozilla::OriginAttributes;
 
 namespace mozilla {
 namespace net {
 
 // Pref string constants
 static const char kPrefCookieBehavior[] = "network.cookie.cookieBehavior";
 static const char kPrefThirdPartySession[] =
   "network.cookie.thirdparty.sessionOnly";
+static const char kPrefThirdPartyNonsecureSession[] =
+  "network.cookie.thirdparty.nonsecureSessionOnly";
 static const char kPrefCookieIPCSync[] = "network.cookie.ipc.sync";
 static const char kCookieLeaveSecurityAlone[] = "network.cookie.leave-secure-alone";
 
 static StaticRefPtr<CookieServiceChild> gCookieService;
 
 already_AddRefed<CookieServiceChild>
 CookieServiceChild::GetSingleton()
 {
@@ -53,16 +55,17 @@ CookieServiceChild::GetSingleton()
 NS_IMPL_ISUPPORTS(CookieServiceChild,
                   nsICookieService,
                   nsIObserver,
                   nsISupportsWeakReference)
 
 CookieServiceChild::CookieServiceChild()
   : mCookieBehavior(nsICookieService::BEHAVIOR_ACCEPT)
   , mThirdPartySession(false)
+  , mThirdPartyNonsecureSession(false)
   , mLeaveSecureAlone(true)
   , mIPCSync(false)
   , mIPCOpen(false)
 {
   NS_ASSERTION(IsNeckoChild(), "not a child process");
 
   mozilla::dom::ContentChild* cc =
     static_cast<mozilla::dom::ContentChild*>(gNeckoChild->Manager());
@@ -85,16 +88,17 @@ CookieServiceChild::CookieServiceChild()
 
   // Init our prefs and observer.
   nsCOMPtr<nsIPrefBranch> prefBranch =
     do_GetService(NS_PREFSERVICE_CONTRACTID);
   NS_WARNING_ASSERTION(prefBranch, "no prefservice");
   if (prefBranch) {
     prefBranch->AddObserver(kPrefCookieBehavior, this, true);
     prefBranch->AddObserver(kPrefThirdPartySession, this, true);
+    prefBranch->AddObserver(kPrefThirdPartyNonsecureSession, this, true);
     prefBranch->AddObserver(kPrefCookieIPCSync, this, true);
     prefBranch->AddObserver(kCookieLeaveSecurityAlone, this, true);
     PrefChanged(prefBranch);
   }
 }
 
 CookieServiceChild::~CookieServiceChild()
 {
@@ -228,16 +232,20 @@ CookieServiceChild::PrefChanged(nsIPrefB
       val >= nsICookieService::BEHAVIOR_ACCEPT &&
       val <= nsICookieService::BEHAVIOR_LIMIT_FOREIGN
         ? val : nsICookieService::BEHAVIOR_ACCEPT;
 
   bool boolval;
   if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartySession, &boolval)))
     mThirdPartySession = !!boolval;
 
+  if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartyNonsecureSession,
+                                            &boolval)))
+    mThirdPartyNonsecureSession = boolval;
+
   if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefCookieIPCSync, &boolval)))
     mIPCSync = !!boolval;
 
   if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kCookieLeaveSecurityAlone, &boolval)))
     mLeaveSecureAlone = !!boolval;
 
   if (!mThirdPartyUtil && RequireThirdPartyCheck()) {
     mThirdPartyUtil = do_GetService(THIRDPARTYUTIL_CONTRACTID);
@@ -272,17 +280,18 @@ CookieServiceChild::GetCookieStringFromC
   aHostURI->GetPathQueryRef(pathFromURI);
   aHostURI->SchemeIs("https", &isSecure);
   int64_t currentTimeInUsec = PR_Now();
   int64_t currentTime = currentTimeInUsec / PR_USEC_PER_SEC;
 
   nsCOMPtr<nsICookiePermission> permissionService = do_GetService(NS_COOKIEPERMISSION_CONTRACTID);
   CookieStatus cookieStatus =
     nsCookieService::CheckPrefs(permissionService, mCookieBehavior,
-                                mThirdPartySession, aHostURI,
+                                mThirdPartySession,
+                                mThirdPartyNonsecureSession, aHostURI,
                                 aIsForeign, nullptr,
                                 CountCookiesFromHashTable(baseDomain, aOriginAttrs),
                                 aOriginAttrs);
 
   if (cookieStatus != STATUS_ACCEPTED && cookieStatus != STATUS_ACCEPT_SESSION) {
     return;
   }
 
@@ -374,17 +383,18 @@ CookieServiceChild::SetCookieInternal(ns
   RecordDocumentCookie(cookie, aAttrs);
 }
 
 bool
 CookieServiceChild::RequireThirdPartyCheck()
 {
   return mCookieBehavior == nsICookieService::BEHAVIOR_REJECT_FOREIGN ||
     mCookieBehavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN ||
-    mThirdPartySession;
+    mThirdPartySession ||
+    mThirdPartyNonsecureSession;
 }
 
 void
 CookieServiceChild::RecordDocumentCookie(nsCookie               *aCookie,
                                          const OriginAttributes &aAttrs)
 {
   nsAutoCString baseDomain;
   nsCookieService::
@@ -520,18 +530,19 @@ CookieServiceChild::SetCookieStringInter
   nsCString baseDomain;
   nsCookieService::
     GetBaseDomain(mTLDService, aHostURI, baseDomain, requireHostMatch);
 
   nsCOMPtr<nsICookiePermission> permissionService = do_GetService(NS_COOKIEPERMISSION_CONTRACTID);
 
   CookieStatus cookieStatus =
     nsCookieService::CheckPrefs(permissionService, mCookieBehavior,
-                                mThirdPartySession, aHostURI,
-                                !!isForeign, aCookieString,
+                                mThirdPartySession,
+                                mThirdPartyNonsecureSession, aHostURI,
+                                isForeign, aCookieString,
                                 CountCookiesFromHashTable(baseDomain, attrs),
                                 attrs);
 
   if (cookieStatus != STATUS_ACCEPTED && cookieStatus != STATUS_ACCEPT_SESSION) {
     return NS_OK;
   }
 
   nsCString serverTimeString(aServerTime);
@@ -539,17 +550,18 @@ CookieServiceChild::SetCookieStringInter
   bool moreCookies;
   do {
     nsCookieAttributes cookieAttributes;
     bool canSetCookie = false;
     nsCookieKey key(baseDomain, attrs);
     moreCookies = nsCookieService::CanSetCookie(aHostURI, key, cookieAttributes,
                                                 requireHostMatch, cookieStatus,
                                                 cookieString, serverTime, aFromHttp,
-                                                aChannel, mLeaveSecureAlone, canSetCookie);
+                                                aChannel, mLeaveSecureAlone,
+                                                canSetCookie, mThirdPartyUtil);
 
     if (canSetCookie) {
       SetCookieInternal(cookieAttributes, attrs, aChannel,
                         aFromHttp, permissionService);
     }
 
     // document.cookie can only set one cookie at a time.
     if (!aFromHttp) {
--- a/netwerk/cookie/CookieServiceChild.h
+++ b/netwerk/cookie/CookieServiceChild.h
@@ -116,16 +116,17 @@ protected:
 
   virtual void ActorDestroy(ActorDestroyReason aWhy) override;
 
   CookiesMap mCookiesMap;
   nsCOMPtr<mozIThirdPartyUtil> mThirdPartyUtil;
   nsCOMPtr<nsIEffectiveTLDService> mTLDService;
   uint8_t mCookieBehavior;
   bool mThirdPartySession;
+  bool mThirdPartyNonsecureSession;
   bool mLeaveSecureAlone;
   bool mIPCSync;
   bool mIPCOpen;
 };
 
 } // namespace net
 } // namespace mozilla
 
--- a/netwerk/cookie/nsCookieService.cpp
+++ b/netwerk/cookie/nsCookieService.cpp
@@ -118,16 +118,17 @@ static const uint32_t kMaxBytesPerCookie
 static const uint32_t kMaxBytesPerPath    = 1024;
 
 // pref string constants
 static const char kPrefCookieBehavior[]       = "network.cookie.cookieBehavior";
 static const char kPrefMaxNumberOfCookies[]   = "network.cookie.maxNumber";
 static const char kPrefMaxCookiesPerHost[]    = "network.cookie.maxPerHost";
 static const char kPrefCookiePurgeAge[]       = "network.cookie.purgeAge";
 static const char kPrefThirdPartySession[]    = "network.cookie.thirdparty.sessionOnly";
+static const char kPrefThirdPartyNonsecureSession[] = "network.cookie.thirdparty.nonsecureSessionOnly";
 static const char kCookieLeaveSecurityAlone[] = "network.cookie.leave-secure-alone";
 
 // For telemetry COOKIE_LEAVE_SECURE_ALONE
 #define BLOCKED_SECURE_SET_FROM_HTTP          0
 #define BLOCKED_DOWNGRADE_SECURE_INEXACT      1
 #define DOWNGRADE_SECURE_FROM_SECURE_INEXACT  2
 #define EVICTED_NEWER_INSECURE                3
 #define EVICTED_OLDEST_COOKIE                 4
@@ -697,16 +698,17 @@ NS_IMPL_ISUPPORTS(nsCookieService,
                   nsIObserver,
                   nsISupportsWeakReference,
                   nsIMemoryReporter)
 
 nsCookieService::nsCookieService()
  : mDBState(nullptr)
  , mCookieBehavior(nsICookieService::BEHAVIOR_ACCEPT)
  , mThirdPartySession(false)
+ , mThirdPartyNonsecureSession(false)
  , mLeaveSecureAlone(true)
  , mMaxNumberOfCookies(kMaxNumberOfCookies)
  , mMaxCookiesPerHost(kMaxCookiesPerHost)
  , mCookiePurgeAge(kCookiePurgeAge)
 {
 }
 
 nsresult
@@ -725,16 +727,17 @@ nsCookieService::Init()
   // init our pref and observer
   nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID);
   if (prefBranch) {
     prefBranch->AddObserver(kPrefCookieBehavior,        this, true);
     prefBranch->AddObserver(kPrefMaxNumberOfCookies,    this, true);
     prefBranch->AddObserver(kPrefMaxCookiesPerHost,     this, true);
     prefBranch->AddObserver(kPrefCookiePurgeAge,        this, true);
     prefBranch->AddObserver(kPrefThirdPartySession,     this, true);
+    prefBranch->AddObserver(kPrefThirdPartyNonsecureSession, this, true);
     prefBranch->AddObserver(kCookieLeaveSecurityAlone,  this, true);
     PrefChanged(prefBranch);
   }
 
   mStorageService = do_GetService("@mozilla.org/storage/service;1", &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // Init our default, and possibly private DBStates.
@@ -2144,18 +2147,20 @@ nsCookieService::SetCookieStringInternal
   nsCookieKey key(baseDomain, aOriginAttrs);
 
   // check default prefs
   uint32_t priorCookieCount = 0;
   nsAutoCString hostFromURI;
   aHostURI->GetHost(hostFromURI);
   CountCookiesFromHost(hostFromURI, &priorCookieCount);
   CookieStatus cookieStatus = CheckPrefs(mPermissionService, mCookieBehavior,
-                                         mThirdPartySession, aHostURI, aIsForeign,
-                                         aCookieHeader.get(), priorCookieCount, aOriginAttrs);
+                                         mThirdPartySession,
+                                         mThirdPartyNonsecureSession, aHostURI,
+                                         aIsForeign, aCookieHeader.get(),
+                                         priorCookieCount, aOriginAttrs);
 
   // fire a notification if third party or if cookie was rejected
   // (but not if there was an error)
   switch (cookieStatus) {
   case STATUS_REJECTED:
     NotifyRejected(aHostURI);
     if (aIsForeign) {
       NotifyThirdParty(aHostURI, false, aChannel);
@@ -2342,16 +2347,19 @@ nsCookieService::PrefChanged(nsIPrefBran
     mCookiePurgeAge =
       int64_t(LIMIT(val, 0, INT32_MAX, INT32_MAX)) * PR_USEC_PER_SEC;
   }
 
   bool boolval;
   if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartySession, &boolval)))
     mThirdPartySession = boolval;
 
+  if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kPrefThirdPartyNonsecureSession, &boolval)))
+    mThirdPartyNonsecureSession = boolval;
+
   if (NS_SUCCEEDED(aPrefBranch->GetBoolPref(kCookieLeaveSecurityAlone, &boolval)))
     mLeaveSecureAlone = boolval;
 }
 
 /******************************************************************************
  * nsICookieManager impl:
  * nsICookieManager
  ******************************************************************************/
@@ -3302,18 +3310,20 @@ nsCookieService::GetCookiesForURI(nsIURI
     COOKIE_LOGFAILURE(GET_COOKIE, aHostURI, nullptr, "invalid host/path from URI");
     return;
   }
 
   // check default prefs
   uint32_t priorCookieCount = 0;
   CountCookiesFromHost(hostFromURI, &priorCookieCount);
   CookieStatus cookieStatus = CheckPrefs(mPermissionService, mCookieBehavior,
-                                         mThirdPartySession, aHostURI, aIsForeign,
-                                         nullptr, priorCookieCount, aOriginAttrs);
+                                         mThirdPartySession,
+                                         mThirdPartyNonsecureSession, aHostURI,
+                                         aIsForeign, nullptr,
+                                         priorCookieCount, aOriginAttrs);
 
   // for GetCookie(), we don't fire rejection notifications.
   switch (cookieStatus) {
   case STATUS_REJECTED:
   case STATUS_REJECTED_WITH_ERROR:
     return;
   default:
     break;
@@ -3466,17 +3476,18 @@ nsCookieService::CanSetCookie(nsIURI*   
                               nsCookieAttributes& aCookieAttributes,
                               bool                aRequireHostMatch,
                               CookieStatus        aStatus,
                               nsDependentCString& aCookieHeader,
                               int64_t             aServerTime,
                               bool                aFromHttp,
                               nsIChannel*         aChannel,
                               bool                aLeaveSecureAlone,
-                              bool&               aSetCookie)
+                              bool&               aSetCookie,
+                              mozIThirdPartyUtil* aThirdPartyUtil)
 {
   NS_ASSERTION(aHostURI, "null host!");
 
   aSetCookie = false;
 
   // init expiryTime such that session cookies won't prematurely expire
   aCookieAttributes.expiryTime = INT64_MAX;
 
@@ -3496,16 +3507,36 @@ nsCookieService::CanSetCookie(nsIURI*   
   // 2 = secure and "http:"
   // 3 = secure and "https:"
   bool isHTTPS;
   nsresult rv = aHostURI->SchemeIs("https", &isHTTPS);
   if (NS_SUCCEEDED(rv)) {
     Telemetry::Accumulate(Telemetry::COOKIE_SCHEME_SECURITY,
                           ((aCookieAttributes.isSecure)? 0x02 : 0x00) |
                           ((isHTTPS)? 0x01 : 0x00));
+
+    // Collect telemetry on how often are first- and third-party cookies set
+    // from HTTPS origins:
+    //
+    // 0 (000) = first-party and "http:"
+    // 1 (001) = first-party and "http:" with bogus Secure cookie flag?!
+    // 2 (010) = first-party and "https:"
+    // 3 (011) = first-party and "https:" with Secure cookie flag
+    // 4 (100) = third-party and "http:"
+    // 5 (101) = third-party and "http:" with bogus Secure cookie flag?!
+    // 6 (110) = third-party and "https:"
+    // 7 (111) = third-party and "https:" with Secure cookie flag
+    if (aThirdPartyUtil) {
+      bool isThirdParty = true;
+      aThirdPartyUtil->IsThirdPartyChannel(aChannel, aHostURI, &isThirdParty);
+      Telemetry::Accumulate(Telemetry::COOKIE_SCHEME_HTTPS,
+                            (isThirdParty ? 0x04 : 0x00) |
+                            (isHTTPS ? 0x02 : 0x00) |
+                            (aCookieAttributes.isSecure ? 0x01 : 0x00));
+    }
   }
 
   int64_t currentTimeInUsec = PR_Now();
 
   // calculate expiry time of cookie.
   aCookieAttributes.isSession = GetExpiry(aCookieAttributes, aServerTime,
                                          currentTimeInUsec / PR_USEC_PER_SEC);
   if (aStatus == STATUS_ACCEPT_SESSION) {
@@ -3603,17 +3634,18 @@ nsCookieService::SetCookieInternal(nsIUR
                                    nsIChannel                    *aChannel)
 {
   NS_ASSERTION(aHostURI, "null host!");
   bool canSetCookie = false;
   nsDependentCString savedCookieHeader(aCookieHeader);
   nsCookieAttributes cookieAttributes;
   bool newCookie = CanSetCookie(aHostURI, aKey, cookieAttributes, aRequireHostMatch,
                                 aStatus, aCookieHeader, aServerTime, aFromHttp,
-                                aChannel, mLeaveSecureAlone, canSetCookie);
+                                aChannel, mLeaveSecureAlone, canSetCookie,
+                                mThirdPartyUtil);
 
   if (!canSetCookie) {
     return newCookie;
   }
 
   int64_t currentTimeInUsec = PR_Now();
   // create a new nsCookie and copy attributes
   RefPtr<nsCookie> cookie =
@@ -4205,16 +4237,17 @@ static inline bool IsSubdomainOf(const n
     return a[a.Length() - b.Length() - 1] == '.' && StringEndsWith(a, b);
   return false;
 }
 
 CookieStatus
 nsCookieService::CheckPrefs(nsICookiePermission    *aPermissionService,
                             uint8_t                 aCookieBehavior,
                             bool                    aThirdPartySession,
+                            bool                    aThirdPartyNonsecureSession,
                             nsIURI                 *aHostURI,
                             bool                    aIsForeign,
                             const char             *aCookieHeader,
                             const int               aNumOfCookies,
                             const OriginAttributes &aOriginAttrs)
 {
   nsresult rv;
 
@@ -4279,30 +4312,38 @@ nsCookieService::CheckPrefs(nsICookiePer
   // check default prefs
   if (aCookieBehavior == nsICookieService::BEHAVIOR_REJECT) {
     COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader, "cookies are disabled");
     return STATUS_REJECTED;
   }
 
   // check if cookie is foreign
   if (aIsForeign) {
-    if (aCookieBehavior == nsICookieService::BEHAVIOR_ACCEPT && aThirdPartySession)
-      return STATUS_ACCEPT_SESSION;
-
     if (aCookieBehavior == nsICookieService::BEHAVIOR_REJECT_FOREIGN) {
       COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader, "context is third party");
       return STATUS_REJECTED;
     }
 
     if (aCookieBehavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN) {
       if (aNumOfCookies == 0) {
         COOKIE_LOGFAILURE(aCookieHeader ? SET_COOKIE : GET_COOKIE, aHostURI, aCookieHeader, "context is third party");
         return STATUS_REJECTED;
       }
-      if (aThirdPartySession)
+    }
+
+    MOZ_ASSERT(aCookieBehavior == nsICookieService::BEHAVIOR_ACCEPT ||
+               aCookieBehavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN);
+
+    if (aThirdPartySession)
+      return STATUS_ACCEPT_SESSION;
+
+    if (aThirdPartyNonsecureSession) {
+      bool isHTTPS = false;
+      aHostURI->SchemeIs("https", &isHTTPS);
+      if (!isHTTPS)
         return STATUS_ACCEPT_SESSION;
     }
   }
 
   // if nothing has complained, accept cookie
   return STATUS_ACCEPTED;
 }
 
--- a/netwerk/cookie/nsCookieService.h
+++ b/netwerk/cookie/nsCookieService.h
@@ -226,18 +226,18 @@ class nsCookieService final : public nsI
    * app.
    */
   static void AppClearDataObserverInit();
   static nsCString GetPathFromURI(nsIURI *aHostURI);
   static nsresult GetBaseDomain(nsIEffectiveTLDService *aTLDService, nsIURI *aHostURI, nsCString &aBaseDomain, bool &aRequireHostMatch);
   static nsresult GetBaseDomainFromHost(nsIEffectiveTLDService *aTLDService, const nsACString &aHost, nsCString &aBaseDomain);
   static bool DomainMatches(nsCookie* aCookie, const nsACString& aHost);
   static bool PathMatches(nsCookie* aCookie, const nsACString& aPath);
-  static bool CanSetCookie(nsIURI *aHostURI, const nsCookieKey& aKey, nsCookieAttributes &aCookieAttributes, bool aRequireHostMatch, CookieStatus aStatus, nsDependentCString &aCookieHeader, int64_t aServerTime, bool aFromHttp, nsIChannel* aChannel, bool aLeaveSercureAlone, bool &aSetCookie);
-  static CookieStatus CheckPrefs(nsICookiePermission *aPermissionServices, uint8_t aCookieBehavior, bool aThirdPartyUtil, nsIURI *aHostURI, bool aIsForeign, const char *aCookieHeader, const int aNumOfCookies, const OriginAttributes& aOriginAttrs);
+  static bool CanSetCookie(nsIURI *aHostURI, const nsCookieKey& aKey, nsCookieAttributes &aCookieAttributes, bool aRequireHostMatch, CookieStatus aStatus, nsDependentCString &aCookieHeader, int64_t aServerTime, bool aFromHttp, nsIChannel* aChannel, bool aLeaveSercureAlone, bool &aSetCookie, mozIThirdPartyUtil* aThirdPartyUtil);
+  static CookieStatus CheckPrefs(nsICookiePermission *aPermissionServices, uint8_t aCookieBehavior, bool aThirdPartySession, bool aThirdPartyNonsecureSession, nsIURI *aHostURI, bool aIsForeign, const char *aCookieHeader, const int aNumOfCookies, const OriginAttributes& aOriginAttrs);
   static int64_t ParseServerTime(const nsCString &aServerTime);
   void GetCookiesForURI(nsIURI *aHostURI, bool aIsForeign, bool aHttpBound, const OriginAttributes& aOriginAttrs, nsTArray<nsCookie*>& aCookieList);
 
   protected:
     virtual ~nsCookieService();
 
     void                          PrefChanged(nsIPrefBranch *aPrefBranch);
     void                          InitDBStates();
@@ -316,16 +316,17 @@ class nsCookieService final : public nsI
     // want to be dealing with the on-disk DB when in private browsing.
     DBState                      *mDBState;
     RefPtr<DBState>             mDefaultDBState;
     RefPtr<DBState>             mPrivateDBState;
 
     // cached prefs
     uint8_t                       mCookieBehavior; // BEHAVIOR_{ACCEPT, REJECTFOREIGN, REJECT, LIMITFOREIGN}
     bool                          mThirdPartySession;
+    bool                          mThirdPartyNonsecureSession;
     bool                          mLeaveSecureAlone;
     uint16_t                      mMaxNumberOfCookies;
     uint16_t                      mMaxCookiesPerHost;
     int64_t                       mCookiePurgeAge;
 
     // friends!
     friend class DBListenerErrorHandler;
     friend class ReadCookieDBListener;
--- a/taskcluster/ci/test/mochitest.yml
+++ b/taskcluster/ci/test/mochitest.yml
@@ -233,18 +233,17 @@ mochitest-devtools-chrome:
             linux64-jsdcov/opt: false
             windows7-32/debug: both
             default: true
     mozharness:
         mochitest-flavor: chrome
         chunked: true
     instance-size:
         by-test-platform:
-            # Bug 1281241: migrating to m3.large instances
-            linux64-asan/opt: legacy
+            linux64-asan/opt: xlarge # runs out of memory on default/m3.large
             default: default
     # Bug 1296086: high number of intermittents observed with software GL and large instances
     allow-software-gl-layers: false
     tier:
         by-test-platform:
             windows10-64-asan.*: 3
             default: default
 
--- a/taskcluster/ci/test/talos.yml
+++ b/taskcluster/ci/test/talos.yml
@@ -94,16 +94,17 @@ talos-g1-stylo-disabled:
 talos-g2:
     description: "Talos g2"
     try-name: g2
     treeherder-symbol: tc-T(g2)
     max-run-time: 7200
     run-on-projects:
         by-test-platform:
             linux64-qr/.*: ['mozilla-central', 'try']
+            linux64-ccov/.*: ['try'] # Bug 1407593
             default: ['mozilla-beta', 'mozilla-central', 'mozilla-inbound', 'autoland', 'try']
     mozharness:
         extra-options:
             - --suite=g2
             - --add-option
             - --webServer,localhost
 
 talos-g2-stylo-disabled:
--- a/taskcluster/ci/test/test-sets.yml
+++ b/taskcluster/ci/test/test-sets.yml
@@ -99,17 +99,17 @@ stylo-disabled-tests:
     - mochitest-gpu
     - mochitest-media
     - mochitest-webgl
 
 reftest-stylo:
     - reftest-stylo
 
 qr-talos:
-    # - talos-chrome # regressed, see bug 1408418
+    - talos-chrome
     - talos-dromaeojs
     - talos-g1
     # - talos-g2 # doesn't work with QR yet
     - talos-g3
     - talos-g4
     - talos-g5
     - talos-other
     # - talos-svgr # fails with layers-free
--- a/testing/web-platform/meta/cssom-view/interfaces.html.ini
+++ b/testing/web-platform/meta/cssom-view/interfaces.html.ini
@@ -1,8 +1,10 @@
+prefs: [layout.css.getBoxQuads.enabled:true, layout.css.convertFromNode.enabled:true]
+
 [interfaces.html]
   type: testharness
   [Screen interface: existence and properties of interface object]
     expected: FAIL
 
   [Screen interface: existence and properties of interface prototype object]
     expected: FAIL
 
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -10352,16 +10352,25 @@
     "alert_emails": ["seceng-telemetry@mozilla.com"],
     "bug_numbers": [976073, 1325909],
     "expires_in_version": "60",
     "kind": "enumerated",
     "n_values": 10,
     "releaseChannelCollection": "opt-out",
     "description": "Strict Secure Cookies: 0=blocked secure cookie from http; 1=blocked shadowing secure cookie from http; 2=shadowing secure cookie from https; 3=evicted newer insecure cookie; 4=evicted oldest insecure cookie; 5=evicted secure cookie; 6=evicting secure cookie blocked; 7=blocked downgrading secure cookie from http; 8=downgraded secure cookie from https"
   },
+  "COOKIE_SCHEME_HTTPS": {
+    "record_in_processes": ["main", "content"],
+    "alert_emails": ["cpeterson@mozilla.com", "seceng-telemetry@mozilla.com"],
+    "bug_numbers": [1160368],
+    "expires_in_version": "60",
+    "kind": "enumerated",
+    "n_values": 10,
+    "description": "How often are first- and third-party cookies set from HTTPS origins? 0=first/http, 1=first/http+secure?!, 2=first/https, 3=first/https+secure, 4=third/http, 5=third/http+secure?!, 6=third/https, 7=third/https+secure"
+  },
   "NTLM_MODULE_USED_2": {
     "record_in_processes": ["main", "content"],
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 8,
     "description": "The module used for the NTLM protocol (Windows_API, Kerberos, Samba_auth or Generic) and whether or not the authentication was used to connect to a proxy server. This data is collected only once per session (at first NTLM authentification) ; fixed version."
   },
   "FX_THUMBNAILS_BG_QUEUE_SIZE_ON_CAPTURE": {
--- a/toolkit/locales/en-US/chrome/mozapps/downloads/downloads.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/downloads/downloads.properties
@@ -98,17 +98,15 @@ doneSize=#1 #2
 # LOCALIZATION NOTE (doneScheme): #1 URI scheme like data: jar: about:
 doneScheme2=%1$S resource
 # LOCALIZATION NOTE (doneFileScheme): Special case of doneScheme for file:
 # This is used as an eTLD replacement for local files, so make it lower case
 doneFileScheme=local file
 
 # LOCALIZATION NOTE (yesterday): Displayed time for files finished yesterday
 yesterday=Yesterday
-# LOCALIZATION NOTE (monthDate): #1 month name; #2 date number; e.g., January 22
-monthDate2=%1$S %2$S
 
 fileExecutableSecurityWarning=“%S” is an executable file. Executable files may contain viruses or other malicious code that could harm your computer. Use caution when opening this file. Are you sure you want to launch “%S”?
 fileExecutableSecurityWarningTitle=Open Executable File?
 fileExecutableSecurityWarningDontAsk=Don’t ask me this again
 
 # Desktop folder name for downloaded files
 downloadsFolder=Downloads
--- a/toolkit/mozapps/downloads/DownloadUtils.jsm
+++ b/toolkit/mozapps/downloads/DownloadUtils.jsm
@@ -74,17 +74,16 @@ var gStr = {
   transferSameUnits: "transferSameUnits2",
   transferDiffUnits: "transferDiffUnits2",
   transferNoTotal: "transferNoTotal2",
   timePair: "timePair3",
   timeLeftSingle: "timeLeftSingle3",
   timeLeftDouble: "timeLeftDouble3",
   timeFewSeconds: "timeFewSeconds2",
   timeUnknown: "timeUnknown2",
-  monthDate: "monthDate2",
   yesterday: "yesterday",
   doneScheme: "doneScheme2",
   doneFileScheme: "doneFileScheme",
   units: ["bytes", "kilobyte", "megabyte", "gigabyte"],
   // Update timeSize in convertTimeUnits if changing the length of this array
   timeUnits: ["shortSeconds", "shortMinutes", "shortHours", "shortDays"],
   infiniteRate: "infiniteRate",
 };
@@ -359,19 +358,20 @@ this.DownloadUtils = {
     } else if (today - aDate < (MS_PER_DAY)) {
       // After yesterday started, show yesterday
       dateTimeCompact = gBundle.GetStringFromName(gStr.yesterday);
     } else if (today - aDate < (6 * MS_PER_DAY)) {
       // After last week started, show day of week
       dateTimeCompact = aDate.toLocaleDateString(undefined, { weekday: "long" });
     } else {
       // Show month/day
-      let month = aDate.toLocaleDateString(undefined, { month: "long" });
-      let date = aDate.getDate();
-      dateTimeCompact = gBundle.formatStringFromName(gStr.monthDate, [month, date], 2);
+      dateTimeCompact = aDate.toLocaleString(undefined, {
+                          month: "long",
+                          day: "numeric"
+      });
     }
 
     const dtOptions = { dateStyle: "long", timeStyle: "short" };
     dateTimeFull =
       Services.intl.createDateTimeFormat(undefined, dtOptions).format(aDate);
 
     return [dateTimeCompact, dateTimeFull];
   },
--- a/xpcom/threads/ThreadEventTarget.cpp
+++ b/xpcom/threads/ThreadEventTarget.cpp
@@ -3,17 +3,19 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "ThreadEventTarget.h"
 #include "mozilla/ThreadEventQueue.h"
 
 #include "LeakRefPtr.h"
+#include "mozilla/TimeStamp.h"
 #include "nsComponentManagerUtils.h"
+#include "nsITimer.h"
 #include "nsThreadManager.h"
 #include "nsThreadSyncDispatch.h"
 #include "nsThreadUtils.h"
 #include "nsXPCOMPrivate.h" // for gXPCOMThreadsShutDown
 
 #ifdef MOZ_TASK_TRACER
 #include "GeckoTaskTracer.h"
 #include "TracedTaskCommon.h"
--- a/xpcom/threads/nsThreadUtils.cpp
+++ b/xpcom/threads/nsThreadUtils.cpp
@@ -5,16 +5,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsThreadUtils.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/Likely.h"
 #include "mozilla/TimeStamp.h"
 #include "LeakRefPtr.h"
 #include "nsComponentManagerUtils.h"
+#include "nsITimer.h"
 
 #include "nsComponentManagerUtils.h"
 
 #ifdef MOZILLA_INTERNAL_API
 # include "nsThreadManager.h"
 #else
 # include "nsXPCOMCIDInternal.h"
 # include "nsIThreadManager.h"