Merge inbound to m-c a=merge
authorWes Kocher <wkocher@mozilla.com>
Fri, 16 Jan 2015 17:33:04 -0800
changeset 253116 369a8f14ccf8c41da54d76992cb205080fccce51
parent 253010 be3ff0fea299b223120e16f67c59f522b1c61fe8 (current diff)
parent 253115 2b6bd6b2dfb66f82dfd8c57691d55766ebd81b63 (diff)
child 253117 debc66b7bfe7822e79ceab4b61f1f1db7a7f80a6
child 253177 51f665bec8d758942c506aceae2709689e7e606a
push id721
push userjlund@mozilla.com
push dateTue, 21 Apr 2015 23:03:33 +0000
treeherdermozilla-release@d27c9211ebb3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone38.0a1
first release with
nightly linux32
369a8f14ccf8 / 38.0a1 / 20150117030203 / files
nightly linux64
369a8f14ccf8 / 38.0a1 / 20150117030203 / files
nightly mac
369a8f14ccf8 / 38.0a1 / 20150117030203 / files
nightly win32
369a8f14ccf8 / 38.0a1 / 20150117030203 / files
nightly win64
369a8f14ccf8 / 38.0a1 / 20150117030203 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to m-c a=merge
browser/app/profile/firefox.js
memory/mozalloc/VolatileBuffer.h
memory/mozalloc/VolatileBufferAshmem.cpp
memory/mozalloc/VolatileBufferFallback.cpp
memory/mozalloc/VolatileBufferOSX.cpp
memory/mozalloc/VolatileBufferWindows.cpp
memory/mozalloc/tests/TestVolatileBuffer.cpp
memory/mozalloc/tests/moz.build
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Bug 1101553 - remove nsPIPlacesHistoryListenersNotifier
+Bug 1118618's backout needed a clobber
--- a/browser/base/content/test/general/pinning_reports.sjs
+++ b/browser/base/content/test/general/pinning_reports.sjs
@@ -1,13 +1,15 @@
 const EXPECTED_CHAIN = [
   "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"
   ];
 
+const MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE = -16384;
+
 function parseReport(request) {
   // read the report from the request
   let inputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
   inputStream.init(request.bodyInputStream, 0x01, 0004, 0);
 
   let body = "";
   if (inputStream) {
     while (inputStream.available()) {
@@ -33,16 +35,22 @@ function handleRequest(request, response
           // if the chain differs, send an error response to cause test
           // failure
           response.setStatusLine("1.1", 500, "Server error");
           response.write("<html>The report contained an unexpected chain</html>");
           return;
         }
       }
 
+      if (report.errorCode !== MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE) {
+        response.setStatusLine("1.1", 500, "Server error");
+        response.write("<html>The report contained an unexpected error code</html>");
+        return;
+      }
+
       // if all is as expected, send the 201 the client expects
       response.setStatusLine("1.1", 201, "Created");
       response.write("<html>OK</html>");
       break;
     case "nocert":
       report = parseReport(request);
       certChain = report.failedCertChain;
 
--- a/dom/base/Attr.cpp
+++ b/dom/base/Attr.cpp
@@ -178,17 +178,17 @@ Attr::GetNameAtom(nsIContent* aContent)
   return nameAtom.forget();
 }
 
 NS_IMETHODIMP
 Attr::GetValue(nsAString& aValue)
 {
   Element* element = GetElement();
   if (element) {
-    nsCOMPtr<nsIAtom> nameAtom = GetNameAtom(element);
+    nsCOMPtr<nsIAtom> nameAtom = mNodeInfo->NameAtom();
     element->GetAttr(mNodeInfo->NamespaceID(), nameAtom, aValue);
   }
   else {
     aValue = mValue;
   }
 
   return NS_OK;
 }
@@ -197,17 +197,17 @@ void
 Attr::SetValue(const nsAString& aValue, ErrorResult& aRv)
 {
   Element* element = GetElement();
   if (!element) {
     mValue = aValue;
     return;
   }
 
-  nsCOMPtr<nsIAtom> nameAtom = GetNameAtom(element);
+  nsCOMPtr<nsIAtom> nameAtom = mNodeInfo->NameAtom();
   aRv = element->SetAttr(mNodeInfo->NamespaceID(),
                          nameAtom,
                          mNodeInfo->GetPrefixAtom(),
                          aValue,
                          true);
 }
 
 NS_IMETHODIMP
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -1194,17 +1194,19 @@ Element::SetAttributeNode(Attr& aNewAttr
   return Attributes()->SetNamedItem(aNewAttr, aError);
 }
 
 already_AddRefed<Attr>
 Element::RemoveAttributeNode(Attr& aAttribute,
                              ErrorResult& aError)
 {
   OwnerDoc()->WarnOnceAbout(nsIDocument::eRemoveAttributeNode);
-  return Attributes()->RemoveNamedItem(aAttribute.NodeName(), aError);
+  nsAutoString nameSpaceURI;
+  aAttribute.NodeInfo()->GetNamespaceURI(nameSpaceURI);
+  return Attributes()->RemoveNamedItemNS(nameSpaceURI, aAttribute.NodeInfo()->LocalName(), aError);
 }
 
 void
 Element::GetAttributeNS(const nsAString& aNamespaceURI,
                         const nsAString& aLocalName,
                         nsAString& aReturn)
 {
   int32_t nsid =
--- a/dom/base/nsContentPermissionHelper.cpp
+++ b/dom/base/nsContentPermissionHelper.cpp
@@ -469,17 +469,17 @@ RemotePermissionRequest::DoAllow(JS::Han
 {
   NS_ASSERTION(mRequest, "We need a request");
   mRequest->Allow(aChoices);
 }
 
 // PContentPermissionRequestChild
 bool
 RemotePermissionRequest::Recv__delete__(const bool& aAllow,
-                                        const nsTArray<PermissionChoice>& aChoices)
+                                        InfallibleTArray<PermissionChoice>&& aChoices)
 {
   if (aAllow && mWindow->IsCurrentInnerWindow()) {
     // Use 'undefined' if no choice is provided.
     if (aChoices.IsEmpty()) {
       DoAllow(JS::UndefinedHandleValue);
       return true;
     }
 
--- a/dom/base/nsContentPermissionHelper.h
+++ b/dom/base/nsContentPermissionHelper.h
@@ -112,17 +112,17 @@ class RemotePermissionRequest MOZ_FINAL 
 public:
   NS_DECL_ISUPPORTS
 
   RemotePermissionRequest(nsIContentPermissionRequest* aRequest,
                           nsPIDOMWindow* aWindow);
 
   // It will be called when prompt dismissed.
   virtual bool Recv__delete__(const bool &aAllow,
-                              const nsTArray<PermissionChoice>& aChoices) MOZ_OVERRIDE;
+                              InfallibleTArray<PermissionChoice>&& aChoices) MOZ_OVERRIDE;
 
   void IPDLAddRef()
   {
     mIPCOpen = true;
     AddRef();
   }
 
   void IPDLRelease()
@@ -141,8 +141,9 @@ private:
   void DoCancel();
 
   nsCOMPtr<nsIContentPermissionRequest> mRequest;
   nsCOMPtr<nsPIDOMWindow>               mWindow;
   bool                                  mIPCOpen;
 };
 
 #endif // nsContentPermissionHelper_h
+
--- a/dom/base/nsDOMAttributeMap.cpp
+++ b/dom/base/nsDOMAttributeMap.cpp
@@ -311,56 +311,61 @@ nsDOMAttributeMap::SetNamedItemInternal(
     if (aError.Failed()) {
       return nullptr;
     }
 
     NS_ASSERTION(adoptedNode == &aAttr, "Uh, adopt node changed nodes?");
   }
 
   // Get nodeinfo and preexisting attribute (if it exists)
-  nsAutoString name;
-  nsRefPtr<mozilla::dom::NodeInfo> ni;
+  nsRefPtr<NodeInfo> oldNi;
+
+  if (!aWithNS) {
+    nsAutoString name;
+    aAttr.GetName(name);
+    oldNi = mContent->GetExistingAttrNameFromQName(name);
+  }
+  else {
+    uint32_t i, count = mContent->GetAttrCount();
+    for (i = 0; i < count; ++i) {
+      const nsAttrName* name = mContent->GetAttrNameAt(i);
+      int32_t attrNS = name->NamespaceID();
+      nsIAtom* nameAtom = name->LocalName();
+
+      // we're purposefully ignoring the prefix.
+      if (aAttr.NodeInfo()->Equals(nameAtom, attrNS)) {
+        oldNi = mContent->NodeInfo()->NodeInfoManager()->
+          GetNodeInfo(nameAtom, name->GetPrefix(), aAttr.NodeInfo()->NamespaceID(),
+                      nsIDOMNode::ATTRIBUTE_NODE);
+        break;
+      }
+    }
+  }
 
   nsRefPtr<Attr> attr;
-  // SetNamedItemNS()
-  if (aWithNS) {
-    // Return existing attribute, if present
-    ni = aAttr.NodeInfo();
 
-    if (mContent->HasAttr(ni->NamespaceID(), ni->NameAtom())) {
-      attr = RemoveAttribute(ni);
-    }
-  } else { // SetNamedItem()
-    aAttr.GetName(name);
+  if (oldNi) {
+    nsRefPtr<Attr> oldAttr = GetAttribute(oldNi, true);
 
-    // get node-info of old attribute
-    ni = mContent->GetExistingAttrNameFromQName(name);
-    if (ni) {
-      attr = RemoveAttribute(ni);
+    if (oldAttr == &aAttr) {
+      return oldAttr.forget();
     }
-    else {
-      if (mContent->IsInHTMLDocument() &&
-          mContent->IsHTML()) {
-        nsContentUtils::ASCIIToLower(name);
-      }
 
-      rv = mContent->NodeInfo()->NodeInfoManager()->
-        GetNodeInfo(name, nullptr, kNameSpaceID_None,
-                    nsIDOMNode::ATTRIBUTE_NODE, getter_AddRefs(ni));
-      if (NS_FAILED(rv)) {
-        aError.Throw(rv);
-        return nullptr;
-      }
-      // value is already empty
+    if (oldAttr) {
+      attr = RemoveNamedItem(oldNi, aError);
+      NS_ASSERTION(attr->NodeInfo()->NameAndNamespaceEquals(oldNi),
+        "RemoveNamedItem() called, attr->NodeInfo() should be equal to oldNi!");
     }
   }
 
   nsAutoString value;
   aAttr.GetValue(value);
 
+  nsRefPtr<NodeInfo> ni = aAttr.NodeInfo();
+
   // Add the new attribute to the attribute map before updating
   // its value in the element. @see bug 364413.
   nsAttrKey attrkey(ni->NamespaceID(), ni->NameAtom());
   EnsureAttributeCache();
   mAttributeCache->Put(attrkey, &aAttr);
   aAttr.SetMap(this);
 
   rv = mContent->SetAttr(ni->NamespaceID(), ni->NameAtom(),
@@ -368,16 +373,25 @@ nsDOMAttributeMap::SetNamedItemInternal(
   if (NS_FAILED(rv)) {
     aError.Throw(rv);
     DropAttribute(ni->NamespaceID(), ni->NameAtom());
   }
 
   return attr.forget();
 }
 
+already_AddRefed<Attr>
+nsDOMAttributeMap::RemoveNamedItem(NodeInfo* aNodeInfo, ErrorResult& aError)
+{
+  nsRefPtr<Attr> attribute = GetAttribute(aNodeInfo, true);
+  // This removes the attribute node from the attribute map.
+  aError = mContent->UnsetAttr(aNodeInfo->NamespaceID(), aNodeInfo->NameAtom(), true);
+  return attribute.forget();
+}
+
 NS_IMETHODIMP
 nsDOMAttributeMap::RemoveNamedItem(const nsAString& aName,
                                    nsIDOMAttr** aReturn)
 {
   NS_ENSURE_ARG_POINTER(aReturn);
 
   ErrorResult rv;
   *aReturn = RemoveNamedItem(aName, rv).take();
@@ -393,21 +407,17 @@ nsDOMAttributeMap::RemoveNamedItem(const
   }
 
   nsRefPtr<mozilla::dom::NodeInfo> ni = mContent->GetExistingAttrNameFromQName(aName);
   if (!ni) {
     aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
     return nullptr;
   }
 
-  nsRefPtr<Attr> attribute = GetAttribute(ni, true);
-
-  // This removes the attribute node from the attribute map.
-  aError = mContent->UnsetAttr(ni->NamespaceID(), ni->NameAtom(), true);
-  return attribute.forget();
+  return RemoveNamedItem(ni, aError);
 }
 
 
 Attr*
 nsDOMAttributeMap::IndexedGetter(uint32_t aIndex, bool& aFound)
 {
   aFound = false;
   NS_ENSURE_TRUE(mContent, nullptr);
@@ -495,16 +505,17 @@ nsDOMAttributeMap::GetAttrNodeInfo(const
   }
 
   uint32_t i, count = mContent->GetAttrCount();
   for (i = 0; i < count; ++i) {
     const nsAttrName* name = mContent->GetAttrNameAt(i);
     int32_t attrNS = name->NamespaceID();
     nsIAtom* nameAtom = name->LocalName();
 
+    // we're purposefully ignoring the prefix.
     if (nameSpaceID == attrNS &&
         nameAtom->Equals(aLocalName)) {
       nsRefPtr<mozilla::dom::NodeInfo> ni;
       ni = mContent->NodeInfo()->NodeInfoManager()->
         GetNodeInfo(nameAtom, name->GetPrefix(), nameSpaceID,
                     nsIDOMNode::ATTRIBUTE_NODE);
 
       return ni.forget();
@@ -531,21 +542,17 @@ nsDOMAttributeMap::RemoveNamedItemNS(con
                                      ErrorResult& aError)
 {
   nsRefPtr<mozilla::dom::NodeInfo> ni = GetAttrNodeInfo(aNamespaceURI, aLocalName);
   if (!ni) {
     aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
     return nullptr;
   }
 
-  nsRefPtr<Attr> attr = RemoveAttribute(ni);
-  mozilla::dom::NodeInfo* attrNi = attr->NodeInfo();
-  mContent->UnsetAttr(attrNi->NamespaceID(), attrNi->NameAtom(), true);
-
-  return attr.forget();
+  return RemoveNamedItem(ni, aError);
 }
 
 uint32_t
 nsDOMAttributeMap::Count() const
 {
   return mAttributeCache ? mAttributeCache->Count() : 0;
 }
 
--- a/dom/base/nsDOMAttributeMap.h
+++ b/dom/base/nsDOMAttributeMap.h
@@ -147,16 +147,18 @@ public:
   Attr* NamedGetter(const nsAString& aAttrName, bool& aFound);
   bool NameIsEnumerable(const nsAString& aName);
   already_AddRefed<Attr>
   SetNamedItem(Attr& aAttr, ErrorResult& aError)
   {
     return SetNamedItemInternal(aAttr, false, aError);
   }
   already_AddRefed<Attr>
+  RemoveNamedItem(mozilla::dom::NodeInfo* aNodeInfo, ErrorResult& aError);
+  already_AddRefed<Attr>
   RemoveNamedItem(const nsAString& aName, ErrorResult& aError);
  
   Attr* Item(uint32_t aIndex);
   Attr* IndexedGetter(uint32_t aIndex, bool& aFound);
   uint32_t Length() const;
 
   Attr*
   GetNamedItemNS(const nsAString& aNamespaceURI,
--- a/dom/base/nsFrameLoader.cpp
+++ b/dom/base/nsFrameLoader.cpp
@@ -2299,17 +2299,17 @@ nsFrameLoader::CreateStaticClone(nsIFram
 
   viewer->SetDOMDocument(clonedDOMDoc);
   return NS_OK;
 }
 
 bool
 nsFrameLoader::DoLoadFrameScript(const nsAString& aURL, bool aRunInGlobalScope)
 {
-  mozilla::dom::PBrowserParent* tabParent = GetRemoteBrowser();
+  auto* tabParent = static_cast<TabParent*>(GetRemoteBrowser());
   if (tabParent) {
     return tabParent->SendLoadRemoteScript(nsString(aURL), aRunInGlobalScope);
   }
   nsRefPtr<nsInProcessTabChildGlobal> tabChild =
     static_cast<nsInProcessTabChildGlobal*>(GetTabChildGlobalAsEventTarget());
   if (tabChild) {
     tabChild->LoadFrameScript(aURL, aRunInGlobalScope);
   }
--- a/dom/base/nsHTMLContentSerializer.cpp
+++ b/dom/base/nsHTMLContentSerializer.cpp
@@ -187,17 +187,17 @@ nsHTMLContentSerializer::AppendElementSt
     return NS_OK;
   }
 
   nsIAtom *name = content->Tag();
   int32_t ns = content->GetNameSpaceID();
 
   bool lineBreakBeforeOpen = LineBreakBeforeOpen(ns, name);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
     if (mColPos && lineBreakBeforeOpen) {
       AppendNewLineToString(aStr);
     }
     else {
       MaybeAddNewlineForRootNode(aStr);
     }
     if (!mColPos) {
       AppendIndentation(aStr);
@@ -220,17 +220,17 @@ nsHTMLContentSerializer::AppendElementSt
   
   AppendToString(kLessThan, aStr);
 
   AppendToString(nsDependentAtomString(name), aStr);
 
   MaybeEnterInPreContent(content);
 
   // for block elements, we increase the indentation
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw)
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel())
     IncrIndentation(name);
 
   // Need to keep track of OL and LI elements in order to get ordinal number 
   // for the LI.
   if (mIsCopying && name == nsGkAtoms::ol && ns == kNameSpaceID_XHTML){
     // We are copying and current node is an OL;
     // Store its start attribute value in olState->startVal.
     nsAutoString start;
@@ -275,18 +275,18 @@ nsHTMLContentSerializer::AppendElementSt
   if (ns == kNameSpaceID_XHTML &&
       (name == nsGkAtoms::script ||
        name == nsGkAtoms::style ||
        name == nsGkAtoms::noscript ||
        name == nsGkAtoms::noframes)) {
     ++mDisableEntityEncoding;
   }
 
-  if ((mDoFormat || forceFormat) && !mPreLevel &&
-    !mDoRaw && LineBreakAfterOpen(ns, name)) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel() &&
+    LineBreakAfterOpen(ns, name)) {
     AppendNewLineToString(aStr);
   }
 
   AfterElementStart(content, aOriginalElement, aStr);
 
   return NS_OK;
 }
   
@@ -307,28 +307,28 @@ nsHTMLContentSerializer::AppendElementEn
        name == nsGkAtoms::noscript ||
        name == nsGkAtoms::noframes)) {
     --mDisableEntityEncoding;
   }
 
   bool forceFormat = !(mFlags & nsIDocumentEncoder::OutputIgnoreMozDirty) &&
                      content->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
     DecrIndentation(name);
   }
 
   if (name == nsGkAtoms::script) {
     nsCOMPtr<nsIScriptElement> script = do_QueryInterface(aElement);
 
-    if (script && script->IsMalformed()) {
+    if (ShouldMaintainPreLevel() && script && script->IsMalformed()) {
       // We're looking at a malformed script tag. This means that the end tag
       // was missing in the source. Imitate that here by not serializing the end
       // tag.
-      --mPreLevel;
+      --PreLevel();
       return NS_OK;
     }
   }
   else if (mIsCopying && name == nsGkAtoms::ol && ns == kNameSpaceID_XHTML) {
     NS_ASSERTION((!mOLStateStack.IsEmpty()), "Cannot have an empty OL Stack");
     /* Though at this point we must always have an state to be deleted as all 
     the OL opening tags are supposed to push an olState object to the stack*/
     if (!mOLStateStack.IsEmpty()) {
@@ -346,17 +346,17 @@ nsHTMLContentSerializer::AppendElementEn
         IsContainer(parserService->HTMLCaseSensitiveAtomTagToId(name),
                     isContainer);
       if (!isContainer) {
         return NS_OK;
       }
     }
   }
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
 
     bool lineBreakBeforeClose = LineBreakBeforeClose(ns, name);
 
     if (mColPos && lineBreakBeforeClose) {
       AppendNewLineToString(aStr);
     }
     if (!mColPos) {
       AppendIndentation(aStr);
@@ -372,18 +372,18 @@ nsHTMLContentSerializer::AppendElementEn
   }
 
   AppendToString(kEndTag, aStr);
   AppendToString(nsDependentAtomString(name), aStr);
   AppendToString(kGreaterThan, aStr);
 
   MaybeLeaveFromPreContent(content);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel
-      && !mDoRaw && LineBreakAfterClose(ns, name)) {
+  if ((mDoFormat || forceFormat)&& !mDoRaw  && !PreLevel()
+      && LineBreakAfterClose(ns, name)) {
     AppendNewLineToString(aStr);
   }
   else {
     MaybeFlagNewlineForRootNode(aElement);
   }
 
   if (name == nsGkAtoms::body && ns == kNameSpaceID_XHTML) {
     --mInBody;
--- a/dom/base/nsPlainTextSerializer.cpp
+++ b/dom/base/nsPlainTextSerializer.cpp
@@ -17,16 +17,17 @@
 #include "nsTextFragment.h"
 #include "nsContentUtils.h"
 #include "nsReadableUtils.h"
 #include "nsUnicharUtils.h"
 #include "nsCRT.h"
 #include "mozilla/dom/Element.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/BinarySearch.h"
+#include "nsComputedDOMStyle.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 #define PREF_STRUCTS "converter.html2txt.structs"
 #define PREF_HEADER_STRATEGY "converter.html2txt.header_strategy"
 
 static const  int32_t kTabSize=4;
@@ -351,16 +352,17 @@ nsPlainTextSerializer::AppendElementStar
   nsIAtom* id = GetIdForContent(mElement);
 
   bool isContainer = !nsContentUtils::IsHTMLVoid(id);
 
   mOutputString = &aStr;
 
   if (isContainer) {
     rv = DoOpenContainer(id);
+    mPreformatStack.push(IsElementPreformatted(mElement));
   }
   else {
     rv = DoAddLeaf(id);
   }
 
   mElement = nullptr;
   mOutputString = nullptr;
 
@@ -384,16 +386,17 @@ nsPlainTextSerializer::AppendElementEnd(
 
   bool isContainer = !nsContentUtils::IsHTMLVoid(id);
 
   mOutputString = &aStr;
 
   rv = NS_OK;
   if (isContainer) {
     rv = DoCloseContainer(id);
+    mPreformatStack.pop();
   }
 
   mElement = nullptr;
   mOutputString = nullptr;
 
   if (id == nsGkAtoms::head) {
     NS_ASSERTION(mHeadLevel != 0,
                  "mHeadLevel being decremented below 0");
@@ -1532,17 +1535,17 @@ nsPlainTextSerializer::Write(const nsASt
   // Output directly while the other code path goes through AddToLine.
   if ((mPreFormatted && !mWrapColumn) || IsInPre()
       || ((mSpanLevel > 0 || mDontWrapAnyQuotes)
           && mEmptyLines >= 0 && str.First() == char16_t('>'))) {
     // No intelligent wrapping.
 
     // This mustn't be mixed with intelligent wrapping without clearing
     // the mCurrentLine buffer before!!!
-    NS_ASSERTION(mCurrentLine.IsEmpty(),
+    NS_ASSERTION(mCurrentLine.IsEmpty() || IsInPre(),
                  "Mixed wrapping data and nonwrapping data on the same line");
     if (!mCurrentLine.IsEmpty()) {
       FlushLine();
     }
 
     // Put the mail quote "> " chars in, if appropriate.
     // Have to put it in before every line.
     while(bol<totLen) {
@@ -1750,38 +1753,32 @@ nsPlainTextSerializer::GetIdForContent(n
   if (!aContent->IsHTML()) {
     return nullptr;
   }
 
   nsIAtom* localName = aContent->Tag();
   return localName->IsStaticAtom() ? localName : nullptr;
 }
 
-/**
- * Returns true if we currently are inside a <pre>. The check is done
- * by traversing the tag stack looking for <pre> until we hit a block
- * level tag which is assumed to override any <pre>:s below it in
- * the stack. To do this correctly to a 100% would require access
- * to style which we don't support in this converter.
- */  
 bool
 nsPlainTextSerializer::IsInPre()
 {
-  int32_t i = mTagStackIndex;
-  while(i > 0) {
-    if (mTagStack[i - 1] == nsGkAtoms::pre)
-      return true;
-    if (nsContentUtils::IsHTMLBlock(mTagStack[i - 1])) {
-      // We assume that every other block overrides a <pre>
-      return false;
-    }
-    --i;
+  return !mPreformatStack.empty() && mPreformatStack.top();
+}
+
+bool
+nsPlainTextSerializer::IsElementPreformatted(Element* aElement)
+{
+  nsRefPtr<nsStyleContext> styleContext =
+    nsComputedDOMStyle::GetStyleContextForElementNoFlush(aElement, nullptr,
+                                                         nullptr);
+  if (styleContext) {
+    const nsStyleText* textStyle = styleContext->StyleText();
+    return textStyle->WhiteSpaceOrNewlineIsSignificant();
   }
-
-  // Not a <pre> in the whole stack
   return false;
 }
 
 /**
  * This method is required only to identify LI's inside OL.
  * Returns TRUE if we are inside an OL tag and FALSE otherwise.
  */
 bool
--- a/dom/base/nsPlainTextSerializer.h
+++ b/dom/base/nsPlainTextSerializer.h
@@ -17,16 +17,18 @@
 #include "nsCOMPtr.h"
 #include "nsIAtom.h"
 #include "nsIContentSerializer.h"
 #include "nsIDocumentEncoder.h"
 #include "nsILineBreaker.h"
 #include "nsString.h"
 #include "nsTArray.h"
 
+#include <stack>
+
 class nsIContent;
 
 namespace mozilla {
 namespace dom {
 class Element;
 } // namespace dom
 } // namespace mozilla
 
@@ -107,16 +109,19 @@ protected:
   // Stack handling functions
   bool GetLastBool(const nsTArray<bool>& aStack);
   void SetLastBool(nsTArray<bool>& aStack, bool aValue);
   void PushBool(nsTArray<bool>& aStack, bool aValue);
   bool PopBool(nsTArray<bool>& aStack);
 
   bool ShouldReplaceContainerWithPlaceholder(nsIAtom* aTag);
 
+private:
+  bool IsElementPreformatted(mozilla::dom::Element* aElement);
+
 protected:
   nsString         mCurrentLine;
   uint32_t         mHeadLevel;
   bool             mAtFirstColumn;
 
   // Handling of quoted text (for mail):
   // Quotes need to be wrapped differently from non-quoted text,
   // because quoted text has a few extra characters (e.g. ">> ")
@@ -191,16 +196,21 @@ protected:
   nsAString*            mOutputString;
 
   // The tag stack: the stack of tags we're operating on, so we can nest.
   // The stack only ever points to static atoms, so they don't need to be
   // refcounted.
   nsIAtom**        mTagStack;
   uint32_t         mTagStackIndex;
 
+  // The stack indicating whether the elements we've been operating on are
+  // CSS preformatted elements, so that we can tell if the text inside them
+  // should be formatted.
+  std::stack<bool> mPreformatStack;
+
   // Content in the stack above this index should be ignored:
   uint32_t          mIgnoreAboveIndex;
 
   // The stack for ordered lists
   int32_t         *mOLStack;
   uint32_t         mOLStackIndex;
 
   uint32_t         mULCount;
--- a/dom/base/nsXHTMLContentSerializer.cpp
+++ b/dom/base/nsXHTMLContentSerializer.cpp
@@ -28,16 +28,18 @@
 #include "nsITextToSubURI.h"
 #include "nsCRT.h"
 #include "nsIParserService.h"
 #include "nsContentUtils.h"
 #include "nsLWBrkCIID.h"
 #include "nsIScriptElement.h"
 #include "nsAttrName.h"
 #include "nsParserConstants.h"
+#include "nsComputedDOMStyle.h"
+#include "mozilla/dom/Element.h"
 
 static const int32_t kLongLineLen = 128;
 
 #define kXMLNS "xmlns"
 
 nsresult NS_NewXHTMLContentSerializer(nsIContentSerializer** aSerializer)
 {
   nsXHTMLContentSerializer* it = new nsXHTMLContentSerializer();
@@ -126,17 +128,17 @@ nsXHTMLContentSerializer::AppendText(nsI
 
   nsAutoString data;
   nsresult rv;
 
   rv = AppendTextData(aText, aStartOffset, aEndOffset, data, true);
   if (NS_FAILED(rv))
     return NS_ERROR_FAILURE;
 
-  if (mPreLevel > 0 || mDoRaw) {
+  if (mDoRaw || PreLevel() > 0) {
     AppendToStringConvertLF(data, aStr);
   }
   else if (mDoFormat) {
     AppendToStringFormatedWrapped(data, aStr);
   }
   else if (mDoWrap) {
     AppendToStringWrapped(data, aStr);
   }
@@ -530,18 +532,19 @@ nsXHTMLContentSerializer::CheckElementSt
   // even if we're not in pretty printing mode
   aForceFormat = !(mFlags & nsIDocumentEncoder::OutputIgnoreMozDirty) &&
                  aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty);
 
   nsIAtom *name = aContent->Tag();
   int32_t namespaceID = aContent->GetNameSpaceID();
 
   if (namespaceID == kNameSpaceID_XHTML) {
-    if (name == nsGkAtoms::br && mPreLevel > 0 && 
-        (mFlags & nsIDocumentEncoder::OutputNoFormattingInPre)) {
+    if (name == nsGkAtoms::br &&
+        (mFlags & nsIDocumentEncoder::OutputNoFormattingInPre) &&
+        PreLevel() > 0) {
       AppendNewLineToString(aStr);
       return false;
     }
 
     if (name == nsGkAtoms::body) {
       ++mInBody;
     }
   }
@@ -838,51 +841,70 @@ nsXHTMLContentSerializer::LineBreakAfter
 
   return false;
 }
 
 
 void
 nsXHTMLContentSerializer::MaybeEnterInPreContent(nsIContent* aNode)
 {
-
-  if (aNode->GetNameSpaceID() != kNameSpaceID_XHTML) {
+  if (!ShouldMaintainPreLevel() ||
+      aNode->GetNameSpaceID() != kNameSpaceID_XHTML) {
     return;
   }
 
   nsIAtom *name = aNode->Tag();
 
-  if (name == nsGkAtoms::pre ||
+  if (IsElementPreformatted(aNode) ||
       name == nsGkAtoms::script ||
       name == nsGkAtoms::style ||
       name == nsGkAtoms::noscript ||
       name == nsGkAtoms::noframes
       ) {
-    mPreLevel++;
+    PreLevel()++;
   }
 }
 
 void
 nsXHTMLContentSerializer::MaybeLeaveFromPreContent(nsIContent* aNode)
 {
-  if (aNode->GetNameSpaceID() != kNameSpaceID_XHTML) {
+  if (!ShouldMaintainPreLevel() ||
+      aNode->GetNameSpaceID() != kNameSpaceID_XHTML) {
     return;
   }
 
   nsIAtom *name = aNode->Tag();
-  if (name == nsGkAtoms::pre ||
+  if (IsElementPreformatted(aNode) ||
       name == nsGkAtoms::script ||
       name == nsGkAtoms::style ||
       name == nsGkAtoms::noscript ||
       name == nsGkAtoms::noframes
     ) {
-    --mPreLevel;
+    --PreLevel();
   }
 }
 
+bool
+nsXHTMLContentSerializer::IsElementPreformatted(nsIContent* aNode)
+{
+  MOZ_ASSERT(ShouldMaintainPreLevel(), "We should not be calling this needlessly");
+
+  if (!aNode->IsElement()) {
+    return false;
+  }
+  nsRefPtr<nsStyleContext> styleContext =
+    nsComputedDOMStyle::GetStyleContextForElementNoFlush(aNode->AsElement(),
+                                                         nullptr, nullptr);
+  if (styleContext) {
+    const nsStyleText* textStyle = styleContext->StyleText();
+    return textStyle->WhiteSpaceOrNewlineIsSignificant();
+  }
+  return false;
+}
+
 void 
 nsXHTMLContentSerializer::SerializeLIValueAttribute(nsIContent* aElement,
                                                     nsAString& aStr)
 {
   // We are copying and we are at the "first" LI node of OL in selected range.
   // It may not be the first LI child of OL but it's first in the selected range.
   // Note that we get into this condition only once per a OL.
   bool found = false;
--- a/dom/base/nsXHTMLContentSerializer.h
+++ b/dom/base/nsXHTMLContentSerializer.h
@@ -88,16 +88,20 @@ class nsXHTMLContentSerializer : public 
   bool IsShorthandAttr(const nsIAtom* aAttrName,
                          const nsIAtom* aElementName);
   virtual void AppendAndTranslateEntities(const nsAString& aStr,
                                           nsAString& aOutputStr) MOZ_OVERRIDE;
   nsresult EscapeURI(nsIContent* aContent,
                      const nsAString& aURI,
                      nsAString& aEscapedURI);
 
+private:
+  bool IsElementPreformatted(nsIContent* aNode);
+
+protected:
   nsCOMPtr<nsIEntityConverter> mEntityConverter;
 
   /*
    * isHTMLParser should be set to true by the HTML parser which inherits from
    * this class. It avoids to redefine methods just for few changes.
    */
   bool          mIsHTMLSerializer;
 
--- a/dom/base/nsXMLContentSerializer.cpp
+++ b/dom/base/nsXMLContentSerializer.cpp
@@ -182,17 +182,17 @@ nsXMLContentSerializer::AppendText(nsICo
 
   nsAutoString data;
   nsresult rv;
 
   rv = AppendTextData(aText, aStartOffset, aEndOffset, data, true);
   if (NS_FAILED(rv))
     return NS_ERROR_FAILURE;
 
-  if (mPreLevel > 0 || mDoRaw) {
+  if (mDoRaw || PreLevel() > 0) {
     AppendToStringConvertLF(data, aStr);
   }
   else if (mDoFormat) {
     AppendToStringFormatedWrapped(data, aStr);
   }
   else if (mDoWrap) {
     AppendToStringWrapped(data, aStr);
   }
@@ -209,17 +209,17 @@ nsXMLContentSerializer::AppendCDATASecti
                                            int32_t aEndOffset,
                                            nsAString& aStr)
 {
   NS_ENSURE_ARG(aCDATASection);
   nsresult rv;
 
   NS_NAMED_LITERAL_STRING(cdata , "<![CDATA[");
 
-  if (mPreLevel > 0 || mDoRaw) {
+  if (mDoRaw || PreLevel() > 0) {
     AppendToString(cdata, aStr);
   }
   else if (mDoFormat) {
     AppendToStringFormatedWrapped(cdata, aStr);
   }
   else if (mDoWrap) {
     AppendToStringWrapped(cdata, aStr);
   }
@@ -255,17 +255,17 @@ nsXMLContentSerializer::AppendProcessing
   if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
 
   rv = pi->GetData(data);
   if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
 
   start.AppendLiteral("<?");
   start.Append(target);
 
-  if (mPreLevel > 0 || mDoRaw) {
+  if (mDoRaw || PreLevel() > 0) {
     AppendToString(start, aStr);
   }
   else if (mDoFormat) {
     if (mAddSpace) {
       AppendNewLineToString(aStr);
     }
     AppendToStringFormatedWrapped(start, aStr);
   }
@@ -313,17 +313,17 @@ nsXMLContentSerializer::AppendComment(ns
     }
     data.Assign(frag);
   }
 
   MaybeAddNewlineForRootNode(aStr);
 
   NS_NAMED_LITERAL_STRING(startComment, "<!--");
 
-  if (mPreLevel > 0 || mDoRaw) {
+  if (mDoRaw || PreLevel() > 0) {
     AppendToString(startComment, aStr);
   }
   else if (mDoFormat) {
     if (mAddSpace) {
       AppendNewLineToString(aStr);
     }
     AppendToStringFormatedWrapped(startComment, aStr);
   }
@@ -688,17 +688,17 @@ nsXMLContentSerializer::SerializeAttr(co
                             NS_LITERAL_STRING("&amp;"));
     if (bIncludesDouble && bIncludesSingle) {
       sValue.ReplaceSubstring(NS_LITERAL_STRING("\""),
                               NS_LITERAL_STRING("&quot;"));
     }
     attrString.Append(sValue);
     attrString.Append(cDelimiter);
   }
-  if (mPreLevel > 0 || mDoRaw) {
+  if (mDoRaw || PreLevel() > 0) {
     AppendToStringConvertLF(attrString, aStr);
   }
   else if (mDoFormat) {
     AppendToStringFormatedWrapped(attrString, aStr);
   }
   else if (mDoWrap) {
     AppendToStringWrapped(attrString, aStr);
   }
@@ -893,17 +893,17 @@ nsXMLContentSerializer::AppendElementSta
   aElement->NodeInfo()->GetNamespaceURI(tagNamespaceURI);
 
   uint32_t skipAttr = ScanNamespaceDeclarations(content,
                           aOriginalElement, tagNamespaceURI);
 
   nsIAtom *name = content->Tag();
   bool lineBreakBeforeOpen = LineBreakBeforeOpen(content->GetNameSpaceID(), name);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
     if (mColPos && lineBreakBeforeOpen) {
       AppendNewLineToString(aStr);
     }
     else {
       MaybeAddNewlineForRootNode(aStr);
     }
     if (!mColPos) {
       AppendIndentation(aStr);
@@ -934,28 +934,28 @@ nsXMLContentSerializer::AppendElementSta
   if (!tagPrefix.IsEmpty()) {
     AppendToString(tagPrefix, aStr);
     AppendToString(NS_LITERAL_STRING(":"), aStr);
   }
   AppendToString(tagLocalName, aStr);
 
   MaybeEnterInPreContent(content);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
     IncrIndentation(name);
   }
 
   SerializeAttributes(content, aOriginalElement, tagPrefix, tagNamespaceURI,
                       name, aStr, skipAttr, addNSAttr);
 
   AppendEndOfElementStart(aOriginalElement, name, content->GetNameSpaceID(),
                           aStr);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel 
-    && !mDoRaw && LineBreakAfterOpen(content->GetNameSpaceID(), name)) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()
+    && LineBreakAfterOpen(content->GetNameSpaceID(), name)) {
     AppendNewLineToString(aStr);
   }
 
   AfterElementStart(content, aOriginalElement, aStr);
 
   return NS_OK;
 }
 
@@ -982,17 +982,17 @@ nsXMLContentSerializer::AppendElementEnd
 
   nsIContent* content = aElement;
 
   bool forceFormat = false, outputElementEnd;
   outputElementEnd = CheckElementEnd(content, forceFormat, aStr);
 
   nsIAtom *name = content->Tag();
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
     DecrIndentation(name);
   }
 
   if (!outputElementEnd) {
     PopNameSpaceDeclsFor(aElement);
     MaybeFlagNewlineForRootNode(aElement);
     return NS_OK;
   }
@@ -1004,17 +1004,17 @@ nsXMLContentSerializer::AppendElementEnd
   aElement->NodeInfo()->GetNamespaceURI(tagNamespaceURI);
 
 #ifdef DEBUG
   bool debugNeedToPushNamespace =
 #endif
   ConfirmPrefix(tagPrefix, tagNamespaceURI, aElement, false);
   NS_ASSERTION(!debugNeedToPushNamespace, "Can't push namespaces in closing tag!");
 
-  if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()) {
 
     bool lineBreakBeforeClose = LineBreakBeforeClose(content->GetNameSpaceID(), name);
 
     if (mColPos && lineBreakBeforeClose) {
       AppendNewLineToString(aStr);
     }
     if (!mColPos) {
       AppendIndentation(aStr);
@@ -1036,18 +1036,18 @@ nsXMLContentSerializer::AppendElementEnd
   }
   AppendToString(tagLocalName, aStr);
   AppendToString(kGreaterThan, aStr);
 
   PopNameSpaceDeclsFor(aElement);
 
   MaybeLeaveFromPreContent(content);
 
-  if ((mDoFormat || forceFormat) && !mPreLevel
-      && !mDoRaw && LineBreakAfterClose(content->GetNameSpaceID(), name)) {
+  if ((mDoFormat || forceFormat) && !mDoRaw && !PreLevel()
+      && LineBreakAfterClose(content->GetNameSpaceID(), name)) {
     AppendNewLineToString(aStr);
   }
   else {
     MaybeFlagNewlineForRootNode(aElement);
   }
 
   AfterElementEnd(content, aStr);
 
@@ -1212,33 +1212,35 @@ nsXMLContentSerializer::MaybeFlagNewline
     mAddNewlineForRootNode = parent->IsNodeOfType(nsINode::eDOCUMENT);
   }
 }
 
 void
 nsXMLContentSerializer::MaybeEnterInPreContent(nsIContent* aNode)
 {
   // support of the xml:space attribute
-  if (aNode->HasAttr(kNameSpaceID_XML, nsGkAtoms::space)) {
+  if (ShouldMaintainPreLevel() &&
+      aNode->HasAttr(kNameSpaceID_XML, nsGkAtoms::space)) {
     nsAutoString space;
     aNode->GetAttr(kNameSpaceID_XML, nsGkAtoms::space, space);
     if (space.EqualsLiteral("preserve"))
-      ++mPreLevel;
+      ++PreLevel();
   }
 }
 
 void
 nsXMLContentSerializer::MaybeLeaveFromPreContent(nsIContent* aNode)
 {
   // support of the xml:space attribute
-  if (aNode->HasAttr(kNameSpaceID_XML, nsGkAtoms::space)) {
+  if (ShouldMaintainPreLevel() &&
+      aNode->HasAttr(kNameSpaceID_XML, nsGkAtoms::space)) {
     nsAutoString space;
     aNode->GetAttr(kNameSpaceID_XML, nsGkAtoms::space, space);
     if (space.EqualsLiteral("preserve"))
-      --mPreLevel;
+      --PreLevel();
   }
 }
 
 void
 nsXMLContentSerializer::AppendNewLineToString(nsAString& aStr)
 {
   AppendToString(mLineBreak, aStr);
   mMayIgnoreLineBreakSequence = true;
@@ -1437,17 +1439,17 @@ nsXMLContentSerializer::AppendWrapped_No
   uint32_t length, colPos;
 
   do {
 
     if (mColPos) {
       colPos = mColPos;
     }
     else {
-      if (mDoFormat && !mPreLevel && !onceAgainBecauseWeAddedBreakInFront) {
+      if (mDoFormat && !mDoRaw && !PreLevel() && !onceAgainBecauseWeAddedBreakInFront) {
         colPos = mIndent.Length();
       }
       else
         colPos = 0;
     }
     foundWhitespaceInLoop = false;
     length = 0;
     // we iterate until the next whitespace character
@@ -1706,8 +1708,15 @@ nsXMLContentSerializer::AppendToStringWr
       AppendWrapped_WhitespaceSequence(pos, end, sequenceStart, aOutputStr);
     }
     else { // any other non-whitespace char
       AppendWrapped_NonWhitespaceSequence(pos, end, sequenceStart,
         mayIgnoreStartOfLineWhitespaceSequence, sequenceStartAfterAWhitespace, aOutputStr);
     }
   }
 }
+
+bool
+nsXMLContentSerializer::ShouldMaintainPreLevel() const
+{
+  // Only attempt to maintain the pre level for consumers who care about it.
+  return !mDoRaw || (mFlags & nsIDocumentEncoder::OutputNoFormattingInPre);
+}
--- a/dom/base/nsXMLContentSerializer.h
+++ b/dom/base/nsXMLContentSerializer.h
@@ -289,16 +289,26 @@ class nsXMLContentSerializer : public ns
   // the root of a document. See mAddNewlineForRootNode
   void MaybeAddNewlineForRootNode(nsAString& aStr);
   void MaybeFlagNewlineForRootNode(nsINode* aNode);
 
   // Functions to check if we enter in or leave from a preformated content
   virtual void MaybeEnterInPreContent(nsIContent* aNode);
   virtual void MaybeLeaveFromPreContent(nsIContent* aNode);
 
+  bool ShouldMaintainPreLevel() const;
+  int32_t PreLevel() const {
+    MOZ_ASSERT(ShouldMaintainPreLevel());
+    return mPreLevel;
+  }
+  int32_t& PreLevel() {
+    MOZ_ASSERT(ShouldMaintainPreLevel());
+    return mPreLevel;
+  }
+
   int32_t mPrefixIndex;
 
   struct NameSpaceDecl {
     nsString mPrefix;
     nsString mURI;
     nsIContent* mOwner;
   };
 
@@ -356,16 +366,17 @@ class nsXMLContentSerializer : public ns
   // says that if the next string to add contains a newline character at the
   // begining, then this newline character should be ignored, because a
   // such character has already been added into the output string
   bool          mMayIgnoreLineBreakSequence;
 
   bool          mBodyOnly;
   int32_t       mInBody;
 
+private:
   // number of nested elements which have preformated content
   int32_t       mPreLevel;
 };
 
 nsresult
 NS_NewXMLContentSerializer(nsIContentSerializer** aSerializer);
 
 #endif 
--- a/dom/base/test/copypaste.js
+++ b/dom/base/test/copypaste.js
@@ -155,27 +155,27 @@ function testCopyPaste (isXHTML) {
   }
   else {
     testClipboardValue("text/html", "<div id=\"div4\">\n  T<textarea>t t t</textarea>\n</div>");
     testInnerHTML("div4", "\n  T<textarea>t t t</textarea>\n");
   }
   testPasteText(" Tt t t ");
 
   copyChildrenToClipboard("div5");
-  testSelectionToString(" T ");
-  testClipboardValue("text/unicode", " T ");
+  testSelectionToString(" T     ");
+  testClipboardValue("text/unicode", " T     ");
   if (isXHTML) {
     testClipboardValue("text/html", "<div id=\"div5\">\n  T<textarea xmlns=\"http://www.w3.org/1999/xhtml\">     </textarea>\n</div>");
     testInnerHTML("div5", "\n  T<textarea xmlns=\"http://www.w3.org/1999/xhtml\">     </textarea>\n");
   }
   else {
     testClipboardValue("text/html", "<div id=\"div5\">\n  T<textarea>     </textarea>\n</div>");
     testInnerHTML("div5", "\n  T<textarea>     </textarea>\n");
   }
-  testPasteText(" T ");
+  testPasteText(" T     ");
 
   copyRangeToClipboard($("div6").childNodes[0],0, $("div6").childNodes[1],1,suppressUnicodeCheckIfHidden);
   testSelectionToString("");
 // START Disabled due to bug 564688
 if (false) {
   testClipboardValue("text/unicode", "");
   testClipboardValue("text/html", "");
 }
--- a/dom/base/test/file_htmlserializer_1_bodyonly.html
+++ b/dom/base/test/file_htmlserializer_1_bodyonly.html
@@ -28,16 +28,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_format.html
+++ b/dom/base/test/file_htmlserializer_1_format.html
@@ -37,21 +37,24 @@ var d = a < b && a > c;
       <li> non lacus posuere aliquet.</li>
       <li> Sed fermentum posuere nulla</li>
       <li> Donec tempor.</li>
     </ol>
     Donec sollicitudin tortor
     <!-- test on 
 comments -->
     <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
- Cras quis<br>
- nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
-lacus risus pulvinar ante.
-</pre>
+      Cras quis<br>
+      nisi at odio<br>
+      consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non
+      urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci
+      luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla
+      at pharetra rutrum, <br>
+      lacus risus pulvinar ante.
+    </pre>
     ut gravida eros leo ut libero
     <p></p>
     <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
     <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus
       aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
   </body>
 </html>
--- a/dom/base/test/file_htmlserializer_1_linebreak.html
+++ b/dom/base/test/file_htmlserializer_1_linebreak.html
@@ -32,16 +32,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body></html>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_links.html
+++ b/dom/base/test/file_htmlserializer_1_links.html
@@ -32,16 +32,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body></html>
--- a/dom/base/test/file_htmlserializer_1_nested_body.html
+++ b/dom/base/test/file_htmlserializer_1_nested_body.html
@@ -32,16 +32,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p><body><p>this is an other body element</p></body></body></html>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_noflag.html
+++ b/dom/base/test/file_htmlserializer_1_noflag.html
@@ -32,16 +32,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body></html>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_noformatpre.html
+++ b/dom/base/test/file_htmlserializer_1_noformatpre.html
@@ -29,23 +29,22 @@ var a=3, b=4, c=7;
 var d = a < b && a > c;
 </script>
 
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
-<pre>lacinia <em>libero</em> ullamcorper laoreet.
-
- Cras quis
-
- nisi at odio
-
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, 
-
+<pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
+ Cras quis<br>
+ nisi at odio<br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body></html>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_sibling_body.html
+++ b/dom/base/test/file_htmlserializer_1_sibling_body.html
@@ -32,16 +32,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body></html>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_sibling_body_only_body.html
+++ b/dom/base/test/file_htmlserializer_1_sibling_body_only_body.html
@@ -28,16 +28,19 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body>
\ No newline at end of file
--- a/dom/base/test/file_htmlserializer_1_wrap.html
+++ b/dom/base/test/file_htmlserializer_1_wrap.html
@@ -36,17 +36,20 @@ var d = a < b && a > c;
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum 
 posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br>
  Cras quis<br>
  nisi at odio<br>
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br>
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br>
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros leo ut libero
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc & non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus 
 aliquet lectus. Nunc vitae eros. Class aptent taciti</p></body></html>
\ No newline at end of file
--- a/dom/base/test/file_xhtmlserializer_1_bodyonly.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_bodyonly.xhtml
@@ -30,17 +30,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_format.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_format.xhtml
@@ -40,21 +40,24 @@ var d = a < b && a > c;
       <li> non lacus posuere aliquet.</li>
       <li> Sed fermentum posuere nulla</li>
       <li> Donec tempor.</li>
     </ol>
     Donec sollicitudin tortor
     <!-- test on 
 comments -->
     <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
- Cras quis<br />
- nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
-lacus risus pulvinar ante.
-</pre>
+      Cras quis<br />
+      nisi at odio<br />
+      consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non
+      urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci
+      luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla
+      at pharetra rutrum, <br />
+      lacus risus pulvinar ante.
+    </pre>
     ut gravida eros <br />
     leo ut libero
     <!-- empty element: end tag should be generated for backward compatibility with HTML -->
     <p></p>
     <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
     <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus
       aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_linebreak.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_linebreak.xhtml
@@ -38,17 +38,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_links.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_links.xhtml
@@ -38,17 +38,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_nested_body.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_nested_body.xhtml
@@ -38,17 +38,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_noflag.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_noflag.xhtml
@@ -38,17 +38,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_noformatpre.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_noformatpre.xhtml
@@ -35,24 +35,23 @@ var d = a < b && a > c;
 //]]>
 </script>
 
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
-<pre>lacinia <em>libero</em> ullamcorper laoreet.
-
- Cras quis
-
- nisi at odio
-
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, 
-
+<pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
+ Cras quis<br />
+ nisi at odio<br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_sibling_body.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_sibling_body.xhtml
@@ -38,17 +38,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_sibling_body_only_body.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_sibling_body_only_body.xhtml
@@ -30,17 +30,20 @@ var d = a < b && a > c;
 <ol><li>Fusce
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus aliquet lectus. Nunc vitae eros. Class aptent taciti</p>
--- a/dom/base/test/file_xhtmlserializer_1_wrap.xhtml
+++ b/dom/base/test/file_xhtmlserializer_1_wrap.xhtml
@@ -41,17 +41,20 @@ var d = a < b && a > c;
  a ipsum</li><li> non lacus posuere aliquet.</li><li> Sed fermentum 
 posuere nulla</li><li> Donec tempor.</li></ol>
 Donec sollicitudin tortor 
 <!-- test on 
 comments -->
 <pre>lacinia <em>libero</em> ullamcorper laoreet.<br />
  Cras quis<br />
  nisi at odio<br />
- consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at pharetra rutrum, <br />
+ consectetuer molestie. Curabitur consectetuer urna a sem. Nunc non 
+urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci 
+luctus et ultrices posuere cubilia Curae; Sed sollicitudin, nulla at 
+pharetra rutrum, <br />
 lacus risus pulvinar ante.
 </pre>
 ut gravida eros <br />leo ut libero
 <!-- empty element: end tag should be generated for backward compatibility with HTML -->
 <p></p>
 <noscript>
 <p>Curabitur consectetuer urna a sem. Nunc non urna. Cras in massa. Vestibulum ante ipsum primis in faucibus orci luctus</p></noscript>
 <p>Nam eu sapien. Sed viverra lacus. Donec quis ipsum. Nunc cursus 
--- a/dom/base/test/mochitest.ini
+++ b/dom/base/test/mochitest.ini
@@ -652,16 +652,17 @@ skip-if = buildapp == 'mulet' || buildap
 [test_bug922681.html]
 [test_bug927196.html]
 [test_bug945152.html]
 run-if = os == 'linux'
 [test_bug982153.html]
 [test_bug1008126.html]
 run-if = os == 'linux'
 [test_bug1057176.html]
+[test_bug1075702.html]
 [test_bug1101364.html]
 skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android'
 [test_caretPositionFromPoint.html]
 [test_classList.html]
 # This test fails on the Mac for some reason
 [test_copyimage.html]
 skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || toolkit != 'gtk2' && toolkit != 'gtk3' && toolkit != 'windows' || e10s #b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
 [test_copypaste.html]
new file mode 100644
--- /dev/null
+++ b/dom/base/test/test_bug1075702.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1075702
+-->
+<head>
+  <meta charset="utf-8">
+  <title> Test for Bug 1075702 </title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"> </script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"> </script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1075702"> Mozilla Bug 1075702 </a>
+<p id="display"></p>
+
+<pre id="test">
+<script type="application/javascript">
+
+  /** Test for Bug 1075702 **/
+  // test: Element.removeAttributeNode()
+
+  var a1 = document.createAttribute("aa");
+  a1.nodeValue = "lowercase";
+
+  var a2 = document.createAttribute("AA");
+  a2.nodeValue = "UPPERCASE";
+
+  document.documentElement.setAttributeNode(a1);
+  document.documentElement.setAttributeNode(a2);
+
+  is(document.documentElement.getAttributeNS("", "aa"), null, "Should be NULL!");
+  is(document.documentElement.getAttributeNS("", "AA"), "UPPERCASE", "Should be UPPERCASE!");
+
+  var removedNodeAccordingToEvent;
+
+  function mutationHandler(aEvent) {
+    removedNodeAccordingToEvent = aEvent.relatedNode;
+  }
+
+  var test1 = document.createElement("div");
+  test1.setAttribute("x", "y");
+  removedNodeAccordingToEvent = null;
+
+  function testremoveNamedItemNS() {
+    test1.addEventListener("DOMAttrModified", mutationHandler, true);
+    var removedNodeAccordingToRemoveNamedItemNS = test1.attributes.removeNamedItemNS(null, "x");
+    test1.removeEventListener("DOMAttrModified", mutationHandler, true);
+    ise(removedNodeAccordingToEvent, removedNodeAccordingToRemoveNamedItemNS, "Node removed according to event is not same as node removed by removeNamedItemNS.");
+  }
+
+  testremoveNamedItemNS();
+
+  var test2 = document.createElement("div");
+  test2.setAttribute("x", "y");
+  removedNodeAccordingToEvent = null;
+
+  function testremoveNamedItem() {
+    test2.addEventListener("DOMAttrModified", mutationHandler, true);
+    var removedNodeAccordingToRemoveNamedItem = test2.attributes.removeNamedItem("x");
+    test2.removeEventListener("DOMAttrModified", mutationHandler, true);
+    ise(removedNodeAccordingToEvent, removedNodeAccordingToRemoveNamedItem, "Node removed according to event is not same as node removed by removeNamedItem.");
+  }
+
+  testremoveNamedItem();
+
+</script>
+</body>
+</html>
--- a/dom/base/test/test_bug116083.html
+++ b/dom/base/test/test_bug116083.html
@@ -11,16 +11,20 @@ https://bugzilla.mozilla.org/show_bug.cg
 </head>
 <body>
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=116083">Mozilla Bug 116083</a>
 <div id="content">
 <div style="white-space: pre">foo  bar</div>
 <div style="white-space: pre-wrap">foo  bar</div>
 <div style="white-space: pre-line">foo  bar</div>
 <div style="white-space: -moz-pre-space">foo  bar</div>
+<div data-result="bar  baz"><span style="white-space: pre">bar  </span>baz</div>
+<div data-result="bar  baz"><span style="white-space: pre-wrap">bar  </span>baz</div>
+<div data-result="bar  baz"><span style="white-space: pre-line">bar  </span>baz</div>
+<div data-result="bar  baz"><span style="white-space: -moz-pre-space">bar  </span>baz</div>
 <div data-result="&#10;foo bar&#10;">foo  bar</div>
 </div>
 <script type="application/javascript">
 
 SimpleTest.waitForExplicitFinish();
 SimpleTest.waitForFocus(function nextTest() {
   var div = document.querySelector("#content>div");
   if (!div) {
--- a/dom/base/test/test_bug469304.html
+++ b/dom/base/test/test_bug469304.html
@@ -22,47 +22,47 @@ https://bugzilla.mozilla.org/show_bug.cg
 function testGetAttribute() {
   var a1 = document.createAttribute("aa");
   a1.nodeValue = "lowercase";
   var a2 = document.createAttribute("AA");
   a2.nodeValue = "UPPERCASE";
   document.body.setAttributeNode(a1);
   document.body.setAttributeNode(a2);
   var log = document.getElementById("log");
-  is(document.body.getAttribute('aa'), "UPPERCASE", "Wrong value (1)");
-  is(document.body.getAttribute('AA'), "UPPERCASE", "Wrong value (2)");
+  is(document.body.getAttribute('aa'), null, "Attribute has the localName AA and not aa.");
+  is(document.body.getAttribute('AA'), null, "Attribute has the localName AA and not aa.");
+  is(document.body.getAttributeNS("", "aa"), null, "Attribute should have localName AA.");
+  is(document.body.getAttributeNS("", "AA"), "UPPERCASE", "Attribute should have value UPPERCASE!");
 
   var s = "";
   for (var i = 0; i < document.body.attributes.length; ++i) {
     s += document.body.attributes[i].nodeName + "=" +
          document.body.attributes[i].nodeValue;
   }
   is(s, "AA=UPPERCASE", "Wrong attribute!");
 
   is(document.body.getAttributeNode("aa"), document.body.getAttributeNode("AA"),
      "Wrong node!");
 
-  document.body.getAttributeNode("AA").nodeValue = "FOO";
-  is(document.body.getAttribute("AA"), "FOO", "Wrong value!");
+  document.body.getAttributeNodeNS("", "AA").nodeValue = "FOO";
+  is(document.body.getAttributeNS("", "AA"), "FOO", "Wrong value!");
 
-  document.body.removeAttributeNode(document.body.getAttributeNode("AA"));
-  ok(!document.body.hasAttribute("AA"), "Should not have attribute!");
+  document.body.removeAttributeNode(document.body.getAttributeNodeNS("", "AA"));
   ok(!document.body.getAttributeNode("AA"), "Should not have attribute node!");
-  ok(!document.body.hasAttribute("aa"), "Should not have attribute!");
   ok(!document.body.getAttributeNode("aa"), "Should not have attribute node!");
 
   is(a2.nodeValue, "FOO", "Wrong value!");
   a2.nodeValue = "UPPERCASE";
   is(a2.nodeValue, "UPPERCASE", "Wrong value!");
 
   document.body.setAttributeNode(a2);
-  is(document.body.getAttribute("AA"), "UPPERCASE", "wrong value!");
-  ok(document.body.getAttributeNode("AA"), "Should have attribute node!");
-  is(document.body.getAttribute("aa"), "UPPERCASE", "wrong value!");
-  ok(document.body.getAttributeNode("aa"), "Should have attribute node!");
+  is(document.body.getAttributeNS("", "AA"), "UPPERCASE", "Wrong value!");
+  ok(document.body.getAttributeNodeNS("", "AA"), "Should have attribute node!");
+  is(document.body.getAttributeNS("", "aa"), null, "No attribute has the localName aa.");
+  ok(!document.body.getAttributeNodeNS("", "aa"), "Should not have attribute node!");
 }
 testGetAttribute();
 
 // A bit modified testcases from WebKit.
 function testGetAttributeCaseInsensitive() {
   var div = document.createElement('div');
   div.setAttribute("mixedCaseAttrib", "x");
   // Do original case lookup, and lowercase lookup.
@@ -70,17 +70,17 @@ function testGetAttributeCaseInsensitive
 }
 is(testGetAttributeCaseInsensitive(), "x", "(1)");
 
 function testGetAttributeNodeMixedCase() {
   var div = document.createElement('div');
   var a = div.ownerDocument.createAttribute("mixedCaseAttrib");
   a.nodeValue = "x";
   div.setAttributeNode(a);
-  return div.getAttribute("mixedCaseAttrib");
+  return div.getAttributeNS("", "mixedCaseAttrib");
 }
 is(testGetAttributeNodeMixedCase(), "x", "(2)");
 
 function testGetAttributeNodeLowerCase(div) {
   var div = document.createElement('div');
   var a = div.ownerDocument.createAttribute("lowercaseattrib");
   a.nodeValue = "x";
   div.setAttributeNode(a);
@@ -109,37 +109,37 @@ function testAttribNodeNamePreservesCase
 }
 is(testAttribNodeNamePreservesCase(), "A,A", "(5)");
 
 function testAttribNodeNamePreservesCaseGetNode() {
   var body = document.body;
   var a = body.ownerDocument.createAttribute("A");
   a.nodeValue = "x";
   body.setAttributeNode(a);
-  a = document.body.getAttributeNode("A");
+  a = document.body.getAttributeNodeNS("", "A");
   if (!a)
       return "FAIL";
   var result = [ a.name, a.nodeName ];
   return result.join(",");
 }
 is(testAttribNodeNamePreservesCaseGetNode(), "A,A", "(6)");
 
 function testAttribNodeNamePreservesCaseGetNode2() {
   var body = document.body;
   var a = body.ownerDocument.createAttribute("B");
   a.nodeValue = "x";
   body.setAttributeNode(a);
-  a = document.body.getAttributeNode("B");
+  a = document.body.getAttributeNodeNS("", "B");
   if (!a)
       return "FAIL";
   // Now create node second time
   a = body.ownerDocument.createAttribute("B");
   a.nodeValue = "x";
   body.setAttributeNode(a);
-  a = document.body.getAttributeNode("B");
+  a = document.body.getAttributeNodeNS("", "B");
   var result = [ a.name, a.nodeName ];
   return result.join(",");
 }
 is(testAttribNodeNamePreservesCaseGetNode2(), "B,B", "(7)");
 
 function testAttribNodeNameGetMutate() {
   var body = document.body;
   var a = body.ownerDocument.createAttribute("c");
@@ -153,19 +153,19 @@ function testAttribNodeNameGetMutate() {
 is(testAttribNodeNameGetMutate(), "1", "(8)");
 
 var node = document.createElement("div");
 var attrib = document.createAttribute("myAttrib");
 attrib.nodeValue = "XXX";
 node.setAttributeNode(attrib);
 // Note, this is different to what WebKit does
 is((new XMLSerializer).serializeToString(node),
-   "<div xmlns=\"http://www.w3.org/1999/xhtml\" myattrib=\"XXX\"></div>", "(9)");
-is(node.getAttributeNode('myAttrib').name, "myAttrib", "(10)");
-is(node.getAttributeNode('myattrib').name, "myAttrib", "(11)");
+   "<div xmlns=\"http://www.w3.org/1999/xhtml\" myAttrib=\"XXX\"></div>", "(9)");
+is(node.getAttributeNodeNS("", "myAttrib").name, "myAttrib", "(10)");
+is(node.getAttributeNodeNS("", "myattrib"), null, "(11)");
 is(attrib.name, "myAttrib", "(12)");
 
 var o = document.createElement("div");
 o.setAttribute("myAttrib","htmlattr");
 o.setAttributeNS("","myAttrib","123");
 is(o.getAttributeNodeNS("","myAttrib").nodeName, "myAttrib", "nodeName should be case-sensitive.");
 is(o.getAttributeNode("myAttrib").nodeName, "myattrib", "nodeName shouldn't be case-sensitive.");
 is(o.getAttributeNodeNS("","myAttrib").value, "123", "Should have got the case-sensitive attribute.");
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -3225,16 +3225,22 @@ CanvasRenderingContext2D::RemoveHitRegio
     if (info.mId == id) {
       mHitRegionsOptions.RemoveElementAt(x);
 
       return;
     }
   }
 }
 
+void
+CanvasRenderingContext2D::ClearHitRegions()
+{
+  mHitRegionsOptions.Clear();
+}
+
 bool
 CanvasRenderingContext2D::GetHitRegionRect(Element* aElement, nsRect& aRect)
 {
   for (unsigned int x = 0; x < mHitRegionsOptions.Length(); x++) {
     RegionInfo& info = mHitRegionsOptions[x];
     if (info.mElement == aElement) {
       mgfx::Rect bounds(info.mPath->GetBounds());
       gfxRect rect(bounds.x, bounds.y, bounds.width, bounds.height);
--- a/dom/canvas/CanvasRenderingContext2D.h
+++ b/dom/canvas/CanvasRenderingContext2D.h
@@ -264,16 +264,17 @@ public:
   void StrokeText(const nsAString& text, double x, double y,
                   const Optional<double>& maxWidth,
                   mozilla::ErrorResult& error);
   TextMetrics*
     MeasureText(const nsAString& rawText, mozilla::ErrorResult& error);
 
   void AddHitRegion(const HitRegionOptions& options, mozilla::ErrorResult& error);
   void RemoveHitRegion(const nsAString& id);
+  void ClearHitRegions();
 
   void DrawImage(const HTMLImageOrCanvasOrVideoElement& image,
                  double dx, double dy, mozilla::ErrorResult& error)
   {
     DrawImage(image, 0.0, 0.0, 0.0, 0.0, dx, dy, 0.0, 0.0, 0, error);
   }
 
   void DrawImage(const HTMLImageOrCanvasOrVideoElement& image,
--- a/dom/canvas/test/test_hitregion_canvas.html
+++ b/dom/canvas/test/test_hitregion_canvas.html
@@ -28,20 +28,36 @@ function test_hitregions() {
   var ctx = c.getContext("2d");
   var _thrown_outer = false;
   try {
     ctx.rect(10,10,100,100);
     ctx.addHitRegion({control: d});
     ctx.addHitRegion({control: e});
     ctx.addHitRegion({id: "a", control: d});
     ctx.addHitRegion({id: "a", control: d});
-    
+
     ctx.removeHitRegion("a");
     ctx.removeHitRegion("a");
     ctx.removeHitRegion("b");
+
+    ctx.clearHitRegions();
+  } catch (e) {
+      _thrown_outer = true;
+  }
+  ok(!_thrown_outer, ctx.canvas.id + ' should not throw exception');
+
+  var _thrown_outer = false;
+  try {
+    ctx.rect(10,10,100,100);
+    ctx.addHitRegion({control: d});
+    ctx.addHitRegion({control: e});
+    ctx.addHitRegion({id: "a", control: d});
+    ctx.addHitRegion({id: "a", control: d});
+
+    ctx.clearHitRegions();
   } catch (e) {
       _thrown_outer = true;
   }
   ok(!_thrown_outer, ctx.canvas.id + ' should not throw exception');
 
   var _thrown = undefined; try {
     ctx.beginPath();
     ctx.addHitRegion({control: d});
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -2669,16 +2669,77 @@ NodeAllowsClickThrough(nsINode* aNode)
       }
     }
     aNode = nsContentUtils::GetCrossDocParentNode(aNode);
   }
   return true;
 }
 #endif
 
+void
+EventStateManager::PostHandleKeyboardEvent(WidgetKeyboardEvent* aKeyboardEvent,
+                                           nsEventStatus& aStatus,
+                                           bool dispatchedToContentProcess)
+{
+  if (aStatus == nsEventStatus_eConsumeNoDefault) {
+    return;
+  }
+
+  // XXX Currently, our automated tests don't support mKeyNameIndex.
+  //     Therefore, we still need to handle this with keyCode.
+  switch(aKeyboardEvent->keyCode) {
+    case NS_VK_TAB:
+    case NS_VK_F6:
+      // This is to prevent keyboard scrolling while alt modifier in use.
+      if (!aKeyboardEvent->IsAlt()) {
+        // Handling the tab event after it was sent to content is bad,
+        // because to the FocusManager the remote-browser looks like one
+        // element, so we would just move the focus to the next element
+        // in chrome, instead of handling it in content.
+        if (dispatchedToContentProcess)
+          break;
+
+        EnsureDocument(mPresContext);
+        nsIFocusManager* fm = nsFocusManager::GetFocusManager();
+        if (fm && mDocument) {
+          // Shift focus forward or back depending on shift key
+          bool isDocMove =
+            aKeyboardEvent->IsControl() || aKeyboardEvent->keyCode == NS_VK_F6;
+          uint32_t dir = aKeyboardEvent->IsShift() ?
+            (isDocMove ? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARDDOC) :
+                         static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARD)) :
+            (isDocMove ? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARDDOC) :
+                         static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARD));
+          nsCOMPtr<nsIDOMElement> result;
+          fm->MoveFocus(mDocument->GetWindow(), nullptr, dir,
+                        nsIFocusManager::FLAG_BYKEY,
+                        getter_AddRefs(result));
+        }
+        aStatus = nsEventStatus_eConsumeNoDefault;
+      }
+      return;
+    case 0:
+      // We handle keys with no specific keycode value below.
+      break;
+    default:
+      return;
+  }
+
+  switch(aKeyboardEvent->mKeyNameIndex) {
+    case KEY_NAME_INDEX_ZoomIn:
+    case KEY_NAME_INDEX_ZoomOut:
+      ChangeFullZoom(
+        aKeyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_ZoomIn ? 1 : -1);
+      aStatus = nsEventStatus_eConsumeNoDefault;
+      break;
+    default:
+      break;
+  }
+}
+
 nsresult
 EventStateManager::PostHandleEvent(nsPresContext* aPresContext,
                                    WidgetEvent* aEvent,
                                    nsIFrame* aTargetFrame,
                                    nsEventStatus* aStatus)
 {
   NS_ENSURE_ARG(aPresContext);
   NS_ENSURE_ARG_POINTER(aStatus);
@@ -3180,50 +3241,19 @@ EventStateManager::PostHandleEvent(nsPre
     break;
 
   case NS_KEY_BEFORE_UP:
   case NS_KEY_UP:
   case NS_KEY_AFTER_UP:
     break;
 
   case NS_KEY_PRESS:
-    if (nsEventStatus_eConsumeNoDefault != *aStatus) {
+    {
       WidgetKeyboardEvent* keyEvent = aEvent->AsKeyboardEvent();
-      //This is to prevent keyboard scrolling while alt modifier in use.
-      if (!keyEvent->IsAlt()) {
-        switch(keyEvent->keyCode) {
-          case NS_VK_TAB:
-          case NS_VK_F6:
-            // Handling the tab event after it was sent to content is bad,
-            // because to the FocusManager the remote-browser looks like one
-            // element, so we would just move the focus to the next element
-            // in chrome, instead of handling it in content.
-            if (dispatchedToContentProcess)
-              break;
-
-            EnsureDocument(mPresContext);
-            nsIFocusManager* fm = nsFocusManager::GetFocusManager();
-            if (fm && mDocument) {
-              // Shift focus forward or back depending on shift key
-              bool isDocMove =
-                keyEvent->IsControl() || keyEvent->keyCode == NS_VK_F6;
-              uint32_t dir = keyEvent->IsShift() ?
-                  (isDocMove ? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARDDOC) :
-                               static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARD)) :
-                  (isDocMove ? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARDDOC) :
-                               static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARD));
-              nsCOMPtr<nsIDOMElement> result;
-              fm->MoveFocus(mDocument->GetWindow(), nullptr, dir,
-                            nsIFocusManager::FLAG_BYKEY,
-                            getter_AddRefs(result));
-            }
-            *aStatus = nsEventStatus_eConsumeNoDefault;
-            break;
-        }
-      }
+      PostHandleKeyboardEvent(keyEvent, *aStatus, dispatchedToContentProcess);
     }
     break;
 
   case NS_MOUSE_ENTER:
     if (mCurrentTarget) {
       nsCOMPtr<nsIContent> targetContent;
       mCurrentTarget->GetContentForEvent(aEvent, getter_AddRefs(targetContent));
       SetContentState(targetContent, NS_EVENT_STATE_HOVER);
--- a/dom/events/EventStateManager.h
+++ b/dom/events/EventStateManager.h
@@ -810,16 +810,19 @@ private:
                                    bool aAddState);
   static void UpdateAncestorState(nsIContent* aStartNode,
                                   nsIContent* aStopBefore,
                                   EventStates aState,
                                   bool aAddState);
   static PLDHashOperator ResetLastOverForContent(const uint32_t& aIdx,
                                                  nsRefPtr<OverOutElementsWrapper>& aChunk,
                                                  void* aClosure);
+  void PostHandleKeyboardEvent(WidgetKeyboardEvent* aKeyboardEvent,
+                               nsEventStatus& aStatus,
+                               bool dispatchedToContentProcess);
 
   int32_t     mLockCursor;
 
   // Last mouse event refPoint (the offset from the widget's origin in
   // device pixels) when mouse was locked, used to restore mouse position
   // after unlocking.
   LayoutDeviceIntPoint mPreLockPoint;
 
--- a/dom/fetch/Fetch.cpp
+++ b/dom/fetch/Fetch.cpp
@@ -23,16 +23,17 @@
 #include "mozilla/dom/File.h"
 #include "mozilla/dom/Headers.h"
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/Request.h"
 #include "mozilla/dom/Response.h"
 #include "mozilla/dom/ScriptSettings.h"
 #include "mozilla/dom/URLSearchParams.h"
 
+#include "InternalRequest.h"
 #include "InternalResponse.h"
 
 #include "WorkerPrivate.h"
 #include "WorkerRunnable.h"
 #include "WorkerScope.h"
 #include "Workers.h"
 
 namespace mozilla {
@@ -131,19 +132,16 @@ class MainThreadFetchResolver MOZ_FINAL 
 
   NS_DECL_OWNINGTHREAD
 public:
   explicit MainThreadFetchResolver(Promise* aPromise);
 
   void
   OnResponseAvailable(InternalResponse* aResponse) MOZ_OVERRIDE;
 
-  void
-  OnResponseEnd() MOZ_OVERRIDE;
-
 private:
   ~MainThreadFetchResolver();
 };
 
 class MainThreadFetchRunnable : public nsRunnable
 {
   nsRefPtr<WorkerFetchResolver> mResolver;
   nsRefPtr<InternalRequest> mRequest;
@@ -171,16 +169,21 @@ public:
     // AddFeature() call failed, don't bother running.
     if (!mResolver) {
       return NS_OK;
     }
 
     nsCOMPtr<nsIPrincipal> principal = mResolver->GetWorkerPrivate()->GetPrincipal();
     nsCOMPtr<nsILoadGroup> loadGroup = mResolver->GetWorkerPrivate()->GetLoadGroup();
     nsRefPtr<FetchDriver> fetch = new FetchDriver(mRequest, principal, loadGroup);
+    nsIDocument* doc = mResolver->GetWorkerPrivate()->GetDocument();
+    if (doc) {
+      fetch->SetReferrerPolicy(doc->GetReferrerPolicy());
+    }
+
     nsresult rv = fetch->Fetch(mResolver);
     // Right now we only support async fetch, which should never directly fail.
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
     return NS_OK;
   }
 };
@@ -202,23 +205,20 @@ FetchRequest(nsIGlobalObject* aGlobal, c
   GlobalObject global(cx, jsGlobal);
 
   nsRefPtr<Request> request = Request::Constructor(global, aInput, aInit, aRv);
   if (NS_WARN_IF(aRv.Failed())) {
     return nullptr;
   }
 
   nsRefPtr<InternalRequest> r = request->GetInternalRequest();
-  if (!r->ReferrerIsNone()) {
-    nsAutoCString ref;
-    aRv = GetRequestReferrer(aGlobal, r, ref);
-    if (NS_WARN_IF(aRv.Failed())) {
-      return nullptr;
-    }
-    r->SetReferrer(ref);
+
+  aRv = UpdateRequestReferrer(aGlobal, r);
+  if (NS_WARN_IF(aRv.Failed())) {
+    return nullptr;
   }
 
   if (NS_IsMainThread()) {
     nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal);
     if (!window) {
       aRv.Throw(NS_ERROR_FAILURE);
       return nullptr;
     }
@@ -228,23 +228,29 @@ FetchRequest(nsIGlobalObject* aGlobal, c
       aRv.Throw(NS_ERROR_FAILURE);
       return nullptr;
     }
 
     nsRefPtr<MainThreadFetchResolver> resolver = new MainThreadFetchResolver(p);
     nsCOMPtr<nsILoadGroup> loadGroup = doc->GetDocumentLoadGroup();
     nsRefPtr<FetchDriver> fetch =
       new FetchDriver(r, doc->NodePrincipal(), loadGroup);
+    fetch->SetReferrerPolicy(doc->GetReferrerPolicy());
     aRv = fetch->Fetch(resolver);
     if (NS_WARN_IF(aRv.Failed())) {
       return nullptr;
     }
   } else {
     WorkerPrivate* worker = GetCurrentThreadWorkerPrivate();
     MOZ_ASSERT(worker);
+
+    if (worker->IsServiceWorker()) {
+      r->SetSkipServiceWorker();
+    }
+
     nsRefPtr<MainThreadFetchRunnable> run = new MainThreadFetchRunnable(worker, p, r);
     if (NS_FAILED(NS_DispatchToMainThread(run))) {
       NS_WARNING("MainThreadFetchRunnable dispatch failed!");
     }
   }
 
   return p.forget();
 }
@@ -260,24 +266,16 @@ MainThreadFetchResolver::OnResponseAvail
   NS_ASSERT_OWNINGTHREAD(MainThreadFetchResolver);
   AssertIsOnMainThread();
 
   nsCOMPtr<nsIGlobalObject> go = mPromise->GetParentObject();
   mResponse = new Response(go, aResponse);
   mPromise->MaybeResolve(mResponse);
 }
 
-void
-MainThreadFetchResolver::OnResponseEnd()
-{
-  NS_ASSERT_OWNINGTHREAD(MainThreadFetchResolver);
-  AssertIsOnMainThread();
-  MOZ_ASSERT(mResponse);
-}
-
 MainThreadFetchResolver::~MainThreadFetchResolver()
 {
   NS_ASSERT_OWNINGTHREAD(MainThreadFetchResolver);
 }
 
 class WorkerFetchResponseRunnable MOZ_FINAL : public WorkerRunnable
 {
   nsRefPtr<WorkerFetchResolver> mResolver;
@@ -363,50 +361,46 @@ WorkerFetchResolver::OnResponseEnd()
     new WorkerFetchResponseEndRunnable(this);
 
   AutoSafeJSContext cx;
   if (!r->Dispatch(cx)) {
     NS_WARNING("Could not dispatch fetch resolve end");
   }
 }
 
-// Empty string for no-referrer. FIXME(nsm): Does returning empty string
-// actually lead to no-referrer in the base channel?
+// This method sets the request's referrerURL, as specified by the "determine
+// request's referrer" steps from Referrer Policy [1].
 // The actual referrer policy and stripping is dealt with by HttpBaseChannel,
-// this always returns the full API referrer URL of the relevant global.
+// this always sets the full API referrer URL of the relevant global if it is
+// not already a url or no-referrer.
+// [1]: https://w3c.github.io/webappsec/specs/referrer-policy/#determine-requests-referrer
 nsresult
-GetRequestReferrer(nsIGlobalObject* aGlobal, const InternalRequest* aRequest, nsCString& aReferrer)
+UpdateRequestReferrer(nsIGlobalObject* aGlobal, InternalRequest* aRequest)
 {
-  if (aRequest->ReferrerIsURL()) {
-    aReferrer = aRequest->ReferrerAsURL();
+  nsAutoString originalReferrer;
+  aRequest->GetReferrer(originalReferrer);
+  // If it is no-referrer ("") or a URL, don't modify.
+  if (!originalReferrer.EqualsLiteral(kFETCH_CLIENT_REFERRER_STR)) {
     return NS_OK;
   }
 
   nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal);
   if (window) {
     nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
     if (doc) {
-      nsCOMPtr<nsIURI> docURI = doc->GetDocumentURI();
-      nsAutoCString origin;
-      nsresult rv = nsContentUtils::GetASCIIOrigin(docURI, origin);
-      if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
-      }
-
       nsAutoString referrer;
       doc->GetReferrer(referrer);
-      aReferrer = NS_ConvertUTF16toUTF8(referrer);
+      aRequest->SetReferrer(referrer);
     }
   } else {
     WorkerPrivate* worker = GetCurrentThreadWorkerPrivate();
     MOZ_ASSERT(worker);
     worker->AssertIsOnWorkerThread();
-    aReferrer = worker->GetLocationInfo().mHref;
-    // XXX(nsm): Algorithm says "If source is not a URL..." but when is it
-    // not a URL?
+    WorkerPrivate::LocationInfo& info = worker->GetLocationInfo();
+    aRequest->SetReferrer(NS_ConvertUTF8toUTF16(info.mHref));
   }
 
   return NS_OK;
 }
 
 namespace {
 nsresult
 ExtractFromArrayBuffer(const ArrayBuffer& aBuffer,
--- a/dom/fetch/Fetch.h
+++ b/dom/fetch/Fetch.h
@@ -35,17 +35,17 @@ namespace workers {
 class WorkerPrivate;
 } // namespace workers
 
 already_AddRefed<Promise>
 FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput,
              const RequestInit& aInit, ErrorResult& aRv);
 
 nsresult
-GetRequestReferrer(nsIGlobalObject* aGlobal, const InternalRequest* aRequest, nsCString& aReferrer);
+UpdateRequestReferrer(nsIGlobalObject* aGlobal, InternalRequest* aRequest);
 
 /*
  * Creates an nsIInputStream based on the fetch specifications 'extract a byte
  * stream algorithm' - http://fetch.spec.whatwg.org/#concept-bodyinit-extract.
  * Stores content type in out param aContentType.
  */
 nsresult
 ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrUSVStringOrURLSearchParams& aBodyInit,
--- a/dom/fetch/FetchDriver.cpp
+++ b/dom/fetch/FetchDriver.cpp
@@ -3,16 +3,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/dom/FetchDriver.h"
 
 #include "nsIInputStream.h"
 #include "nsIOutputStream.h"
 #include "nsIHttpChannel.h"
+#include "nsIHttpChannelInternal.h"
 #include "nsIHttpHeaderVisitor.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIThreadRetargetableRequest.h"
 #include "nsIUploadChannel2.h"
 
 #include "nsContentPolicyUtils.h"
 #include "nsCORSListenerProxy.h"
 #include "nsDataHandler.h"
@@ -36,16 +37,17 @@ NS_IMPL_ISUPPORTS(FetchDriver,
                   nsIAsyncVerifyRedirectCallback)
 
 FetchDriver::FetchDriver(InternalRequest* aRequest, nsIPrincipal* aPrincipal,
                          nsILoadGroup* aLoadGroup)
   : mPrincipal(aPrincipal)
   , mLoadGroup(aLoadGroup)
   , mRequest(aRequest)
   , mFetchRecursionCount(0)
+  , mReferrerPolicy(net::RP_Default)
   , mResponseAvailableCalled(false)
 {
 }
 
 FetchDriver::~FetchDriver()
 {
   // We assert this since even on failures, we should call
   // FailWithNetworkError().
@@ -381,26 +383,29 @@ FetchDriver::HttpFetch(bool aCORSFlag, b
 
     // Set the same headers.
     nsAutoTArray<InternalHeaders::Entry, 5> headers;
     mRequest->Headers()->GetEntries(headers);
     for (uint32_t i = 0; i < headers.Length(); ++i) {
       httpChan->SetRequestHeader(headers[i].mName, headers[i].mValue, false /* merge */);
     }
 
-    // Step 2. Set the referrer. This is handled better in Bug 1112922.
-    MOZ_ASSERT(mRequest->ReferrerIsURL());
-    nsCString referrer = mRequest->ReferrerAsURL();
+    // Step 2. Set the referrer.
+    nsAutoString referrer;
+    mRequest->GetReferrer(referrer);
+    // The referrer should have already been resolved to a URL by the caller.
+    MOZ_ASSERT(!referrer.EqualsLiteral(kFETCH_CLIENT_REFERRER_STR));
     if (!referrer.IsEmpty()) {
-      nsCOMPtr<nsIURI> uri;
-      rv = NS_NewURI(getter_AddRefs(uri), referrer, nullptr, nullptr, ios);
+      nsCOMPtr<nsIURI> refURI;
+      rv = NS_NewURI(getter_AddRefs(refURI), referrer, nullptr, nullptr);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return FailWithNetworkError();
       }
-      rv = httpChan->SetReferrer(uri);
+
+      rv = httpChan->SetReferrerWithPolicy(refURI, mReferrerPolicy);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return FailWithNetworkError();
       }
     }
 
     // Step 3 "If HTTPRequest's force Origin header flag is set..."
     if (mRequest->ForceOriginHeader()) {
       nsAutoString origin;
@@ -441,16 +446,24 @@ FetchDriver::HttpFetch(bool aCORSFlag, b
       mRequest->GetMethod(method);
       rv = uploadChan->ExplicitSetUploadStream(bodyStream, contentType, -1, method, false /* aStreamHasHeaders */);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return FailWithNetworkError();
       }
     }
   }
 
+  // Set skip serviceworker flag.
+  // While the spec also gates on the client being a ServiceWorker, we can't
+  // infer that here. Instead we rely on callers to set the flag correctly.
+  if (mRequest->SkipServiceWorker()) {
+    nsCOMPtr<nsIHttpChannelInternal> internalChan = do_QueryInterface(httpChan);
+    internalChan->ForceNoIntercept();
+  }
+
   // Set up a CORS proxy that will handle the various requirements of the CORS
   // protocol. It handles the preflight cache and CORS response headers.
   // If the request is allowed, it will start our original request
   // and our observer will be notified. On failure, our observer is notified
   // directly.
   nsRefPtr<nsCORSListenerProxy> corsListener =
     new nsCORSListenerProxy(this, mPrincipal, useCredentials);
   rv = corsListener->Init(chan, true /* allow data uri */);
--- a/dom/fetch/FetchDriver.h
+++ b/dom/fetch/FetchDriver.h
@@ -9,16 +9,17 @@
 #include "nsAutoPtr.h"
 #include "nsIAsyncVerifyRedirectCallback.h"
 #include "nsIChannelEventSink.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIStreamListener.h"
 #include "nsRefPtr.h"
 
 #include "mozilla/DebugOnly.h"
+#include "mozilla/net/ReferrerPolicy.h"
 
 class nsIOutputStream;
 class nsILoadGroup;
 class nsIPrincipal;
 
 namespace mozilla {
 namespace dom {
 
@@ -26,17 +27,18 @@ class BlobSet;
 class InternalRequest;
 class InternalResponse;
 
 class FetchDriverObserver
 {
 public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FetchDriverObserver);
   virtual void OnResponseAvailable(InternalResponse* aResponse) = 0;
-  virtual void OnResponseEnd() = 0;
+  virtual void OnResponseEnd()
+  { };
 
 protected:
   virtual ~FetchDriverObserver()
   { };
 };
 
 class FetchDriver MOZ_FINAL : public nsIStreamListener,
                               public nsIChannelEventSink,
@@ -50,28 +52,37 @@ public:
   NS_DECL_NSICHANNELEVENTSINK
   NS_DECL_NSIINTERFACEREQUESTOR
   NS_DECL_NSIASYNCVERIFYREDIRECTCALLBACK
 
   explicit FetchDriver(InternalRequest* aRequest, nsIPrincipal* aPrincipal,
                        nsILoadGroup* aLoadGroup);
   NS_IMETHOD Fetch(FetchDriverObserver* aObserver);
 
+  void
+  SetReferrerPolicy(net::ReferrerPolicy aPolicy)
+  {
+    // Cannot set policy after Fetch() has been called.
+    MOZ_ASSERT(mFetchRecursionCount == 0);
+    mReferrerPolicy = aPolicy;
+  }
+
 private:
   nsCOMPtr<nsIPrincipal> mPrincipal;
   nsCOMPtr<nsILoadGroup> mLoadGroup;
   nsRefPtr<InternalRequest> mRequest;
   nsRefPtr<InternalResponse> mResponse;
   nsCOMPtr<nsIOutputStream> mPipeOutputStream;
   nsRefPtr<FetchDriverObserver> mObserver;
   nsCOMPtr<nsIInterfaceRequestor> mNotificationCallbacks;
   nsCOMPtr<nsIAsyncVerifyRedirectCallback> mRedirectCallback;
   nsCOMPtr<nsIChannel> mOldRedirectChannel;
   nsCOMPtr<nsIChannel> mNewRedirectChannel;
   uint32_t mFetchRecursionCount;
+  net::ReferrerPolicy mReferrerPolicy;
 
   DebugOnly<bool> mResponseAvailableCalled;
 
   FetchDriver() = delete;
   FetchDriver(const FetchDriver&) = delete;
   FetchDriver& operator=(const FetchDriver&) = delete;
   ~FetchDriver();
 
--- a/dom/fetch/InternalRequest.h
+++ b/dom/fetch/InternalRequest.h
@@ -8,61 +8,60 @@
 
 #include "mozilla/dom/HeadersBinding.h"
 #include "mozilla/dom/InternalHeaders.h"
 #include "mozilla/dom/RequestBinding.h"
 
 #include "nsIContentPolicy.h"
 #include "nsIInputStream.h"
 #include "nsISupportsImpl.h"
+#ifdef DEBUG
+#include "nsIURLParser.h"
+#include "nsNetCID.h"
+#include "nsServiceManagerUtils.h"
+#endif
 
 class nsIDocument;
 class nsPIDOMWindow;
 
 namespace mozilla {
 namespace dom {
 
 class FetchBodyStream;
 class Request;
 
+#define kFETCH_CLIENT_REFERRER_STR "about:client"
+
 class InternalRequest MOZ_FINAL
 {
   friend class Request;
 
 public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(InternalRequest)
 
   enum ContextFrameType
   {
     FRAMETYPE_AUXILIARY = 0,
     FRAMETYPE_TOP_LEVEL,
     FRAMETYPE_NESTED,
     FRAMETYPE_NONE,
   };
 
-  // Since referrer type can be none, client or a URL.
-  enum ReferrerType
-  {
-    REFERRER_NONE = 0,
-    REFERRER_CLIENT,
-    REFERRER_URL,
-  };
-
   enum ResponseTainting
   {
     RESPONSETAINT_BASIC,
     RESPONSETAINT_CORS,
     RESPONSETAINT_OPAQUE,
   };
 
   explicit InternalRequest()
     : mMethod("GET")
     , mHeaders(new InternalHeaders(HeadersGuardEnum::None))
     , mContextFrameType(FRAMETYPE_NONE)
-    , mReferrerType(REFERRER_CLIENT)
+    , mReferrer(NS_LITERAL_STRING(kFETCH_CLIENT_REFERRER_STR))
     , mMode(RequestMode::No_cors)
     , mCredentialsMode(RequestCredentials::Omit)
     , mResponseTainting(RESPONSETAINT_BASIC)
     , mCacheMode(RequestCache::Default)
     , mAuthenticationFlag(false)
     , mForceOriginHeader(false)
     , mPreserveContentCodings(false)
       // FIXME(nsm): This should be false by default, but will lead to the
@@ -79,18 +78,17 @@ public:
 
   explicit InternalRequest(const InternalRequest& aOther)
     : mMethod(aOther.mMethod)
     , mURL(aOther.mURL)
     , mHeaders(aOther.mHeaders)
     , mBodyStream(aOther.mBodyStream)
     , mContext(aOther.mContext)
     , mContextFrameType(aOther.mContextFrameType)
-    , mReferrerType(aOther.mReferrerType)
-    , mReferrerURL(aOther.mReferrerURL)
+    , mReferrer(aOther.mReferrer)
     , mMode(aOther.mMode)
     , mCredentialsMode(aOther.mCredentialsMode)
     , mResponseTainting(aOther.mResponseTainting)
     , mCacheMode(aOther.mCacheMode)
     , mAuthenticationFlag(aOther.mAuthenticationFlag)
     , mForceOriginHeader(aOther.mForceOriginHeader)
     , mPreserveContentCodings(aOther.mPreserveContentCodings)
     , mSameOriginDataURL(aOther.mSameOriginDataURL)
@@ -129,48 +127,73 @@ public:
   }
 
   void
   SetURL(const nsACString& aURL)
   {
     mURL.Assign(aURL);
   }
 
-  bool
-  ReferrerIsNone() const
+  void
+  GetReferrer(nsAString& aReferrer) const
   {
-    return mReferrerType == REFERRER_NONE;
+    aReferrer.Assign(mReferrer);
   }
 
-  bool
-  ReferrerIsURL() const
+  void
+  SetReferrer(const nsAString& aReferrer)
   {
-    return mReferrerType == REFERRER_URL;
+#ifdef DEBUG
+    bool validReferrer = false;
+    if (aReferrer.IsEmpty() ||
+        aReferrer.EqualsLiteral(kFETCH_CLIENT_REFERRER_STR)) {
+      validReferrer = true;
+    } else {
+      nsCOMPtr<nsIURLParser> parser = do_GetService(NS_STDURLPARSER_CONTRACTID);
+      if (!parser) {
+        NS_WARNING("Could not get parser to validate URL!");
+      } else {
+        uint32_t schemePos;
+        int32_t schemeLen;
+        uint32_t authorityPos;
+        int32_t authorityLen;
+        uint32_t pathPos;
+        int32_t pathLen;
+
+        NS_ConvertUTF16toUTF8 ref(aReferrer);
+        nsresult rv = parser->ParseURL(ref.get(), ref.Length(),
+                                       &schemePos, &schemeLen,
+                                       &authorityPos, &authorityLen,
+                                       &pathPos, &pathLen);
+        if (NS_FAILED(rv)) {
+          NS_WARNING("Invalid referrer URL!");
+        } else if (schemeLen < 0 || authorityLen < 0) {
+          NS_WARNING("Invalid referrer URL!");
+        } else {
+          validReferrer = true;
+        }
+      }
+    }
+
+    MOZ_ASSERT(validReferrer);
+#endif
+
+    mReferrer.Assign(aReferrer);
   }
 
   bool
-  ReferrerIsClient() const
+  SkipServiceWorker() const
   {
-    return mReferrerType == REFERRER_CLIENT;
-  }
-
-  nsCString
-  ReferrerAsURL() const
-  {
-    MOZ_ASSERT(ReferrerIsURL());
-    return mReferrerURL;
+    return mSkipServiceWorker;
   }
 
   void
-  SetReferrer(const nsACString& aReferrer)
+  SetSkipServiceWorker()
   {
-    // May be removed later.
-    MOZ_ASSERT(!ReferrerIsNone());
-    mReferrerType = REFERRER_URL;
-    mReferrerURL.Assign(aReferrer);
+    mSkipServiceWorker = true;
   }
 
   bool
   IsSynchronous() const
   {
     return mSynchronous;
   }
 
@@ -287,20 +310,21 @@ private:
   nsRefPtr<InternalHeaders> mHeaders;
   nsCOMPtr<nsIInputStream> mBodyStream;
 
   // nsContentPolicyType does not cover the complete set defined in the spec,
   // but it is a good start.
   nsContentPolicyType mContext;
 
   ContextFrameType mContextFrameType;
-  ReferrerType mReferrerType;
 
-  // When mReferrerType is REFERRER_URL.
-  nsCString mReferrerURL;
+  // Empty string: no-referrer
+  // "about:client": client (default)
+  // URL: an URL
+  nsString mReferrer;
 
   RequestMode mMode;
   RequestCredentials mCredentialsMode;
   ResponseTainting mResponseTainting;
   RequestCache mCacheMode;
 
   bool mAuthenticationFlag;
   bool mForceOriginHeader;
--- a/dom/fetch/Request.h
+++ b/dom/fetch/Request.h
@@ -70,25 +70,19 @@ public:
 
   RequestCache
   Cache() const
   {
     return mRequest->GetCacheMode();
   }
 
   void
-  GetReferrer(DOMString& aReferrer) const
+  GetReferrer(nsAString& aReferrer) const
   {
-    if (mRequest->ReferrerIsNone()) {
-      aReferrer.AsAString() = EmptyString();
-      return;
-    }
-
-    // FIXME(nsm): Spec doesn't say what to do if referrer is client.
-    aReferrer.AsAString() = NS_ConvertUTF8toUTF16(mRequest->mReferrerURL);
+    mRequest->GetReferrer(aReferrer);
   }
 
   InternalHeaders*
   GetInternalHeaders() const
   {
     return mRequest->Headers();
   }
 
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -66,16 +66,18 @@
 #include "nsURIHashKey.h"
 #include "nsJSUtils.h"
 #include "MediaStreamGraph.h"
 #include "nsIScriptError.h"
 #include "nsHostObjectProtocolHandler.h"
 #include "mozilla/dom/MediaSource.h"
 #include "MediaMetadataManager.h"
 #include "MediaSourceDecoder.h"
+#include "AudioStreamTrack.h"
+#include "VideoStreamTrack.h"
 
 #include "AudioChannelService.h"
 
 #include "mozilla/dom/power/PowerManagerService.h"
 #include "mozilla/dom/WakeLock.h"
 
 #include "mozilla/dom/AudioTrack.h"
 #include "mozilla/dom/AudioTrackList.h"
@@ -666,17 +668,20 @@ void HTMLMediaElement::AbortExistingLoad
   mLoadedDataFired = false;
   mAutoplaying = true;
   mIsLoadingFromSourceChildren = false;
   mSuspendedAfterFirstFrame = false;
   mAllowSuspendAfterFirstFrame = true;
   mHaveQueuedSelectResource = false;
   mSuspendedForPreloadNone = false;
   mDownloadSuspendedByCache = false;
+  mHasAudio = false;
+  mHasVideo = false;
   mSourcePointer = nullptr;
+  mLastNextFrameStatus = NEXT_FRAME_UNINITIALIZED;
 
   mTags = nullptr;
 
   if (mNetworkState != nsIDOMHTMLMediaElement::NETWORK_EMPTY) {
     NS_ASSERTION(!mDecoder && !mSrcStream, "How did someone setup a new stream/decoder already?");
     ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_EMPTY);
     ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_NOTHING);
     mPaused = true;
@@ -897,16 +902,40 @@ void HTMLMediaElement::NotifyMediaTrackE
     } else {
       SetMutedInternal(mMuted & ~MUTED_BY_AUDIO_TRACK);
     }
   } else if (VideoTrack* track = aTrack->AsVideoTrack()) {
     mDisableVideo = !track->Selected();
   }
 }
 
+void HTMLMediaElement::NotifyMediaStreamTracksAvailable(DOMMediaStream* aStream)
+{
+  if (!mSrcStream || mSrcStream != aStream) {
+    return;
+  }
+
+  bool oldHasVideo = mHasVideo;
+
+  nsAutoTArray<nsRefPtr<AudioStreamTrack>,1> audioTracks;
+  mSrcStream->GetAudioTracks(audioTracks);
+  nsAutoTArray<nsRefPtr<VideoStreamTrack>,1> videoTracks;
+  mSrcStream->GetVideoTracks(videoTracks);
+
+  mHasAudio = !audioTracks.IsEmpty();
+  mHasVideo = !videoTracks.IsEmpty();
+
+  if (IsVideo() && oldHasVideo != mHasVideo) {
+    // We are a video element and mHasVideo changed so update the screen wakelock
+    NotifyOwnerDocumentActivityChanged();
+  }
+
+  UpdateReadyStateForData(mLastNextFrameStatus);
+}
+
 void HTMLMediaElement::LoadFromSourceChildren()
 {
   NS_ASSERTION(mDelayingLoadEvent,
                "Should delay load event (if in document) during load");
   NS_ASSERTION(mIsLoadingFromSourceChildren,
                "Must remember we're loading from source children");
 
   nsIDocument* parentDoc = OwnerDoc()->GetParentDocument();
@@ -1982,16 +2011,17 @@ HTMLMediaElement::LookupMediaElementURIT
 }
 
 HTMLMediaElement::HTMLMediaElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
   : nsGenericHTMLElement(aNodeInfo),
     mSrcStreamListener(nullptr),
     mCurrentLoadID(0),
     mNetworkState(nsIDOMHTMLMediaElement::NETWORK_EMPTY),
     mReadyState(nsIDOMHTMLMediaElement::HAVE_NOTHING),
+    mLastNextFrameStatus(NEXT_FRAME_UNINITIALIZED),
     mLoadWaitStatus(NOT_WAITING),
     mVolume(1.0),
     mPreloadAction(PRELOAD_UNDEFINED),
     mMediaSize(-1,-1),
     mLastCurrentTime(0.0),
     mFragmentStart(-1.0),
     mFragmentEnd(-1.0),
     mDefaultPlaybackRate(1.0),
@@ -2818,16 +2848,35 @@ private:
   bool mHaveCurrentData;
   bool mBlocked;
 
   // mMutex protects the fields below; they can be accessed on any thread
   Mutex mMutex;
   bool mPendingNotifyOutput;
 };
 
+class HTMLMediaElement::MediaStreamTracksAvailableCallback:
+    public DOMMediaStream::OnTracksAvailableCallback
+{
+public:
+  explicit MediaStreamTracksAvailableCallback(HTMLMediaElement* aElement,
+                                              DOMMediaStream::TrackTypeHints aExpectedTracks = 0):
+      DOMMediaStream::OnTracksAvailableCallback(aExpectedTracks),
+      mElement(aElement)
+    {}
+  virtual void NotifyTracksAvailable(DOMMediaStream* aStream)
+  {
+    NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
+
+    mElement->NotifyMediaStreamTracksAvailable(aStream);
+  }
+private:
+  HTMLMediaElement* mElement;
+};
+
 void HTMLMediaElement::SetupSrcMediaStreamPlayback(DOMMediaStream* aStream)
 {
   NS_ASSERTION(!mSrcStream && !mSrcStreamListener, "Should have been ended already");
 
   mSrcStream = aStream;
 
   nsRefPtr<MediaStream> stream = mSrcStream->GetStream();
   if (stream) {
@@ -2839,32 +2888,36 @@ void HTMLMediaElement::SetupSrcMediaStre
   mSrcStreamListener = new StreamListener(this);
   GetSrcMediaStream()->AddListener(mSrcStreamListener);
   if (mPaused) {
     GetSrcMediaStream()->ChangeExplicitBlockerCount(1);
   }
   if (mPausedForInactiveDocumentOrChannel) {
     GetSrcMediaStream()->ChangeExplicitBlockerCount(1);
   }
+
+  mSrcStream->OnTracksAvailable(new MediaStreamTracksAvailableCallback(this, DOMMediaStream::HINT_CONTENTS_AUDIO));
+  mSrcStream->OnTracksAvailable(new MediaStreamTracksAvailableCallback(this, DOMMediaStream::HINT_CONTENTS_VIDEO));
+
+  ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_IDLE);
+
   ChangeDelayLoadStatus(false);
   GetSrcMediaStream()->AddAudioOutput(this);
-  GetSrcMediaStream()->SetAudioOutputVolume(this, float(mMuted ? 0.0 : mVolume));
+  SetVolumeInternal();
   VideoFrameContainer* container = GetVideoFrameContainer();
   if (container) {
     GetSrcMediaStream()->AddVideoOutput(container);
   }
 
+  CheckAutoplayDataReady();
+
   // Note: we must call DisconnectTrackListListeners(...)  before dropping
   // mSrcStream
   mSrcStream->ConstructMediaTracks(AudioTracks(), VideoTracks());
 
-  ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_METADATA);
-  DispatchAsyncEvent(NS_LITERAL_STRING("durationchange"));
-  DispatchAsyncEvent(NS_LITERAL_STRING("loadedmetadata"));
-  ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_IDLE);
   // FirstFrameLoaded() will be called when the stream has current data.
 }
 
 void HTMLMediaElement::EndSrcMediaStreamPlayback()
 {
   MediaStream* stream = GetSrcMediaStream();
   if (stream) {
     stream->RemoveListener(mSrcStreamListener);
@@ -2934,16 +2987,21 @@ void HTMLMediaElement::MetadataLoaded(co
   // delete the VideoFrameContainer. This happens when the src is changed to an
   // audio only file.
   // Else update its dimensions.
   if (!aInfo->HasVideo()) {
     ResetState();
   } else {
     UpdateMediaSize(aInfo->mVideo.mDisplay);
   }
+
+  if (IsVideo() && aInfo->HasVideo()) {
+    // We are a video element playing video so update the screen wakelock
+    NotifyOwnerDocumentActivityChanged();
+  }
 }
 
 void HTMLMediaElement::FirstFrameLoaded()
 {
   NS_ASSERTION(!mSuspendedAfterFirstFrame, "Should not have already suspended");
 
   ChangeDelayLoadStatus(false);
 
@@ -3198,28 +3256,57 @@ void HTMLMediaElement::DownloadProgresse
 
 bool HTMLMediaElement::ShouldCheckAllowOrigin()
 {
   return mCORSMode != CORS_NONE;
 }
 
 void HTMLMediaElement::UpdateReadyStateForData(MediaDecoderOwner::NextFrameStatus aNextFrame)
 {
-  if (mReadyState < nsIDOMHTMLMediaElement::HAVE_METADATA) {
+  mLastNextFrameStatus = aNextFrame;
+
+  if (mDecoder && mReadyState < nsIDOMHTMLMediaElement::HAVE_METADATA) {
     // aNextFrame might have a next frame because the decoder can advance
     // on its own thread before MetadataLoaded gets a chance to run.
     // The arrival of more data can't change us out of this readyState.
     return;
   }
 
+  if (mSrcStream && mReadyState < nsIDOMHTMLMediaElement::HAVE_METADATA) {
+    if ((!mHasAudio && !mHasVideo) ||
+        (IsVideo() && mHasVideo && mMediaSize == nsIntSize(-1, -1))) {
+      return;
+    }
+
+    // We are playing a stream that has video and a video frame is now set.
+    // This means we have all metadata needed to change ready state.
+    MediaInfo mediaInfo;
+    mediaInfo.mAudio.mHasAudio = mHasAudio;
+    mediaInfo.mVideo.mHasVideo = mHasVideo;
+    if (mHasVideo) {
+      mediaInfo.mVideo.mDisplay = mMediaSize;
+    }
+    MetadataLoaded(&mediaInfo, nsAutoPtr<const MetadataTags>(nullptr));
+  }
+
   if (aNextFrame == MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING) {
     ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_METADATA);
     return;
   }
 
+  if (IsVideo() && mHasVideo && !IsPlaybackEnded() &&
+        GetImageContainer() && !GetImageContainer()->HasCurrentImage()) {
+    // Don't advance if we are playing video, but don't have a video frame.
+    // Also, if video became available after advancing to HAVE_CURRENT_DATA
+    // while we are still playing, we need to revert to HAVE_METADATA until
+    // a video frame is available.
+    ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_METADATA);
+    return;
+  }
+
   if (mDownloadSuspendedByCache && mDecoder && !mDecoder->IsEnded()) {
     // The decoder has signaled that the download has been suspended by the
     // media cache. So move readyState into HAVE_ENOUGH_DATA, in case there's
     // script waiting for a "canplaythrough" event; without this forced
     // transition, we will never fire the "canplaythrough" event if the
     // media cache is too small, and scripts are bound to fail. Don't force
     // this transition if the decoder is in ended state; the readyState
     // should remain at HAVE_CURRENT_DATA in this case.
@@ -3360,24 +3447,24 @@ void HTMLMediaElement::ChangeNetworkStat
   }
 
   // Changing mNetworkState affects AddRemoveSelfReference().
   AddRemoveSelfReference();
 }
 
 bool HTMLMediaElement::CanActivateAutoplay()
 {
-  // For stream inputs, we activate autoplay on HAVE_CURRENT_DATA because
+  // For stream inputs, we activate autoplay on HAVE_NOTHING because
   // this element itself might be blocking the stream from making progress by
   // being paused.
   return !mPausedForInactiveDocumentOrChannel &&
          mAutoplaying &&
          mPaused &&
          ((mDecoder && mReadyState >= nsIDOMHTMLMediaElement::HAVE_ENOUGH_DATA) ||
-          (mSrcStream && mReadyState >= nsIDOMHTMLMediaElement::HAVE_CURRENT_DATA)) &&
+          mSrcStream) &&
          HasAttr(kNameSpaceID_None, nsGkAtoms::autoplay) &&
          mAutoplayEnabled &&
          !IsEditable();
 }
 
 void HTMLMediaElement::CheckAutoplayDataReady()
 {
   if (CanActivateAutoplay()) {
@@ -3396,34 +3483,24 @@ void HTMLMediaElement::CheckAutoplayData
       GetSrcMediaStream()->ChangeExplicitBlockerCount(-1);
     }
     DispatchAsyncEvent(NS_LITERAL_STRING("play"));
   }
 }
 
 VideoFrameContainer* HTMLMediaElement::GetVideoFrameContainer()
 {
-  // If we have loaded the metadata, and the size of the video is still
-  // (-1, -1), the media has no video. Don't go a create a video frame
-  // container.
-  if (mReadyState >= nsIDOMHTMLMediaElement::HAVE_METADATA &&
-      mMediaSize == nsIntSize(-1, -1)) {
-    return nullptr;
-  }
+  if (mVideoFrameContainer)
+    return mVideoFrameContainer;
 
   // Only video frames need an image container.
   if (!IsVideo()) {
     return nullptr;
   }
 
-  mHasVideo = true;
-
-  if (mVideoFrameContainer)
-    return mVideoFrameContainer;
-
   mVideoFrameContainer =
     new VideoFrameContainer(this, LayerManager::CreateAsynchronousImageContainer());
 
   return mVideoFrameContainer;
 }
 
 nsresult HTMLMediaElement::DispatchEvent(const nsAString& aName)
 {
@@ -3528,16 +3605,17 @@ void HTMLMediaElement::NotifyDecoderPrin
     mMediaKeys->Shutdown();
   }
 #endif
 }
 
 void HTMLMediaElement::UpdateMediaSize(nsIntSize size)
 {
   mMediaSize = size;
+  UpdateReadyStateForData(mLastNextFrameStatus);
 }
 
 void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendEvents)
 {
   if (aPauseElement != mPausedForInactiveDocumentOrChannel) {
     mPausedForInactiveDocumentOrChannel = aPauseElement;
     if (aPauseElement) {
 #ifdef MOZ_EME
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -276,16 +276,21 @@ public:
   /**
    * Called when there's been an error fetching the resource. This decides
    * whether it's appropriate to fire an error event.
    */
   void NotifyLoadError();
 
   void NotifyMediaTrackEnabled(MediaTrack* aTrack);
 
+  /**
+   * Called when tracks become available to the source media stream.
+   */
+  void NotifyMediaStreamTracksAvailable(DOMMediaStream* aStream);
+
   virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
 
   /**
    * Returns the current load ID. Asynchronous events store the ID that was
    * current when they were enqueued, and if it has changed when they come to
    * fire, they consider themselves cancelled, and don't fire.
    */
   uint32_t GetCurrentLoadID() { return mCurrentLoadID; }
@@ -607,16 +612,17 @@ public:
   nsresult FinishDecoderSetup(MediaDecoder* aDecoder, MediaResource* aStream) {
     return FinishDecoderSetup(aDecoder, aStream, nullptr, nullptr);
   }
 
 protected:
   virtual ~HTMLMediaElement();
 
   class MediaLoadListener;
+  class MediaStreamTracksAvailableCallback;
   class StreamListener;
 
   virtual void GetItemValueText(nsAString& text) MOZ_OVERRIDE;
   virtual void SetItemValueText(const nsAString& text) MOZ_OVERRIDE;
 
   class WakeLockBoolWrapper {
   public:
     explicit WakeLockBoolWrapper(bool val = false)
@@ -1031,16 +1037,19 @@ protected:
   // These events get re-dispatched when the bfcache is exited.
   nsTArray<nsString> mPendingEvents;
 
   // Media loading flags. See:
   //   http://www.whatwg.org/specs/web-apps/current-work/#video)
   nsMediaNetworkState mNetworkState;
   nsMediaReadyState mReadyState;
 
+  // Last value passed from codec or stream source to UpdateReadyStateForData.
+  NextFrameStatus mLastNextFrameStatus;
+
   enum LoadAlgorithmState {
     // No load algorithm instance is waiting for a source to be added to the
     // media in order to continue loading.
     NOT_WAITING,
     // We've run the load algorithm, and we tried all source children of the
     // media element, and failed to load any successfully. We're waiting for
     // another source element to be added to the media element, and will try
     // to load any such element when its added.
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -3031,17 +3031,17 @@ private:
   AllocPBackgroundIDBTransactionParent(
                                     const nsTArray<nsString>& aObjectStoreNames,
                                     const Mode& aMode)
                                     MOZ_OVERRIDE;
 
   virtual bool
   RecvPBackgroundIDBTransactionConstructor(
                                     PBackgroundIDBTransactionParent* aActor,
-                                    const nsTArray<nsString>& aObjectStoreNames,
+                                    InfallibleTArray<nsString>&& aObjectStoreNames,
                                     const Mode& aMode)
                                     MOZ_OVERRIDE;
 
   virtual bool
   DeallocPBackgroundIDBTransactionParent(
                                         PBackgroundIDBTransactionParent* aActor)
                                         MOZ_OVERRIDE;
 
@@ -6521,17 +6521,17 @@ Database::AllocPBackgroundIDBTransaction
   MOZ_ASSERT(infallibleObjectStores.IsEmpty());
 
   return transaction.forget().take();
 }
 
 bool
 Database::RecvPBackgroundIDBTransactionConstructor(
                                     PBackgroundIDBTransactionParent* aActor,
-                                    const nsTArray<nsString>& aObjectStoreNames,
+                                    InfallibleTArray<nsString>&& aObjectStoreNames,
                                     const Mode& aMode)
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(aActor);
   MOZ_ASSERT(!aObjectStoreNames.IsEmpty());
   MOZ_ASSERT(aMode == IDBTransaction::READ_ONLY ||
              aMode == IDBTransaction::READ_WRITE);
   MOZ_ASSERT(!mClosed);
--- a/dom/ipc/ContentBridgeChild.cpp
+++ b/dom/ipc/ContentBridgeChild.cpp
@@ -61,20 +61,20 @@ ContentBridgeChild::DeferredDestroy()
 {
   mSelfRef = nullptr;
   // |this| was just destroyed, hands off
 }
 
 bool
 ContentBridgeChild::RecvAsyncMessage(const nsString& aMsg,
                                      const ClonedMessageData& aData,
-                                     const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                     InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                      const IPC::Principal& aPrincipal)
 {
-  return nsIContentChild::RecvAsyncMessage(aMsg, aData, aCpows, aPrincipal);
+  return nsIContentChild::RecvAsyncMessage(aMsg, aData, Move(aCpows), aPrincipal);
 }
 
 PBlobChild*
 ContentBridgeChild::SendPBlobConstructor(PBlobChild* actor,
                                          const BlobConstructorParams& params)
 {
   return PContentBridgeChild::SendPBlobConstructor(actor, params);
 }
--- a/dom/ipc/ContentBridgeChild.h
+++ b/dom/ipc/ContentBridgeChild.h
@@ -24,17 +24,17 @@ public:
   static ContentBridgeChild*
   Create(Transport* aTransport, ProcessId aOtherProcess);
 
   virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
   void DeferredDestroy();
 
   virtual bool RecvAsyncMessage(const nsString& aMsg,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
 
   virtual PBlobChild*
   SendPBlobConstructor(PBlobChild* actor,
                        const BlobConstructorParams& aParams) MOZ_OVERRIDE;
 
   jsipc::JavaScriptShared* GetCPOWManager() MOZ_OVERRIDE;
 
--- a/dom/ipc/ContentBridgeParent.cpp
+++ b/dom/ipc/ContentBridgeParent.cpp
@@ -57,30 +57,32 @@ ContentBridgeParent::DeferredDestroy()
 {
   mSelfRef = nullptr;
   // |this| was just destroyed, hands off
 }
 
 bool
 ContentBridgeParent::RecvSyncMessage(const nsString& aMsg,
                                      const ClonedMessageData& aData,
-                                     const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                     InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                      const IPC::Principal& aPrincipal,
                                      InfallibleTArray<nsString>* aRetvals)
 {
-  return nsIContentParent::RecvSyncMessage(aMsg, aData, aCpows, aPrincipal, aRetvals);
+  return nsIContentParent::RecvSyncMessage(aMsg, aData, Move(aCpows),
+                                           aPrincipal, aRetvals);
 }
 
 bool
 ContentBridgeParent::RecvAsyncMessage(const nsString& aMsg,
                                       const ClonedMessageData& aData,
-                                      const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                      InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                       const IPC::Principal& aPrincipal)
 {
-  return nsIContentParent::RecvAsyncMessage(aMsg, aData, aCpows, aPrincipal);
+  return nsIContentParent::RecvAsyncMessage(aMsg, aData, Move(aCpows),
+                                            aPrincipal);
 }
 
 PBlobParent*
 ContentBridgeParent::SendPBlobConstructor(PBlobParent* actor,
                                           const BlobConstructorParams& params)
 {
   return PContentBridgeParent::SendPBlobConstructor(actor, params);
 }
--- a/dom/ipc/ContentBridgeParent.h
+++ b/dom/ipc/ContentBridgeParent.h
@@ -70,22 +70,22 @@ protected:
   void SetIsForBrowser(bool aIsForBrowser)
   {
     mIsForBrowser = aIsForBrowser;
   }
 
 protected:
   virtual bool RecvSyncMessage(const nsString& aMsg,
                                const ClonedMessageData& aData,
-                               const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                               InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                const IPC::Principal& aPrincipal,
                                InfallibleTArray<nsString>* aRetvals) MOZ_OVERRIDE;
   virtual bool RecvAsyncMessage(const nsString& aMsg,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
 
   virtual jsipc::PJavaScriptParent* AllocPJavaScriptParent() MOZ_OVERRIDE;
   virtual bool
   DeallocPJavaScriptParent(jsipc::PJavaScriptParent*) MOZ_OVERRIDE;
 
   virtual PBrowserParent*
   AllocPBrowserParent(const TabId& aTabId,
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1707,19 +1707,19 @@ ContentChild::DeallocPSpeechSynthesisChi
     delete aActor;
     return true;
 #else
     return false;
 #endif
 }
 
 bool
-ContentChild::RecvRegisterChrome(const InfallibleTArray<ChromePackage>& packages,
-                                 const InfallibleTArray<ResourceMapping>& resources,
-                                 const InfallibleTArray<OverrideMapping>& overrides,
+ContentChild::RecvRegisterChrome(InfallibleTArray<ChromePackage>&& packages,
+                                 InfallibleTArray<ResourceMapping>&& resources,
+                                 InfallibleTArray<OverrideMapping>&& overrides,
                                  const nsCString& locale,
                                  const bool& reset)
 {
     nsCOMPtr<nsIChromeRegistry> registrySvc = nsChromeRegistry::GetService();
     nsChromeRegistryContent* chromeRegistry =
         static_cast<nsChromeRegistryContent*>(registrySvc.get());
     chromeRegistry->RegisterRemoteChrome(packages, resources, overrides,
                                          locale, reset);
@@ -1892,17 +1892,17 @@ ContentChild::RecvNotifyVisited(const UR
         history->NotifyVisited(newURI);
     }
     return true;
 }
 
 bool
 ContentChild::RecvAsyncMessage(const nsString& aMsg,
                                const ClonedMessageData& aData,
-                               const InfallibleTArray<CpowEntry>& aCpows,
+                               InfallibleTArray<CpowEntry>&& aCpows,
                                const IPC::Principal& aPrincipal)
 {
     nsRefPtr<nsFrameMessageManager> cpm = nsFrameMessageManager::sChildProcessManager;
     if (cpm) {
         StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForChild(aData);
         CpowIdHolder cpows(this, aCpows);
         cpm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(cpm.get()),
                             aMsg, false, &cloneData, &cpows, aPrincipal, nullptr);
@@ -1929,17 +1929,17 @@ ContentChild::RecvGeolocationError(const
     if (!gs) {
         return true;
     }
     gs->NotifyError(errorCode);
     return true;
 }
 
 bool
-ContentChild::RecvUpdateDictionaryList(const InfallibleTArray<nsString>& aDictionaries)
+ContentChild::RecvUpdateDictionaryList(InfallibleTArray<nsString>&& aDictionaries)
 {
     mAvailableDictionaries = aDictionaries;
     mozInlineSpellChecker::UpdateCanEnableInlineSpellChecking();
     return true;
 }
 
 bool
 ContentChild::RecvAddPermission(const IPC::Permission& permission)
@@ -2430,18 +2430,18 @@ ContentChild::RecvOnAppThemeChanged()
         os->NotifyObservers(nullptr, "app-theme-changed", nullptr);
     }
     return true;
 }
 
 bool
 ContentChild::RecvStartProfiler(const uint32_t& aEntries,
                                 const double& aInterval,
-                                const nsTArray<nsCString>& aFeatures,
-                                const nsTArray<nsCString>& aThreadNameFilters)
+                                nsTArray<nsCString>&& aFeatures,
+                                nsTArray<nsCString>&& aThreadNameFilters)
 {
     nsTArray<const char*> featureArray;
     for (size_t i = 0; i < aFeatures.Length(); ++i) {
         featureArray.AppendElement(aFeatures[i].get());
     }
 
     nsTArray<const char*> threadNameFilterArray;
     for (size_t i = 0; i < aThreadNameFilters.Length(); ++i) {
@@ -2472,17 +2472,19 @@ ContentChild::RecvGetProfile(nsCString* 
         *aProfile = EmptyCString();
     }
     return true;
 }
 
 bool
 ContentChild::RecvLoadPluginResult(const uint32_t& aPluginId, const bool& aResult)
 {
-    plugins::PluginModuleContentParent::OnLoadPluginResult(aPluginId, aResult);
+    bool finalResult = aResult && SendConnectPluginBridge(aPluginId);
+    plugins::PluginModuleContentParent::OnLoadPluginResult(aPluginId,
+                                                           finalResult);
     return true;
 }
 
 bool
 ContentChild::RecvAssociatePluginId(const uint32_t& aPluginId,
                                     const base::ProcessId& aProcessId)
 {
     plugins::PluginModuleContentParent::AssociatePluginId(aPluginId, aProcessId);
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -267,19 +267,19 @@ public:
                                  const asmjscache::WriteParams& aWriteParams,
                                  const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
     virtual bool DeallocPAsmJSCacheEntryChild(
                                     PAsmJSCacheEntryChild* aActor) MOZ_OVERRIDE;
 
     virtual PSpeechSynthesisChild* AllocPSpeechSynthesisChild() MOZ_OVERRIDE;
     virtual bool DeallocPSpeechSynthesisChild(PSpeechSynthesisChild* aActor) MOZ_OVERRIDE;
 
-    virtual bool RecvRegisterChrome(const InfallibleTArray<ChromePackage>& packages,
-                                    const InfallibleTArray<ResourceMapping>& resources,
-                                    const InfallibleTArray<OverrideMapping>& overrides,
+    virtual bool RecvRegisterChrome(InfallibleTArray<ChromePackage>&& packages,
+                                    InfallibleTArray<ResourceMapping>&& resources,
+                                    InfallibleTArray<OverrideMapping>&& overrides,
                                     const nsCString& locale,
                                     const bool& reset) MOZ_OVERRIDE;
     virtual bool RecvRegisterChromeItem(const ChromeRegistryItem& item) MOZ_OVERRIDE;
 
     virtual mozilla::jsipc::PJavaScriptChild* AllocPJavaScriptChild() MOZ_OVERRIDE;
     virtual bool DeallocPJavaScriptChild(mozilla::jsipc::PJavaScriptChild*) MOZ_OVERRIDE;
     virtual PRemoteSpellcheckEngineChild* AllocPRemoteSpellcheckEngineChild() MOZ_OVERRIDE;
     virtual bool DeallocPRemoteSpellcheckEngineChild(PRemoteSpellcheckEngineChild*) MOZ_OVERRIDE;
@@ -297,24 +297,24 @@ public:
 
     virtual bool RecvPreferenceUpdate(const PrefSetting& aPref) MOZ_OVERRIDE;
 
     virtual bool RecvNotifyAlertsObserver(const nsCString& aType,
                                           const nsString& aData) MOZ_OVERRIDE;
 
     virtual bool RecvAsyncMessage(const nsString& aMsg,
                                   const ClonedMessageData& aData,
-                                  const InfallibleTArray<CpowEntry>& aCpows,
+                                  InfallibleTArray<CpowEntry>&& aCpows,
                                   const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
 
     virtual bool RecvGeolocationUpdate(const GeoPosition& somewhere) MOZ_OVERRIDE;
 
     virtual bool RecvGeolocationError(const uint16_t& errorCode) MOZ_OVERRIDE;
 
-    virtual bool RecvUpdateDictionaryList(const InfallibleTArray<nsString>& aDictionaries) MOZ_OVERRIDE;
+    virtual bool RecvUpdateDictionaryList(InfallibleTArray<nsString>&& aDictionaries) MOZ_OVERRIDE;
 
     virtual bool RecvAddPermission(const IPC::Permission& permission) MOZ_OVERRIDE;
 
     virtual bool RecvScreenSizeChanged(const gfxIntSize &size) MOZ_OVERRIDE;
 
     virtual bool RecvFlushMemory(const nsString& reason) MOZ_OVERRIDE;
 
     virtual bool RecvActivateA11y() MOZ_OVERRIDE;
@@ -368,18 +368,18 @@ public:
 
     virtual bool RecvAssociatePluginId(const uint32_t& aPluginId,
                                        const base::ProcessId& aProcessId) MOZ_OVERRIDE;
     virtual bool RecvLoadPluginResult(const uint32_t& aPluginId,
                                       const bool& aResult) MOZ_OVERRIDE;
 
     virtual bool RecvStartProfiler(const uint32_t& aEntries,
                                    const double& aInterval,
-                                   const nsTArray<nsCString>& aFeatures,
-                                   const nsTArray<nsCString>& aThreadNameFilters) MOZ_OVERRIDE;
+                                   nsTArray<nsCString>&& aFeatures,
+                                   nsTArray<nsCString>&& aThreadNameFilters) MOZ_OVERRIDE;
     virtual bool RecvStopProfiler() MOZ_OVERRIDE;
     virtual bool RecvGetProfile(nsCString* aProfile) MOZ_OVERRIDE;
     virtual bool RecvShutdown() MOZ_OVERRIDE;
 
 #ifdef ANDROID
     gfxIntSize GetScreenSize() { return mScreenSize; }
 #endif
 
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -381,17 +381,18 @@ bool ContentParent::sNuwaReady = false;
 class MemoryReportRequestParent : public PMemoryReportRequestParent
 {
 public:
     MemoryReportRequestParent();
     virtual ~MemoryReportRequestParent();
 
     virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
 
-    virtual bool Recv__delete__(const uint32_t& aGeneration, const InfallibleTArray<MemoryReport>& aReport) MOZ_OVERRIDE;
+    virtual bool Recv__delete__(const uint32_t& aGeneration, InfallibleTArray<MemoryReport>&& aReport) MOZ_OVERRIDE;
+
 private:
     ContentParent* Owner()
     {
         return static_cast<ContentParent*>(Manager());
     }
 };
 
 MemoryReportRequestParent::MemoryReportRequestParent()
@@ -401,17 +402,18 @@ MemoryReportRequestParent::MemoryReportR
 
 void
 MemoryReportRequestParent::ActorDestroy(ActorDestroyReason aWhy)
 {
   // Implement me! Bug 1005154
 }
 
 bool
-MemoryReportRequestParent::Recv__delete__(const uint32_t& generation, const InfallibleTArray<MemoryReport>& childReports)
+MemoryReportRequestParent::Recv__delete__(const uint32_t& generation,
+                                          nsTArray<MemoryReport>&& childReports)
 {
     nsRefPtr<nsMemoryReporterManager> mgr =
         nsMemoryReporterManager::GetOrCreate();
     if (mgr) {
         mgr->HandleChildReports(generation, childReports);
     }
     return true;
 }
@@ -973,32 +975,43 @@ static nsIDocShell* GetOpenerDocShellHel
 
 bool
 ContentParent::RecvLoadPlugin(const uint32_t& aPluginId)
 {
     return mozilla::plugins::SetupBridge(aPluginId, this);
 }
 
 bool
+ContentParent::RecvConnectPluginBridge(const uint32_t& aPluginId)
+{
+    return mozilla::plugins::SetupBridge(aPluginId, this, true);
+}
+
+bool
 ContentParent::RecvFindPlugins(const uint32_t& aPluginEpoch,
                                nsTArray<PluginTag>* aPlugins,
                                uint32_t* aNewPluginEpoch)
 {
     return mozilla::plugins::FindPluginsForContent(aPluginEpoch, aPlugins, aNewPluginEpoch);
 }
 
 /*static*/ TabParent*
 ContentParent::CreateBrowserOrApp(const TabContext& aContext,
                                   Element* aFrameElement,
                                   ContentParent* aOpenerContentParent)
 {
     if (!sCanLaunchSubprocesses) {
         return nullptr;
     }
 
+    if (TabParent* parent = TabParent::GetNextTabParent()) {
+        parent->SetOwnerElement(aFrameElement);
+        return parent;
+    }
+
     ProcessPriority initialPriority = GetInitialProcessPriority(aFrameElement);
     bool isInContentProcess = (XRE_GetProcessType() != GeckoProcessType_Default);
     TabId tabId;
 
     nsIDocShell* docShell = GetOpenerDocShellHelper(aFrameElement);
     TabId openerTabId;
     if (docShell) {
         openerTabId = TabParent::GetTabIdFrom(docShell);
@@ -2120,17 +2133,17 @@ FindFdProtocolFdMapping(const nsTArray<P
 /**
  * This constructor is used for new content process cloned from a template.
  *
  * For Nuwa.
  */
 ContentParent::ContentParent(ContentParent* aTemplate,
                              const nsAString& aAppManifestURL,
                              base::ProcessHandle aPid,
-                             const nsTArray<ProtocolFdMapping>& aFds)
+                             InfallibleTArray<ProtocolFdMapping>&& aFds)
     : mAppManifestURL(aAppManifestURL)
     , mIsForBrowser(false)
     , mIsNuwaProcess(false)
 {
     InitializeMembers();  // Perform common initialization.
 
     sContentParents->insertBack(this);
 
@@ -2694,33 +2707,33 @@ ContentParent::RecvNuwaWaitForFreeze()
 #else // MOZ_NUWA_PROCESS
     NS_ERROR("ContentParent::RecvNuwaWaitForFreeze() not implemented!");
     return false;
 #endif // MOZ_NUWA_PROCESS
 }
 
 bool
 ContentParent::RecvAddNewProcess(const uint32_t& aPid,
-                                 const InfallibleTArray<ProtocolFdMapping>& aFds)
+                                 InfallibleTArray<ProtocolFdMapping>&& aFds)
 {
 #ifdef MOZ_NUWA_PROCESS
     if (!IsNuwaProcess()) {
         NS_ERROR(
             nsPrintfCString(
                 "Terminating child process %d for unauthorized IPC message: "
                 "AddNewProcess(%d)", Pid(), aPid).get());
 
         KillHard();
         return false;
     }
     nsRefPtr<ContentParent> content;
     content = new ContentParent(this,
                                 MAGIC_PREALLOCATED_APP_MANIFEST_URL,
                                 aPid,
-                                aFds);
+                                Move(aFds));
     content->Init();
 
     size_t numNuwaPrefUpdates = sNuwaPrefUpdates ?
                                 sNuwaPrefUpdates->Length() : 0;
     // Resend pref updates to the forked child.
     for (size_t i = 0; i < numNuwaPrefUpdates; i++) {
         mozilla::unused << content->SendPreferenceUpdate(sNuwaPrefUpdates->ElementAt(i));
     }
@@ -3874,42 +3887,43 @@ ContentParent::RecvCloseAlert(const nsSt
     }
 
     return true;
 }
 
 bool
 ContentParent::RecvSyncMessage(const nsString& aMsg,
                                const ClonedMessageData& aData,
-                               const InfallibleTArray<CpowEntry>& aCpows,
+                               InfallibleTArray<CpowEntry>&& aCpows,
                                const IPC::Principal& aPrincipal,
                                InfallibleTArray<nsString>* aRetvals)
 {
-    return nsIContentParent::RecvSyncMessage(aMsg, aData, aCpows, aPrincipal,
-                                             aRetvals);
+    return nsIContentParent::RecvSyncMessage(aMsg, aData, Move(aCpows),
+                                             aPrincipal, aRetvals);
 }
 
 bool
 ContentParent::RecvRpcMessage(const nsString& aMsg,
                               const ClonedMessageData& aData,
-                              const InfallibleTArray<CpowEntry>& aCpows,
+                              InfallibleTArray<CpowEntry>&& aCpows,
                               const IPC::Principal& aPrincipal,
                               InfallibleTArray<nsString>* aRetvals)
 {
-    return nsIContentParent::RecvRpcMessage(aMsg, aData, aCpows, aPrincipal,
+    return nsIContentParent::RecvRpcMessage(aMsg, aData, Move(aCpows), aPrincipal,
                                             aRetvals);
 }
 
 bool
 ContentParent::RecvAsyncMessage(const nsString& aMsg,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<CpowEntry>& aCpows,
+                                InfallibleTArray<CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal)
 {
-    return nsIContentParent::RecvAsyncMessage(aMsg, aData, aCpows, aPrincipal);
+    return nsIContentParent::RecvAsyncMessage(aMsg, aData, Move(aCpows),
+                                              aPrincipal);
 }
 
 bool
 ContentParent::RecvFilePathUpdateNotify(const nsString& aType,
                                         const nsString& aStorageName,
                                         const nsString& aFilePath,
                                         const nsCString& aReason)
 {
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -149,16 +149,17 @@ public:
                                         const TabId& aOpenerTabId,
                                         ContentParentId* aCpId,
                                         bool* aIsForApp,
                                         bool* aIsForBrowser,
                                         TabId* aTabId) MOZ_OVERRIDE;
     virtual bool RecvBridgeToChildProcess(const ContentParentId& aCpId) MOZ_OVERRIDE;
 
     virtual bool RecvLoadPlugin(const uint32_t& aPluginId) MOZ_OVERRIDE;
+    virtual bool RecvConnectPluginBridge(const uint32_t& aPluginId) MOZ_OVERRIDE;
     virtual bool RecvFindPlugins(const uint32_t& aPluginEpoch,
                                  nsTArray<PluginTag>* aPlugins,
                                  uint32_t* aNewPluginEpoch) MOZ_OVERRIDE;
 
     NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(ContentParent, nsIObserver)
 
     NS_DECL_CYCLE_COLLECTING_ISUPPORTS
     NS_DECL_NSIOBSERVER
@@ -389,17 +390,17 @@ private:
                   bool aIsForPreallocated,
                   hal::ProcessPriority aInitialPriority = hal::PROCESS_PRIORITY_FOREGROUND,
                   bool aIsNuwaProcess = false);
 
 #ifdef MOZ_NUWA_PROCESS
     ContentParent(ContentParent* aTemplate,
                   const nsAString& aAppManifestURL,
                   base::ProcessHandle aPid,
-                  const nsTArray<ProtocolFdMapping>& aFds);
+                  InfallibleTArray<ProtocolFdMapping>&& aFds);
 #endif
 
     // The common initialization for the constructors.
     void InitializeMembers();
 
     // The common initialization logic shared by all constuctors.
     void InitInternal(ProcessPriority aPriority,
                       bool aSetupOffMainThreadCompositing,
@@ -633,27 +634,27 @@ private:
 
     virtual bool RecvCloseAlert(const nsString& aName,
                                 const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
 
     virtual bool RecvLoadURIExternal(const URIParams& uri) MOZ_OVERRIDE;
 
     virtual bool RecvSyncMessage(const nsString& aMsg,
                                  const ClonedMessageData& aData,
-                                 const InfallibleTArray<CpowEntry>& aCpows,
+                                 InfallibleTArray<CpowEntry>&& aCpows,
                                  const IPC::Principal& aPrincipal,
                                  InfallibleTArray<nsString>* aRetvals) MOZ_OVERRIDE;
     virtual bool RecvRpcMessage(const nsString& aMsg,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<CpowEntry>& aCpows,
+                                InfallibleTArray<CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal,
                                 InfallibleTArray<nsString>* aRetvals) MOZ_OVERRIDE;
     virtual bool RecvAsyncMessage(const nsString& aMsg,
                                   const ClonedMessageData& aData,
-                                  const InfallibleTArray<CpowEntry>& aCpows,
+                                  InfallibleTArray<CpowEntry>&& aCpows,
                                   const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
 
     virtual bool RecvFilePathUpdateNotify(const nsString& aType,
                                           const nsString& aStorageName,
                                           const nsString& aFilePath,
                                           const nsCString& aReason) MOZ_OVERRIDE;
 
     virtual bool RecvAddGeolocationListener(const IPC::Principal& aPrincipal,
@@ -704,17 +705,17 @@ private:
 
     virtual bool RecvSystemMessageHandled() MOZ_OVERRIDE;
 
     virtual bool RecvNuwaReady() MOZ_OVERRIDE;
 
     virtual bool RecvNuwaWaitForFreeze() MOZ_OVERRIDE;
 
     virtual bool RecvAddNewProcess(const uint32_t& aPid,
-                                   const InfallibleTArray<ProtocolFdMapping>& aFds) MOZ_OVERRIDE;
+                                   InfallibleTArray<ProtocolFdMapping>&& aFds) MOZ_OVERRIDE;
 
     virtual bool RecvCreateFakeVolume(const nsString& fsName, const nsString& mountPoint) MOZ_OVERRIDE;
 
     virtual bool RecvSetFakeVolumeState(const nsString& fsName, const int32_t& fsState) MOZ_OVERRIDE;
 
     virtual bool RecvKeywordToURI(const nsCString& aKeyword,
                                   nsString* aProviderName,
                                   OptionalInputStreamParams* aPostData,
--- a/dom/ipc/FilePickerParent.cpp
+++ b/dom/ipc/FilePickerParent.cpp
@@ -196,18 +196,18 @@ FilePickerParent::CreateFilePicker()
   return NS_SUCCEEDED(mFilePicker->Init(window, mTitle, mMode));
 }
 
 bool
 FilePickerParent::RecvOpen(const int16_t& aSelectedType,
                            const bool& aAddToRecentDocs,
                            const nsString& aDefaultFile,
                            const nsString& aDefaultExtension,
-                           const InfallibleTArray<nsString>& aFilters,
-                           const InfallibleTArray<nsString>& aFilterNames,
+                           InfallibleTArray<nsString>&& aFilters,
+                           InfallibleTArray<nsString>&& aFilterNames,
                            const nsString& aDisplayDirectory)
 {
   if (!CreateFilePicker()) {
     unused << Send__delete__(this, void_t(), nsIFilePicker::returnCancel);
     return true;
   }
 
   mFilePicker->SetAddToRecentDocs(aAddToRecentDocs);
--- a/dom/ipc/FilePickerParent.h
+++ b/dom/ipc/FilePickerParent.h
@@ -30,18 +30,18 @@ class FilePickerParent : public PFilePic
 
   void Done(int16_t aResult);
   void SendFiles(const nsCOMArray<nsIDOMFile>& aDomfiles);
 
   virtual bool RecvOpen(const int16_t& aSelectedType,
                         const bool& aAddToRecentDocs,
                         const nsString& aDefaultFile,
                         const nsString& aDefaultExtension,
-                        const InfallibleTArray<nsString>& aFilters,
-                        const InfallibleTArray<nsString>& aFilterNames,
+                        InfallibleTArray<nsString>&& aFilters,
+                        InfallibleTArray<nsString>&& aFilterNames,
                         const nsString& aDisplayDirectory) MOZ_OVERRIDE;
 
   virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
 
   class FilePickerShownCallback : public nsIFilePickerShownCallback
   {
   public:
     explicit FilePickerShownCallback(FilePickerParent* aFilePickerParent)
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -74,16 +74,22 @@ struct ShowInfo
 {
   nsString name;
   bool fullscreenAllowed;
   bool isPrivate;
   float dpi;
   double defaultScale;
 };
 
+struct FrameScriptInfo
+{
+    nsString url;
+    bool runInGlobalScope;
+};
+
 prio(normal upto urgent) intr protocol PBrowser
 {
     manager PContent or PContentBridge;
 
     manages PColorPicker;
     manages PDocumentRenderer;
     manages PContentPermissionRequest;
     manages PFilePicker;
@@ -112,25 +118,26 @@ parent:
     /**
      * When child sends this message, parent should move focus to
      * the next or previous focusable element.
      */
     MoveFocus(bool forward);
 
     Event(RemoteDOMEvent aEvent);
 
-    intr CreateWindow(uint32_t aChromeFlags,
+    sync CreateWindow(PBrowser aNewTab,
+                      uint32_t aChromeFlags,
                       bool aCalledFromJS,
                       bool aPositionSpecified,
                       bool aSizeSpecified,
                       nsString aURI,
                       nsString aName,
                       nsString aFeatures,
                       nsString aBaseURI)
-      returns (bool windowIsNew, PBrowser window);
+      returns (bool windowOpened, FrameScriptInfo[] frameScripts);
 
     sync SyncMessage(nsString aMessage, ClonedMessageData aData,
                      CpowEntry[] aCpows, Principal aPrincipal)
       returns (nsString[] retval);
 
     prio(high) sync RpcMessage(nsString aMessage, ClonedMessageData aData,
                                CpowEntry[] aCpows, Principal aPrincipal)
       returns (nsString[] retval);
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -588,16 +588,24 @@ parent:
      * call runs, a new PluginModuleParent will be created in the ContentChild
      * via bridging. The corresponding PluginModuleChild will live in the plugin
      * process. We use intr semantics here to ensure that the PluginModuleParent
      * allocation message is dispatched before LoadPlugin returns.
      */
     sync LoadPlugin(uint32_t pluginId);
 
     /**
+     * This call is used by asynchronous plugin instantiation to notify the
+     * content parent that it is now safe to initiate the plugin bridge for
+     * the specified plugin id. When this call returns, the requested bridge
+     * connection has been made.
+     */
+    sync ConnectPluginBridge(uint32_t aPluginId);
+
+    /**
      * This call returns the set of plugins loaded in the chrome
      * process. However, in many cases this set will not have changed since the
      * last FindPlugins message. Consequently, the chrome process increments an
      * epoch number every time the set of plugins changes. The content process
      * sends up the last epoch it observed. If the epochs are the same, the
      * chrome process returns no plugins. Otherwise it returns a complete list.
      *
      * |pluginEpoch| is the epoch last observed by the content
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -246,17 +246,17 @@ TabChildBase::InitializeRootMetrics()
       ParentLayerSize(ViewAs<ParentLayerPixel>(mInnerSize, PixelCastJustification::ScreenIsParentLayerForRoot)));
   mLastRootMetrics.SetZoom(mLastRootMetrics.CalculateIntrinsicScale());
   mLastRootMetrics.SetDevPixelsPerCSSPixel(WebWidget()->GetDefaultScale());
   // We use ParentLayerToLayerScale(1) below in order to turn the
   // async zoom amount into the gecko zoom amount.
   mLastRootMetrics.SetCumulativeResolution(mLastRootMetrics.GetZoom() / mLastRootMetrics.GetDevPixelsPerCSSPixel() * ParentLayerToLayerScale(1));
   // This is the root layer, so the cumulative resolution is the same
   // as the resolution.
-  mLastRootMetrics.mPresShellResolution = mLastRootMetrics.GetCumulativeResolution().scale;
+  mLastRootMetrics.SetPresShellResolution(mLastRootMetrics.GetCumulativeResolution().scale);
   mLastRootMetrics.SetScrollOffset(CSSPoint(0, 0));
 
   TABC_LOG("After InitializeRootMetrics, mLastRootMetrics is %s\n",
     Stringify(mLastRootMetrics).c_str());
 }
 
 void
 TabChildBase::SetCSSViewport(const CSSSize& aSize)
@@ -429,18 +429,18 @@ TabChildBase::HandlePossibleViewportChan
     }
   }
 
   metrics.SetCumulativeResolution(metrics.GetZoom()
                                 / metrics.GetDevPixelsPerCSSPixel()
                                 * ParentLayerToLayerScale(1));
   // This is the root layer, so the cumulative resolution is the same
   // as the resolution.
-  metrics.mPresShellResolution = metrics.GetCumulativeResolution().scale;
-  utils->SetResolutionAndScaleTo(metrics.mPresShellResolution, metrics.mPresShellResolution);
+  metrics.SetPresShellResolution(metrics.GetCumulativeResolution().scale);
+  utils->SetResolutionAndScaleTo(metrics.GetPresShellResolution(), metrics.GetPresShellResolution());
 
   CSSSize scrollPort = metrics.CalculateCompositedSizeInCssPixels();
   utils->SetScrollPositionClampingScrollPortSize(scrollPort.width, scrollPort.height);
 
   // The call to GetPageSize forces a resize event to content, so we need to
   // make sure that we have the right CSS viewport and
   // scrollPositionClampingScrollPortSize set up before that happens.
 
@@ -973,18 +973,18 @@ TabChild::Observe(nsISupports *aSubject,
         mContentDocumentIsDisplayed = true;
 
         // In some cases before-first-paint gets called before
         // RecvUpdateDimensions is called and therefore before we have an
         // mInnerSize value set. In such cases defer initializing the viewport
         // until we we get an inner size.
         if (HasValidInnerSize()) {
           InitializeRootMetrics();
-          utils->SetResolution(mLastRootMetrics.mPresShellResolution,
-                               mLastRootMetrics.mPresShellResolution);
+          utils->SetResolution(mLastRootMetrics.GetPresShellResolution(),
+                               mLastRootMetrics.GetPresShellResolution());
           HandlePossibleViewportChange(mInnerSize);
         }
       }
     }
   }
 
   return NS_OK;
 }
@@ -1424,103 +1424,63 @@ TabChild::ProvideWindow(nsIDOMWindow* aP
                         nsIDOMWindow** aReturn)
 {
     *aReturn = nullptr;
 
     // If aParent is inside an <iframe mozbrowser> or <iframe mozapp> and this
     // isn't a request to open a modal-type window, we're going to create a new
     // <iframe mozbrowser/mozapp> and return its window here.
     nsCOMPtr<nsIDocShell> docshell = do_GetInterface(aParent);
-    if (docshell && docshell->GetIsInBrowserOrApp() &&
-        !(aChromeFlags & (nsIWebBrowserChrome::CHROME_MODAL |
-                          nsIWebBrowserChrome::CHROME_OPENAS_DIALOG |
-                          nsIWebBrowserChrome::CHROME_OPENAS_CHROME))) {
-
-      // Note that BrowserFrameProvideWindow may return NS_ERROR_ABORT if the
-      // open window call was canceled.  It's important that we pass this error
-      // code back to our caller.
-      return BrowserFrameProvideWindow(aParent, aURI, aName, aFeatures,
-                                       aWindowIsNew, aReturn);
-    }
-
-    int32_t openLocation =
-      nsWindowWatcher::GetWindowOpenLocation(aParent, aChromeFlags, aCalledFromJS,
-                                             aPositionSpecified, aSizeSpecified);
-
-    // If it turns out we're opening in the current browser, just hand over the
-    // current browser's docshell.
-    if (openLocation == nsIBrowserDOMWindow::OPEN_CURRENTWINDOW) {
-      nsCOMPtr<nsIWebBrowser> browser = do_GetInterface(WebNavigation());
-      *aWindowIsNew = false;
-      return browser->GetContentDOMWindow(aReturn);
-    }
-
-    // Otherwise, we're opening a new tab or a new window. We have to contact
-    // TabParent in order to do either.
-
-    PBrowserChild* newChild;
-
-    nsAutoCString uriString;
-    if (aURI) {
-      aURI->GetSpec(uriString);
+    bool iframeMoz = (docshell && docshell->GetIsInBrowserOrApp() &&
+                      !(aChromeFlags & (nsIWebBrowserChrome::CHROME_MODAL |
+                                        nsIWebBrowserChrome::CHROME_OPENAS_DIALOG |
+                                        nsIWebBrowserChrome::CHROME_OPENAS_CHROME)));
+
+    if (!iframeMoz) {
+      int32_t openLocation =
+        nsWindowWatcher::GetWindowOpenLocation(aParent, aChromeFlags, aCalledFromJS,
+                                               aPositionSpecified, aSizeSpecified);
+
+      // If it turns out we're opening in the current browser, just hand over the
+      // current browser's docshell.
+      if (openLocation == nsIBrowserDOMWindow::OPEN_CURRENTWINDOW) {
+        nsCOMPtr<nsIWebBrowser> browser = do_GetInterface(WebNavigation());
+        *aWindowIsNew = false;
+        return browser->GetContentDOMWindow(aReturn);
+      }
     }
 
-    nsCOMPtr<nsIDOMDocument> domDoc;
-    aParent->GetDocument(getter_AddRefs(domDoc));
-    if (!domDoc) {
-      NS_ERROR("Could retrieve document from nsIBaseWindow");
-      return NS_ERROR_FAILURE;
-    }
-
-    nsCOMPtr<nsIDocument> doc;
-    doc = do_QueryInterface(domDoc);
-    if (!doc) {
-      NS_ERROR("Document from nsIBaseWindow didn't QI to nsIDocument");
-      return NS_ERROR_FAILURE;
-    }
-
-    nsCOMPtr<nsIURI> baseURI = doc->GetDocBaseURI();
-    if (!baseURI) {
-      NS_ERROR("nsIDocument didn't return a base URI");
-      return NS_ERROR_FAILURE;
-    }
-
-    nsAutoCString baseURIString;
-    baseURI->GetSpec(baseURIString);
-
-    nsAutoString nameString;
-    nameString.Assign(aName);
-    nsAutoCString features;
-
-    // We can assume that if content is requesting to open a window from a remote
-    // tab, then we want to enforce that the new window is also a remote tab.
-    features.Assign(aFeatures);
-    features.Append(",remote");
-
-    if (!CallCreateWindow(aChromeFlags, aCalledFromJS, aPositionSpecified,
-                          aSizeSpecified, NS_ConvertUTF8toUTF16(uriString),
-                          nameString, NS_ConvertUTF8toUTF16(features),
-                          NS_ConvertUTF8toUTF16(baseURIString),
-                          aWindowIsNew, &newChild)) {
-        return NS_ERROR_NOT_AVAILABLE;
-    }
-
-    nsCOMPtr<nsIDOMWindow> win =
-        do_GetInterface(static_cast<TabChild*>(newChild)->WebNavigation());
-    win.forget(aReturn);
-    return NS_OK;
+    // Note that ProvideWindowCommon may return NS_ERROR_ABORT if the
+    // open window call was canceled.  It's important that we pass this error
+    // code back to our caller.
+    return ProvideWindowCommon(aParent,
+                               iframeMoz,
+                               aChromeFlags,
+                               aCalledFromJS,
+                               aPositionSpecified,
+                               aSizeSpecified,
+                               aURI,
+                               aName,
+                               aFeatures,
+                               aWindowIsNew,
+                               aReturn);
 }
 
 nsresult
-TabChild::BrowserFrameProvideWindow(nsIDOMWindow* aOpener,
-                                    nsIURI* aURI,
-                                    const nsAString& aName,
-                                    const nsACString& aFeatures,
-                                    bool* aWindowIsNew,
-                                    nsIDOMWindow** aReturn)
+TabChild::ProvideWindowCommon(nsIDOMWindow* aOpener,
+                              bool aIframeMoz,
+                              uint32_t aChromeFlags,
+                              bool aCalledFromJS,
+                              bool aPositionSpecified,
+                              bool aSizeSpecified,
+                              nsIURI* aURI,
+                              const nsAString& aName,
+                              const nsACString& aFeatures,
+                              bool* aWindowIsNew,
+                              nsIDOMWindow** aReturn)
 {
   *aReturn = nullptr;
 
   ContentChild* cc = ContentChild::GetSingleton();
   const TabId openerTabId = GetTabId();
 
   // We must use PopupIPCTabContext here; ContentParent will not accept the
   // result of this->AsIPCTabContext() (which will be a
@@ -1534,38 +1494,80 @@ TabChild::BrowserFrameProvideWindow(nsID
 
   TabId tabId;
   cc->SendAllocateTabId(openerTabId,
                         ipcContext,
                         cc->GetID(),
                         &tabId);
 
   nsRefPtr<TabChild> newChild = new TabChild(ContentChild::GetSingleton(), tabId,
-                                             /* TabContext */ *this, /* chromeFlags */ 0);
+                                             /* TabContext */ *this, aChromeFlags);
   if (NS_FAILED(newChild->Init())) {
     return NS_ERROR_ABORT;
   }
 
   context.opener() = this;
   unused << Manager()->SendPBrowserConstructor(
       // We release this ref in DeallocPBrowserChild
       nsRefPtr<TabChild>(newChild).forget().take(),
-      tabId, IPCTabContext(context, mScrolling), /* chromeFlags */ 0,
+      tabId, IPCTabContext(context, mScrolling), aChromeFlags,
       cc->GetID(), cc->IsForApp(), cc->IsForBrowser());
 
   nsAutoCString spec;
   if (aURI) {
     aURI->GetSpec(spec);
   }
 
   NS_ConvertUTF8toUTF16 url(spec);
   nsString name(aName);
-  NS_ConvertUTF8toUTF16 features(aFeatures);
-  newChild->SendBrowserFrameOpenWindow(this, url, name,
-                                       features, aWindowIsNew);
+  nsAutoCString features(aFeatures);
+  nsTArray<FrameScriptInfo> frameScripts;
+
+  if (aIframeMoz) {
+    newChild->SendBrowserFrameOpenWindow(this, url, name,
+                                         NS_ConvertUTF8toUTF16(features),
+                                         aWindowIsNew);
+  } else {
+    nsCOMPtr<nsIDOMDocument> domDoc;
+    aOpener->GetDocument(getter_AddRefs(domDoc));
+    if (!domDoc) {
+      NS_ERROR("Could retrieve document from nsIBaseWindow");
+      return NS_ERROR_FAILURE;
+    }
+
+    nsCOMPtr<nsIDocument> doc;
+    doc = do_QueryInterface(domDoc);
+    if (!doc) {
+      NS_ERROR("Document from nsIBaseWindow didn't QI to nsIDocument");
+      return NS_ERROR_FAILURE;
+    }
+
+    nsCOMPtr<nsIURI> baseURI = doc->GetDocBaseURI();
+    if (!baseURI) {
+      NS_ERROR("nsIDocument didn't return a base URI");
+      return NS_ERROR_FAILURE;
+    }
+
+    nsAutoCString baseURIString;
+    baseURI->GetSpec(baseURIString);
+
+    // We can assume that if content is requesting to open a window from a remote
+    // tab, then we want to enforce that the new window is also a remote tab.
+    features.AppendLiteral(",remote");
+
+    if (!SendCreateWindow(newChild,
+                          aChromeFlags, aCalledFromJS, aPositionSpecified,
+                          aSizeSpecified, url,
+                          name, NS_ConvertUTF8toUTF16(features),
+                          NS_ConvertUTF8toUTF16(baseURIString),
+                          aWindowIsNew,
+                          &frameScripts)) {
+      return NS_ERROR_NOT_AVAILABLE;
+    }
+  }
   if (!*aWindowIsNew) {
     PBrowserChild::Send__delete__(newChild);
     return NS_ERROR_ABORT;
   }
 
   ScrollingBehavior scrolling = DEFAULT_SCROLLING;
   TextureFactoryIdentifier textureFactoryIdentifier;
   uint64_t layersId = 0;
@@ -1578,16 +1580,23 @@ TabChild::BrowserFrameProvideWindow(nsID
     PRenderFrameChild::Send__delete__(renderFrame);
     renderFrame = nullptr;
   }
 
   // Unfortunately we don't get a window unless we've shown the frame.  That's
   // pretty bogus; see bug 763602.
   newChild->DoFakeShow(scrolling, textureFactoryIdentifier, layersId, renderFrame);
 
+  for (size_t i = 0; i < frameScripts.Length(); i++) {
+    FrameScriptInfo& info = frameScripts[i];
+    if (!newChild->RecvLoadRemoteScript(info.url(), info.runInGlobalScope())) {
+      MOZ_CRASH();
+    }
+  }
+
   nsCOMPtr<nsIDOMWindow> win = do_GetInterface(newChild->WebNavigation());
   win.forget(aReturn);
   return NS_OK;
 }
 
 bool
 TabChild::HasValidInnerSize()
 {
@@ -1909,17 +1918,24 @@ TabChild::DoFakeShow(const ScrollingBeha
 }
 
 void
 TabChild::ApplyShowInfo(const ShowInfo& aInfo)
 {
   nsCOMPtr<nsIDocShell> docShell = do_GetInterface(WebNavigation());
   if (docShell) {
     nsCOMPtr<nsIDocShellTreeItem> item = do_GetInterface(docShell);
-    item->SetName(aInfo.name());
+    if (IsBrowserOrApp()) {
+      // B2G allows window.name to be set by changing the name attribute on the
+      // <iframe mozbrowser> element. window.open calls cause this attribute to
+      // be set to the correct value. A normal <xul:browser> element has no such
+      // attribute. The data we get here comes from reading the attribute, so we
+      // shouldn't trust it for <xul:browser> elements.
+      item->SetName(aInfo.name());
+    }
     docShell->SetFullscreenAllowed(aInfo.fullscreenAllowed());
     if (aInfo.isPrivate()) {
       bool nonBlank;
       docShell->GetHasLoadedNonBlankURI(&nonBlank);
       if (nonBlank) {
         nsContentUtils::ReportToConsoleNonLocalized(
           NS_LITERAL_STRING("We should not switch to Private Browsing after loading a document."),
           nsIScriptError::warningFlag,
@@ -2957,17 +2973,17 @@ TabChild::RecvLoadRemoteScript(const nsS
 
   LoadFrameScriptInternal(aURL, aRunInGlobalScope);
   return true;
 }
 
 bool
 TabChild::RecvAsyncMessage(const nsString& aMessage,
                            const ClonedMessageData& aData,
-                           const InfallibleTArray<CpowEntry>& aCpows,
+                           InfallibleTArray<CpowEntry>&& aCpows,
                            const IPC::Principal& aPrincipal)
 {
   if (mTabChildGlobal) {
     nsCOMPtr<nsIXPConnectJSObjectHolder> kungFuDeathGrip(GetGlobal());
     StructuredCloneData cloneData = UnpackClonedMessageDataForChild(aData);
     nsRefPtr<nsFrameMessageManager> mm =
       static_cast<nsFrameMessageManager*>(mTabChildGlobal->mMessageManager.get());
     CpowIdHolder cpows(Manager(), aCpows);
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -370,17 +370,17 @@ public:
                               const bool&     aPreventDefault) MOZ_OVERRIDE;
     virtual bool RecvCompositionEvent(const mozilla::WidgetCompositionEvent& event) MOZ_OVERRIDE;
     virtual bool RecvSelectionEvent(const mozilla::WidgetSelectionEvent& event) MOZ_OVERRIDE;
     virtual bool RecvActivateFrameEvent(const nsString& aType, const bool& capture) MOZ_OVERRIDE;
     virtual bool RecvLoadRemoteScript(const nsString& aURL,
                                       const bool& aRunInGlobalScope) MOZ_OVERRIDE;
     virtual bool RecvAsyncMessage(const nsString& aMessage,
                                   const ClonedMessageData& aData,
-                                  const InfallibleTArray<CpowEntry>& aCpows,
+                                  InfallibleTArray<CpowEntry>&& aCpows,
                                   const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
 
     virtual bool RecvAppOfflineStatus(const uint32_t& aId, const bool& aOffline) MOZ_OVERRIDE;
 
     virtual PDocumentRendererChild*
     AllocPDocumentRendererChild(const nsRect& documentRect, const gfx::Matrix& transform,
                                 const nsString& bgcolor,
                                 const uint32_t& renderFlags, const bool& flushLayout,
@@ -569,22 +569,27 @@ private:
     // isn't a tap, then we CancelTapTracking().  In the meantime, we
     // may detect a context-menu event, and if so we
     // FireContextMenuEvent().
     void FireContextMenuEvent();
     void CancelTapTracking();
     void UpdateTapState(const WidgetTouchEvent& aEvent, nsEventStatus aStatus);
 
     nsresult
-    BrowserFrameProvideWindow(nsIDOMWindow* aOpener,
-                              nsIURI* aURI,
-                              const nsAString& aName,
-                              const nsACString& aFeatures,
-                              bool* aWindowIsNew,
-                              nsIDOMWindow** aReturn);
+    ProvideWindowCommon(nsIDOMWindow* aOpener,
+                        bool aIframeMoz,
+                        uint32_t aChromeFlags,
+                        bool aCalledFromJS,
+                        bool aPositionSpecified,
+                        bool aSizeSpecified,
+                        nsIURI* aURI,
+                        const nsAString& aName,
+                        const nsACString& aFeatures,
+                        bool* aWindowIsNew,
+                        nsIDOMWindow** aReturn);
 
     bool HasValidInnerSize();
 
     void SendPendingTouchPreventedResponse(bool aPreventDefault,
                                            const ScrollableLayerGuid& aGuid);
 
     // Adds the scrollable layer target to the target list, and returns whether
     // or not the caller should wait for a refresh to send a target
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -267,16 +267,17 @@ TabParent::TabParent(nsIContentParent* a
   , mManager(aManager)
   , mMarkedDestroying(false)
   , mIsDestroyed(false)
   , mAppPackageFileDescriptorSent(false)
   , mSendOfflineStatus(true)
   , mChromeFlags(aChromeFlags)
   , mInitedByParent(false)
   , mTabId(aTabId)
+  , mSkipLoad(false)
 {
   MOZ_ASSERT(aManager);
 }
 
 TabParent::~TabParent()
 {
 }
 
@@ -444,75 +445,107 @@ TabParent::RecvEvent(const RemoteDOMEven
 
   event->SetOwner(target);
 
   bool dummy;
   target->DispatchEvent(event, &dummy);
   return true;
 }
 
+struct MOZ_STACK_CLASS TabParent::AutoUseNewTab MOZ_FINAL
+{
+public:
+  AutoUseNewTab(TabParent* aNewTab, bool* aWindowIsNew)
+   : mNewTab(aNewTab), mWindowIsNew(aWindowIsNew)
+  {
+    MOZ_ASSERT(!TabParent::sNextTabParent);
+    TabParent::sNextTabParent = aNewTab;
+    aNewTab->mSkipLoad = true;
+  }
+
+  ~AutoUseNewTab()
+  {
+    mNewTab->mSkipLoad = false;
+
+    if (TabParent::sNextTabParent) {
+      MOZ_ASSERT(TabParent::sNextTabParent == mNewTab);
+      TabParent::sNextTabParent = nullptr;
+      *mWindowIsNew = false;
+    }
+  }
+
+private:
+  TabParent* mNewTab;
+  bool* mWindowIsNew;
+};
+
 bool
-TabParent::AnswerCreateWindow(const uint32_t& aChromeFlags,
-                              const bool& aCalledFromJS,
-                              const bool& aPositionSpecified,
-                              const bool& aSizeSpecified,
-                              const nsString& aURI,
-                              const nsString& aName,
-                              const nsString& aFeatures,
-                              const nsString& aBaseURI,
-                              bool* aWindowIsNew,
-                              PBrowserParent** aRetVal)
+TabParent::RecvCreateWindow(PBrowserParent* aNewTab,
+                            const uint32_t& aChromeFlags,
+                            const bool& aCalledFromJS,
+                            const bool& aPositionSpecified,
+                            const bool& aSizeSpecified,
+                            const nsString& aURI,
+                            const nsString& aName,
+                            const nsString& aFeatures,
+                            const nsString& aBaseURI,
+                            bool* aWindowIsNew,
+                            InfallibleTArray<FrameScriptInfo>* aFrameScripts)
 {
+  // We always expect to open a new window here. If we don't, it's an error.
+  *aWindowIsNew = true;
+
   if (IsBrowserOrApp()) {
     return false;
   }
 
   nsresult rv;
   nsCOMPtr<nsPIWindowWatcher> pwwatch =
     do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
   NS_ENSURE_SUCCESS(rv, false);
 
+  TabParent* newTab = static_cast<TabParent*>(aNewTab);
+
   nsCOMPtr<nsIContent> frame(do_QueryInterface(mFrameElement));
   NS_ENSURE_TRUE(frame, false);
 
   nsCOMPtr<nsIDOMWindow> parent = do_QueryInterface(frame->OwnerDoc()->GetWindow());
   NS_ENSURE_TRUE(parent, false);
 
   int32_t openLocation =
     nsWindowWatcher::GetWindowOpenLocation(parent, aChromeFlags, aCalledFromJS,
                                            aPositionSpecified, aSizeSpecified);
 
   MOZ_ASSERT(openLocation == nsIBrowserDOMWindow::OPEN_NEWTAB ||
              openLocation == nsIBrowserDOMWindow::OPEN_NEWWINDOW);
 
-  *aWindowIsNew = true;
-
   // Opening new tabs is the easy case...
   if (openLocation == nsIBrowserDOMWindow::OPEN_NEWTAB) {
     NS_ENSURE_TRUE(mBrowserDOMWindow, false);
 
     bool isPrivate;
     nsCOMPtr<nsILoadContext> loadContext = GetLoadContext();
     loadContext->GetUsePrivateBrowsing(&isPrivate);
 
     nsCOMPtr<nsIOpenURIInFrameParams> params = new nsOpenURIInFrameParams();
     params->SetReferrer(aBaseURI);
     params->SetIsPrivate(isPrivate);
 
+    AutoUseNewTab aunt(newTab, aWindowIsNew);
+
     nsCOMPtr<nsIFrameLoaderOwner> frameLoaderOwner;
     mBrowserDOMWindow->OpenURIInFrame(nullptr, params,
-                                      nsIBrowserDOMWindow::OPEN_NEWTAB,
+                                      openLocation,
                                       nsIBrowserDOMWindow::OPEN_NEW,
                                       getter_AddRefs(frameLoaderOwner));
-    NS_ENSURE_TRUE(frameLoaderOwner, false);
+    if (!frameLoaderOwner) {
+      *aWindowIsNew = false;
+    }
 
-    nsRefPtr<nsFrameLoader> frameLoader = frameLoaderOwner->GetFrameLoader();
-    NS_ENSURE_TRUE(frameLoader, false);
-
-    *aRetVal = frameLoader->GetRemoteBrowser();
+    aFrameScripts->SwapElements(newTab->mDelayedFrameScripts);
     return true;
   }
 
   // WindowWatcher is going to expect a valid URI to open a window
   // to. If it can't find one, it's going to attempt to figure one
   // out on its own, which is problematic because it can't access
   // the document for the remote browser we're opening. Luckily,
   // TabChild has sent us a baseURI with which we can ensure that
@@ -525,40 +558,72 @@ TabParent::AnswerCreateWindow(const uint
   rv = NS_NewURI(getter_AddRefs(finalURI), NS_ConvertUTF16toUTF8(aURI).get(), baseURI);
   NS_ENSURE_SUCCESS(rv, false);
 
   nsAutoCString finalURIString;
   finalURI->GetSpec(finalURIString);
 
   nsCOMPtr<nsIDOMWindow> window;
 
+  AutoUseNewTab aunt(newTab, aWindowIsNew);
+
   rv = pwwatch->OpenWindow2(parent, finalURIString.get(),
                             NS_ConvertUTF16toUTF8(aName).get(),
                             NS_ConvertUTF16toUTF8(aFeatures).get(), aCalledFromJS,
                             false, false, this, nullptr, getter_AddRefs(window));
   NS_ENSURE_SUCCESS(rv, false);
 
   nsCOMPtr<nsPIDOMWindow> pwindow = do_QueryInterface(window);
   NS_ENSURE_TRUE(pwindow, false);
 
   nsRefPtr<nsIDocShell> newDocShell = pwindow->GetDocShell();
   NS_ENSURE_TRUE(newDocShell, false);
 
   nsCOMPtr<nsITabParent> newRemoteTab = newDocShell->GetOpenedRemote();
   NS_ENSURE_TRUE(newRemoteTab, false);
 
-  *aRetVal = static_cast<TabParent*>(newRemoteTab.get());
+  MOZ_ASSERT(static_cast<TabParent*>(newRemoteTab.get()) == newTab);
+
+  aFrameScripts->SwapElements(newTab->mDelayedFrameScripts);
   return true;
 }
 
+TabParent* TabParent::sNextTabParent;
+
+/* static */ TabParent*
+TabParent::GetNextTabParent()
+{
+  TabParent* result = sNextTabParent;
+  sNextTabParent = nullptr;
+  return result;
+}
+
+bool
+TabParent::SendLoadRemoteScript(const nsString& aURL,
+                                const bool& aRunInGlobalScope)
+{
+  if (mSkipLoad) {
+    mDelayedFrameScripts.AppendElement(FrameScriptInfo(aURL, aRunInGlobalScope));
+    return true;
+  }
+
+  MOZ_ASSERT(mDelayedFrameScripts.IsEmpty());
+  return PBrowserParent::SendLoadRemoteScript(aURL, aRunInGlobalScope);
+}
+
 void
 TabParent::LoadURL(nsIURI* aURI)
 {
     MOZ_ASSERT(aURI);
 
+    if (mSkipLoad) {
+        // Don't send the message if the child wants to load its own URL.
+        return;
+    }
+
     if (mIsDestroyed) {
         return;
     }
 
     nsCString spec;
     aURI->GetSpec(spec);
 
     if (!mShown) {
@@ -1217,17 +1282,17 @@ TabParent::TryCapture(const WidgetGUIEve
 
   SendRealTouchEvent(event);
   return true;
 }
 
 bool
 TabParent::RecvSyncMessage(const nsString& aMessage,
                            const ClonedMessageData& aData,
-                           const InfallibleTArray<CpowEntry>& aCpows,
+                           InfallibleTArray<CpowEntry>&& aCpows,
                            const IPC::Principal& aPrincipal,
                            InfallibleTArray<nsString>* aJSONRetVal)
 {
   // FIXME Permission check for TabParent in Content process
   nsIPrincipal* principal = aPrincipal;
   if (Manager()->IsContentParent()) {
     ContentParent* parent = Manager()->AsContentParent();
     if (!ContentParent::IgnoreIPCPrincipal() &&
@@ -1239,17 +1304,17 @@ TabParent::RecvSyncMessage(const nsStrin
   StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
   CpowIdHolder cpows(Manager(), aCpows);
   return ReceiveMessage(aMessage, true, &cloneData, &cpows, aPrincipal, aJSONRetVal);
 }
 
 bool
 TabParent::RecvRpcMessage(const nsString& aMessage,
                           const ClonedMessageData& aData,
-                          const InfallibleTArray<CpowEntry>& aCpows,
+                          InfallibleTArray<CpowEntry>&& aCpows,
                           const IPC::Principal& aPrincipal,
                           InfallibleTArray<nsString>* aJSONRetVal)
 {
   // FIXME Permission check for TabParent in Content process
   nsIPrincipal* principal = aPrincipal;
   if (Manager()->IsContentParent()) {
     ContentParent* parent = Manager()->AsContentParent();
     if (!ContentParent::IgnoreIPCPrincipal() &&
@@ -1261,17 +1326,17 @@ TabParent::RecvRpcMessage(const nsString
   StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
   CpowIdHolder cpows(Manager(), aCpows);
   return ReceiveMessage(aMessage, true, &cloneData, &cpows, aPrincipal, aJSONRetVal);
 }
 
 bool
 TabParent::RecvAsyncMessage(const nsString& aMessage,
                             const ClonedMessageData& aData,
-                            const InfallibleTArray<CpowEntry>& aCpows,
+                            InfallibleTArray<CpowEntry>&& aCpows,
                             const IPC::Principal& aPrincipal)
 {
   // FIXME Permission check for TabParent in Content process
   nsIPrincipal* principal = aPrincipal;
   if (Manager()->IsContentParent()) {
     ContentParent* parent = Manager()->AsContentParent();
     if (!ContentParent::IgnoreIPCPrincipal() &&
         parent && principal && !AssertAppPrincipal(parent, principal)) {
@@ -1430,17 +1495,17 @@ TabParent::RecvNotifyIMETextChange(const
   notification.mTextChangeData.mCausedByComposition = aCausedByComposition;
   widget->NotifyIME(notification);
   return true;
 }
 
 bool
 TabParent::RecvNotifyIMESelectedCompositionRect(
   const uint32_t& aOffset,
-  const InfallibleTArray<nsIntRect>& aRects,
+  InfallibleTArray<nsIntRect>&& aRects,
   const uint32_t& aCaretOffset,
   const nsIntRect& aCaretRect)
 {
   // add rect to cache for another query
   mIMECompositionRectOffset = aOffset;
   mIMECompositionRects = aRects;
   mIMECaretOffset = aCaretOffset;
   mIMECaretRect = aCaretRect;
@@ -1511,17 +1576,17 @@ TabParent::RecvNotifyIMEEditorRect(const
 {
   mIMEEditorRect = aRect;
   return true;
 }
 
 bool
 TabParent::RecvNotifyIMEPositionChange(
              const nsIntRect& aEditorRect,
-             const InfallibleTArray<nsIntRect>& aCompositionRects,
+             InfallibleTArray<nsIntRect>&& aCompositionRects,
              const nsIntRect& aCaretRect)
 {
   mIMEEditorRect = aEditorRect;
   mIMECompositionRects = aCompositionRects;
   mIMECaretRect = aCaretRect;
 
   nsCOMPtr<nsIWidget> widget = GetWidget();
   if (!widget) {
@@ -1555,18 +1620,18 @@ TabParent::RecvRequestFocus(const bool& 
 
   nsCOMPtr<nsIDOMElement> node = do_QueryInterface(mFrameElement);
   fm->SetFocus(node, flags);
   return true;
 }
 
 bool
 TabParent::RecvEnableDisableCommands(const nsString& aAction,
-                                     const nsTArray<nsCString>& aEnabledCommands,
-                                     const nsTArray<nsCString>& aDisabledCommands)
+                                     nsTArray<nsCString>&& aEnabledCommands,
+                                     nsTArray<nsCString>&& aDisabledCommands)
 {
   nsCOMPtr<nsIRemoteBrowser> remoteBrowser = do_QueryInterface(mFrameElement);
   if (remoteBrowser) {
     nsAutoArrayPtr<const char*> enabledCommands, disabledCommands;
 
     if (aEnabledCommands.Length()) {
       enabledCommands = new const char* [aEnabledCommands.Length()];
       for (uint32_t c = 0; c < aEnabledCommands.Length(); c++) {
@@ -2282,17 +2347,17 @@ TabParent::RecvContentReceivedInputBlock
   if (RenderFrameParent* rfp = GetRenderFrame()) {
     rfp->ContentReceivedInputBlock(aGuid, aInputBlockId, aPreventDefault);
   }
   return true;
 }
 
 bool
 TabParent::RecvSetTargetAPZC(const uint64_t& aInputBlockId,
-                             const nsTArray<ScrollableLayerGuid>& aTargets)
+                             nsTArray<ScrollableLayerGuid>&& aTargets)
 {
   if (RenderFrameParent* rfp = GetRenderFrame()) {
     rfp->SetTargetAPZC(aInputBlockId, aTargets);
   }
   return true;
 }
 
 already_AddRefed<nsILoadContext>
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -129,81 +129,82 @@ public:
     virtual bool RecvEvent(const RemoteDOMEvent& aEvent) MOZ_OVERRIDE;
     virtual bool RecvReplyKeyEvent(const WidgetKeyboardEvent& aEvent) MOZ_OVERRIDE;
     virtual bool RecvDispatchAfterKeyboardEvent(const WidgetKeyboardEvent& aEvent) MOZ_OVERRIDE;
     virtual bool RecvBrowserFrameOpenWindow(PBrowserParent* aOpener,
                                             const nsString& aURL,
                                             const nsString& aName,
                                             const nsString& aFeatures,
                                             bool* aOutWindowOpened) MOZ_OVERRIDE;
-    virtual bool AnswerCreateWindow(const uint32_t& aChromeFlags,
-                                    const bool& aCalledFromJS,
-                                    const bool& aPositionSpecified,
-                                    const bool& aSizeSpecified,
-                                    const nsString& aURI,
-                                    const nsString& aName,
-                                    const nsString& aFeatures,
-                                    const nsString& aBaseURI,
-                                    bool* aWindowIsNew,
-                                    PBrowserParent** aRetVal) MOZ_OVERRIDE;
+    virtual bool RecvCreateWindow(PBrowserParent* aOpener,
+                                  const uint32_t& aChromeFlags,
+                                  const bool& aCalledFromJS,
+                                  const bool& aPositionSpecified,
+                                  const bool& aSizeSpecified,
+                                  const nsString& aURI,
+                                  const nsString& aName,
+                                  const nsString& aFeatures,
+                                  const nsString& aBaseURI,
+                                  bool* aWindowIsNew,
+                                  InfallibleTArray<FrameScriptInfo>* aFrameScripts) MOZ_OVERRIDE;
     virtual bool RecvSyncMessage(const nsString& aMessage,
                                  const ClonedMessageData& aData,
-                                 const InfallibleTArray<CpowEntry>& aCpows,
+                                 InfallibleTArray<CpowEntry>&& aCpows,
                                  const IPC::Principal& aPrincipal,
                                  InfallibleTArray<nsString>* aJSONRetVal) MOZ_OVERRIDE;
     virtual bool RecvRpcMessage(const nsString& aMessage,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<CpowEntry>& aCpows,
+                                InfallibleTArray<CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal,
                                 InfallibleTArray<nsString>* aJSONRetVal) MOZ_OVERRIDE;
     virtual bool RecvAsyncMessage(const nsString& aMessage,
                                   const ClonedMessageData& aData,
-                                  const InfallibleTArray<CpowEntry>& aCpows,
+                                  InfallibleTArray<CpowEntry>&& aCpows,
                                   const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMEFocus(const bool& aFocus,
                                     nsIMEUpdatePreference* aPreference,
                                     uint32_t* aSeqno) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMETextChange(const uint32_t& aStart,
                                          const uint32_t& aEnd,
                                          const uint32_t& aNewEnd,
                                          const bool& aCausedByComposition) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMESelectedCompositionRect(
                    const uint32_t& aOffset,
-                   const InfallibleTArray<nsIntRect>& aRects,
+                   InfallibleTArray<nsIntRect>&& aRects,
                    const uint32_t& aCaretOffset,
                    const nsIntRect& aCaretRect) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMESelection(const uint32_t& aSeqno,
                                         const uint32_t& aAnchor,
                                         const uint32_t& aFocus,
                                         const mozilla::WritingMode& aWritingMode,
                                         const bool& aCausedByComposition) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMETextHint(const nsString& aText) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMEMouseButtonEvent(const widget::IMENotification& aEventMessage,
                                                bool* aConsumedByIME) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMEEditorRect(const nsIntRect& aRect) MOZ_OVERRIDE;
     virtual bool RecvNotifyIMEPositionChange(
                    const nsIntRect& aEditoRect,
-                   const InfallibleTArray<nsIntRect>& aCompositionRects,
+                   InfallibleTArray<nsIntRect>&& aCompositionRects,
                    const nsIntRect& aCaretRect) MOZ_OVERRIDE;
     virtual bool RecvEndIMEComposition(const bool& aCancel,
                                        nsString* aComposition) MOZ_OVERRIDE;
     virtual bool RecvGetInputContext(int32_t* aIMEEnabled,
                                      int32_t* aIMEOpen,
                                      intptr_t* aNativeIMEContext) MOZ_OVERRIDE;
     virtual bool RecvSetInputContext(const int32_t& aIMEEnabled,
                                      const int32_t& aIMEOpen,
                                      const nsString& aType,
                                      const nsString& aInputmode,
                                      const nsString& aActionHint,
                                      const int32_t& aCause,
                                      const int32_t& aFocusChange) MOZ_OVERRIDE;
     virtual bool RecvRequestFocus(const bool& aCanRaise) MOZ_OVERRIDE;
     virtual bool RecvEnableDisableCommands(const nsString& aAction,
-                                           const nsTArray<nsCString>& aEnabledCommands,
-                                           const nsTArray<nsCString>& aDisabledCommands) MOZ_OVERRIDE;
+                                           nsTArray<nsCString>&& aEnabledCommands,
+                                           nsTArray<nsCString>&& aDisabledCommands) MOZ_OVERRIDE;
     virtual bool RecvSetCursor(const uint32_t& aValue, const bool& aForce) MOZ_OVERRIDE;
     virtual bool RecvSetBackgroundColor(const nscolor& aValue) MOZ_OVERRIDE;
     virtual bool RecvSetStatus(const uint32_t& aType, const nsString& aStatus) MOZ_OVERRIDE;
     virtual bool RecvIsParentWindowMainWidgetVisible(bool* aIsVisible) MOZ_OVERRIDE;
     virtual bool RecvShowTooltip(const uint32_t& aX, const uint32_t& aY, const nsString& aTooltip) MOZ_OVERRIDE;
     virtual bool RecvHideTooltip() MOZ_OVERRIDE;
     virtual bool RecvGetDPI(float* aValue) MOZ_OVERRIDE;
     virtual bool RecvGetDefaultScale(double* aValue) MOZ_OVERRIDE;
@@ -214,17 +215,17 @@ public:
     virtual bool RecvUpdateZoomConstraints(const uint32_t& aPresShellId,
                                            const ViewID& aViewId,
                                            const bool& aIsRoot,
                                            const ZoomConstraints& aConstraints) MOZ_OVERRIDE;
     virtual bool RecvContentReceivedInputBlock(const ScrollableLayerGuid& aGuid,
                                                const uint64_t& aInputBlockId,
                                                const bool& aPreventDefault) MOZ_OVERRIDE;
     virtual bool RecvSetTargetAPZC(const uint64_t& aInputBlockId,
-                                   const nsTArray<ScrollableLayerGuid>& aTargets) MOZ_OVERRIDE;
+                                   nsTArray<ScrollableLayerGuid>&& aTargets) MOZ_OVERRIDE;
 
     virtual PColorPickerParent*
     AllocPColorPickerParent(const nsString& aTitle, const nsString& aInitialColor) MOZ_OVERRIDE;
     virtual bool DeallocPColorPickerParent(PColorPickerParent* aColorPicker) MOZ_OVERRIDE;
 
     void LoadURL(nsIURI* aURI);
     // XXX/cjones: it's not clear what we gain by hiding these
     // message-sending functions under a layer of indirection and
@@ -347,16 +348,21 @@ public:
      * Native widget remoting protocol for use with windowed plugins with e10s.
      */
     virtual PPluginWidgetParent* AllocPPluginWidgetParent() MOZ_OVERRIDE;
     virtual bool DeallocPPluginWidgetParent(PPluginWidgetParent* aActor) MOZ_OVERRIDE;
 
     void SetInitedByParent() { mInitedByParent = true; }
     bool IsInitedByParent() const { return mInitedByParent; }
 
+    static TabParent* GetNextTabParent();
+
+    bool SendLoadRemoteScript(const nsString& aURL,
+                              const bool& aRunInGlobalScope);
+
 protected:
     bool ReceiveMessage(const nsString& aMessage,
                         bool aSync,
                         const StructuredCloneData* aCloneData,
                         CpowHolder* aCpows,
                         nsIPrincipal* aPrincipal,
                         InfallibleTArray<nsString>* aJSONRetVal = nullptr);
 
@@ -463,16 +469,45 @@ private:
     // When true, the TabParent is initialized without child side's request.
     // When false, the TabParent is initialized by window.open() from child side.
     bool mInitedByParent;
 
     nsCOMPtr<nsILoadContext> mLoadContext;
 
     TabId mTabId;
 
+    // Helper class for RecvCreateWindow.
+    struct AutoUseNewTab;
+
+    // When loading a new tab or window via window.open, the child process sends
+    // a new PBrowser to use. We store that tab in sNextTabParent and then
+    // proceed through the browser's normal paths to create a new
+    // window/tab. When it comes time to create a new TabParent, we instead use
+    // sNextTabParent.
+    static TabParent* sNextTabParent;
+
+    // When loading a new tab or window via window.open, the child is
+    // responsible for loading the URL it wants into the new
+    // TabChild. Simultaneously, though, the parent sends a LoadURL message to
+    // every new PBrowser (usually for about:blank). This message usually
+    // arrives after the child has started to load the URL it wants, and
+    // overrides it. To prevent this, we set mSkipLoad to true when creating the
+    // new tab. This flag prevents the unwanted LoadURL message from being sent
+    // by the parent.
+    bool mSkipLoad;
+
+    // When loading a new tab or window via window.open, we want to ensure that
+    // frame scripts for that tab are loaded before any scripts start to run in
+    // the window. We can't load the frame scripts the normal way, using
+    // separate IPC messages, since they won't be processed by the child until
+    // returning to the event loop, which is too late. Instead, we queue up
+    // frame scripts that we intend to load and send them as part of the
+    // CreateWindow response. Then TabChild loads them immediately.
+    nsTArray<FrameScriptInfo> mDelayedFrameScripts;
+
 private:
     // This is used when APZ needs to find the TabParent associated with a layer
     // to dispatch events.
     typedef nsDataHashtable<nsUint64HashKey, TabParent*> LayerToTabParentTable;
     static LayerToTabParentTable* sLayerToTabParentTable;
 
     static void AddTabParentToTable(uint64_t aLayersId, TabParent* aTabParent);
     static void RemoveTabParentFromTable(uint64_t aLayersId);
--- a/dom/ipc/nsIContentChild.cpp
+++ b/dom/ipc/nsIContentChild.cpp
@@ -110,17 +110,17 @@ nsIContentChild::GetOrCreateActorForBlob
   NS_ENSURE_TRUE(actor, nullptr);
 
   return actor;
 }
 
 bool
 nsIContentChild::RecvAsyncMessage(const nsString& aMsg,
                                   const ClonedMessageData& aData,
-                                  const InfallibleTArray<CpowEntry>& aCpows,
+                                  InfallibleTArray<CpowEntry>&& aCpows,
                                   const IPC::Principal& aPrincipal)
 {
   nsRefPtr<nsFrameMessageManager> cpm = nsFrameMessageManager::sChildProcessManager;
   if (cpm) {
     StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForChild(aData);
     CpowIdHolder cpows(this, aCpows);
     cpm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(cpm.get()),
                         aMsg, false, &cloneData, &cpows, aPrincipal, nullptr);
--- a/dom/ipc/nsIContentChild.h
+++ b/dom/ipc/nsIContentChild.h
@@ -73,17 +73,17 @@ protected:
   virtual bool DeallocPBrowserChild(PBrowserChild*);
 
   virtual PBlobChild* AllocPBlobChild(const BlobConstructorParams& aParams);
 
   virtual bool DeallocPBlobChild(PBlobChild* aActor);
 
   virtual bool RecvAsyncMessage(const nsString& aMsg,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal);
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsIContentChild, NS_ICONTENTCHILD_IID)
 
 } // dom
 } // mozilla
 #endif /* mozilla_dom_nsIContentChild_h */
--- a/dom/ipc/nsIContentParent.cpp
+++ b/dom/ipc/nsIContentParent.cpp
@@ -175,17 +175,17 @@ nsIContentParent::GetOrCreateActorForBlo
   NS_ENSURE_TRUE(actor, nullptr);
 
   return actor;
 }
 
 bool
 nsIContentParent::RecvSyncMessage(const nsString& aMsg,
                                   const ClonedMessageData& aData,
-                                  const InfallibleTArray<CpowEntry>& aCpows,
+                                  InfallibleTArray<CpowEntry>&& aCpows,
                                   const IPC::Principal& aPrincipal,
                                   InfallibleTArray<nsString>* aRetvals)
 {
   // FIXME Permission check in Content process
   nsIPrincipal* principal = aPrincipal;
   if (IsContentParent()) {
     ContentParent* parent = AsContentParent();
     if (!ContentParent::IgnoreIPCPrincipal() &&
@@ -202,17 +202,17 @@ nsIContentParent::RecvSyncMessage(const 
                         aMsg, true, &cloneData, &cpows, aPrincipal, aRetvals);
   }
   return true;
 }
 
 bool
 nsIContentParent::RecvRpcMessage(const nsString& aMsg,
                                  const ClonedMessageData& aData,
-                                 const InfallibleTArray<CpowEntry>& aCpows,
+                                 InfallibleTArray<CpowEntry>&& aCpows,
                                  const IPC::Principal& aPrincipal,
                                  InfallibleTArray<nsString>* aRetvals)
 {
   // FIXME Permission check in Content process
   nsIPrincipal* principal = aPrincipal;
   if (IsContentParent()) {
     ContentParent* parent = AsContentParent();
     if (!ContentParent::IgnoreIPCPrincipal() &&
@@ -229,17 +229,17 @@ nsIContentParent::RecvRpcMessage(const n
                         aMsg, true, &cloneData, &cpows, aPrincipal, aRetvals);
   }
   return true;
 }
 
 bool
 nsIContentParent::RecvAsyncMessage(const nsString& aMsg,
                                    const ClonedMessageData& aData,
-                                   const InfallibleTArray<CpowEntry>& aCpows,
+                                   InfallibleTArray<CpowEntry>&& aCpows,
                                    const IPC::Principal& aPrincipal)
 {
   // FIXME Permission check in Content process
   nsIPrincipal* principal = aPrincipal;
   if (IsContentParent()) {
     ContentParent* parent = AsContentParent();
     if (!ContentParent::IgnoreIPCPrincipal() &&
         parent && principal && !AssertAppPrincipal(parent, principal)) {
--- a/dom/ipc/nsIContentParent.h
+++ b/dom/ipc/nsIContentParent.h
@@ -87,27 +87,27 @@ protected: // IPDL methods
   virtual bool DeallocPBrowserParent(PBrowserParent* frame);
 
   virtual PBlobParent* AllocPBlobParent(const BlobConstructorParams& aParams);
 
   virtual bool DeallocPBlobParent(PBlobParent* aActor);
 
   virtual bool RecvSyncMessage(const nsString& aMsg,
                                const ClonedMessageData& aData,
-                               const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                               InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                const IPC::Principal& aPrincipal,
                                InfallibleTArray<nsString>* aRetvals);
   virtual bool RecvRpcMessage(const nsString& aMsg,
                               const ClonedMessageData& aData,
-                              const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                              InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                               const IPC::Principal& aPrincipal,
                               InfallibleTArray<nsString>* aRetvals);
   virtual bool RecvAsyncMessage(const nsString& aMsg,
                                 const ClonedMessageData& aData,
-                                const InfallibleTArray<jsipc::CpowEntry>& aCpows,
+                                InfallibleTArray<jsipc::CpowEntry>&& aCpows,
                                 const IPC::Principal& aPrincipal);
 
 protected: // members
   nsRefPtr<nsFrameMessageManager> mMessageManager;
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsIContentParent, NS_ICONTENTPARENT_IID)
 
--- a/dom/manifest/ManifestProcessor.jsm
+++ b/dom/manifest/ManifestProcessor.jsm
@@ -130,16 +130,49 @@ this.ManifestProcessor.prototype.process
       expectedType: 'string'
     };
 
     let value = extractValue(obj);
     value = (value) ? value.trim() : value;
     return (displayModes.has(value)) ? value : defaultDisplayMode;
   }
 
+  function processScopeMember(manifest, manifestURL, docURL, startURL) {
+    const spec = {
+        objectName: 'manifest',
+        object: manifest,
+        property: 'scope',
+        expectedType: 'string',
+        dontTrim: true
+      },
+      value = extractValue(spec);
+    let scopeURL;
+    try {
+      scopeURL = new URL(value, manifestURL);
+    } catch (e) {
+      let msg = 'The URL of scope is invalid.';
+      issueDeveloperWarning(msg);
+      return undefined;
+    }
+
+    if (scopeURL.origin !== docURL.origin) {
+      let msg = 'Scope needs to be same-origin as Document.';
+      issueDeveloperWarning(msg);
+      return undefined;
+    }
+
+    //If start URL is not within scope of scope URL:
+    if (startURL && startURL.origin !== scopeURL.origin || !startURL.pathname.startsWith(scopeURL.pathname)) {
+      let msg = 'The start URL is outside the scope, so scope is invalid.';
+      issueDeveloperWarning(msg);
+      return undefined;
+    }
+    return scopeURL;
+  }
+
   function processStartURLMember(manifest, manifestURL, docURL) {
     const obj = {
       objectName: 'manifest',
       object: manifest,
       property: 'start_url',
       expectedType: 'string'
     };
 
@@ -314,10 +347,11 @@ this.ManifestProcessor.prototype.process
   const processedManifest = {
     start_url: processStartURLMember(manifest, manifestURL, docURL),
     display: processDisplayMember(manifest),
     orientation: processOrientationMember(manifest),
     name: processNameMember(manifest),
     icons: processIconsMember(manifest, manifestURL),
     short_name: processShortNameMember(manifest)
   };
+  processedManifest.scope = processScopeMember(manifest, manifestURL, docURL, processedManifest.start_url);
   return processedManifest;
 };
\ No newline at end of file
--- a/dom/manifest/test/mochitest.ini
+++ b/dom/manifest/test/mochitest.ini
@@ -8,9 +8,10 @@ support-files =
 [test_IconsProcessor_sizes.html]
 [test_IconsProcessor_src.html]
 [test_IconsProcessor_type.html]
 [test_ManifestProcessor_display.html]
 [test_ManifestProcessor_icons.html]
 [test_ManifestProcessor_JSON.html]
 [test_ManifestProcessor_name_and_short_name.html]
 [test_ManifestProcessor_orientation.html]
-[test_ManifestProcessor_start_url.html]
\ No newline at end of file
+[test_ManifestProcessor_start_url.html]
+[test_ManifestProcessor_scope.html]
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/manifest/test/test_ManifestProcessor_scope.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1079453
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1079453</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <script src="common.js"></script>
+  <script>
+/**
+ * Manifest scope
+ * https://w3c.github.io/manifest/#scope-member
+ **/
+'use strict';
+var expected = 'Expect non-string scope to be undefined';
+typeTests.forEach((type) => {
+  data.jsonText = JSON.stringify({
+    scope: type
+  });
+  var result = processor.process(data);
+  ise(result.scope, undefined, expected);
+});
+
+var expected = 'Expect different origin to be treated as undefined';
+data.jsonText = JSON.stringify({
+  scope: 'http://not-same-origin'
+});
+var result = processor.process(data);
+ise(result.scope, undefined, expected);
+
+var expected = 'Expect the empty string to be treated as undefined.';
+data.jsonText = JSON.stringify({
+  scope: ''
+});
+var result = processor.process(data);
+ise(result.scope, undefined, expected);
+
+var expected = 'Resolve URLs relative to manifest.';
+var URLs = ['path', '/path', '../../path'];
+URLs.forEach((url) => {
+  data.jsonText = JSON.stringify({
+    scope: url,
+    start_url: "/path"
+  });
+  var absURL = new URL(url, manifestURL).toString();
+  var result = processor.process(data);
+  console.log(result);
+  ise(String(result.scope), absURL, expected);
+});
+
+var expected = 'If start URL is not in scope, return undefined.';
+data.jsonText = JSON.stringify({
+  scope: 'foo',
+  start_url: 'bar'
+});
+var result = processor.process(data);
+ise(result.scope, undefined, expected);
+
+var expected = 'If start URL is in scope, use the scope.';
+data.jsonText = JSON.stringify({
+  start_url: 'foobar',
+  scope: 'foo'
+});
+var result = processor.process(data);
+ise(result.scope.toString(), new URL('foo', manifestURL).toString(), expected);
+
+var expected = 'Expect start_url to be ' + new URL('foobar', manifestURL).toString();
+ise(result.start_url.toString(), new URL('foobar', manifestURL).toString(), expected);
+
+var expected = 'If start URL is in scope, use the scope.';
+data.jsonText = JSON.stringify({
+  start_url: '/foo/',
+  scope: '/foo/'
+});
+var result = processor.process(data);
+ise(result.scope.toString(), new URL('/foo/', manifestURL).toString(), expected);
+
+var expected = 'If start URL is in scope, use the scope.';
+data.jsonText = JSON.stringify({
+  start_url: '.././foo/',
+  scope: '../foo/'
+});
+var result = processor.process(data);
+ise(result.scope.toString(), new URL('/foo/', manifestURL).toString(), expected);
+
+  </script>
+</head>
--- a/dom/media/AbstractMediaDecoder.h
+++ b/dom/media/AbstractMediaDecoder.h
@@ -86,19 +86,19 @@ public:
   virtual mozilla::layers::ImageContainer* GetImageContainer() = 0;
 
   // Return true if the media layer supports seeking.
   virtual bool IsTransportSeekable() = 0;
 
   // Return true if the transport layer supports seeking.
   virtual bool IsMediaSeekable() = 0;
 
-  virtual void MetadataLoaded(nsAutoPtr<MediaInfo> aInfo, nsAutoPtr<MetadataTags> aTags) = 0;
+  virtual void MetadataLoaded(nsAutoPtr<MediaInfo> aInfo, nsAutoPtr<MetadataTags> aTags, bool aRestoredFromDromant) = 0;
   virtual void QueueMetadata(int64_t aTime, nsAutoPtr<MediaInfo> aInfo, nsAutoPtr<MetadataTags> aTags) = 0;
-  virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo) = 0;
+  virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo, bool aRestoredFromDromant) = 0;
 
   virtual void RemoveMediaTracks() = 0;
 
   // Set the media end time in microseconds
   virtual void SetMediaEndTime(int64_t aTime) = 0;
 
   // Make the decoder state machine update the playback position. Called by
   // the reader on the decoder thread (Assertions for this checked by
@@ -159,73 +159,79 @@ public:
 #endif
 };
 
 class MetadataContainer
 {
 protected:
   MetadataContainer(AbstractMediaDecoder* aDecoder,
                     nsAutoPtr<MediaInfo> aInfo,
-                    nsAutoPtr<MetadataTags> aTags)
+                    nsAutoPtr<MetadataTags> aTags,
+                    bool aRestoredFromDromant)
     : mDecoder(aDecoder),
       mInfo(aInfo),
-      mTags(aTags)
+      mTags(aTags),
+      mRestoredFromDromant(aRestoredFromDromant)
   {}
 
   nsRefPtr<AbstractMediaDecoder> mDecoder;
   nsAutoPtr<MediaInfo>  mInfo;
   nsAutoPtr<MetadataTags> mTags;
+  bool mRestoredFromDromant;
 };
 
 class MetadataEventRunner : public nsRunnable, private MetadataContainer
 {
 public:
   MetadataEventRunner(AbstractMediaDecoder* aDecoder,
                       nsAutoPtr<MediaInfo> aInfo,
-                      nsAutoPtr<MetadataTags> aTags)
-    : MetadataContainer(aDecoder, aInfo, aTags)
+                      nsAutoPtr<MetadataTags> aTags,
+                      bool aRestoredFromDromant = false)
+    : MetadataContainer(aDecoder, aInfo, aTags, aRestoredFromDromant)
   {}
 
   NS_IMETHOD Run() MOZ_OVERRIDE
   {
-    mDecoder->MetadataLoaded(mInfo, mTags);
+    mDecoder->MetadataLoaded(mInfo, mTags, mRestoredFromDromant);
     return NS_OK;
   }
 };
 
 class FirstFrameLoadedEventRunner : public nsRunnable, private MetadataContainer
 {
 public:
   FirstFrameLoadedEventRunner(AbstractMediaDecoder* aDecoder,
-                              nsAutoPtr<MediaInfo> aInfo)
-    : MetadataContainer(aDecoder, aInfo, nsAutoPtr<MetadataTags>(nullptr))
+                              nsAutoPtr<MediaInfo> aInfo,
+                              bool aRestoredFromDromant = false)
+    : MetadataContainer(aDecoder, aInfo, nsAutoPtr<MetadataTags>(nullptr), aRestoredFromDromant)
   {}
 
   NS_IMETHOD Run() MOZ_OVERRIDE
   {
-    mDecoder->FirstFrameLoaded(mInfo);
+    mDecoder->FirstFrameLoaded(mInfo, mRestoredFromDromant);
     return NS_OK;
   }
 };
 
 class MetadataUpdatedEventRunner : public nsRunnable, private MetadataContainer
 {
 public:
   MetadataUpdatedEventRunner(AbstractMediaDecoder* aDecoder,
                              nsAutoPtr<MediaInfo> aInfo,
-                             nsAutoPtr<MetadataTags> aTags)
-    : MetadataContainer(aDecoder, aInfo, aTags)
+                             nsAutoPtr<MetadataTags> aTags,
+                             bool aRestoredFromDromant = false)
+    : MetadataContainer(aDecoder, aInfo, aTags, aRestoredFromDromant)
   {}
 
   NS_IMETHOD Run() MOZ_OVERRIDE
   {
     nsAutoPtr<MediaInfo> info(new MediaInfo());
     *info = *mInfo;
-    mDecoder->MetadataLoaded(info, mTags);
-    mDecoder->FirstFrameLoaded(mInfo);
+    mDecoder->MetadataLoaded(info, mTags, mRestoredFromDromant);
+    mDecoder->FirstFrameLoaded(mInfo, mRestoredFromDromant);
     return NS_OK;
   }
 };
 
 class RemoveMediaTracksEventRunner : public nsRunnable
 {
 public:
   explicit RemoveMediaTracksEventRunner(AbstractMediaDecoder* aDecoder)
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -126,17 +126,16 @@ void MediaDecoder::SetDormantIfNecessary
   if (!mDecoderStateMachine ||
       !mDecoderStateMachine->IsDormantNeeded() ||
       mPlayState == PLAY_STATE_SHUTDOWN) {
     return;
   }
 
   if(aDormant) {
     // enter dormant state
-    DestroyDecodedStream();
     mDecoderStateMachine->SetDormant(true);
 
     int64_t timeUsecs = 0;
     SecondsToUsecs(mCurrentTime, timeUsecs);
     mRequestedSeekTarget = SeekTarget(timeUsecs, SeekTarget::Accurate);
 
     mNextState = mPlayState;
     ChangeState(PLAY_STATE_LOADING);
@@ -628,20 +627,18 @@ nsresult MediaDecoder::Seek(double aTime
 
   int64_t timeUsecs = 0;
   nsresult rv = SecondsToUsecs(aTime, timeUsecs);
   NS_ENSURE_SUCCESS(rv, rv);
 
   mRequestedSeekTarget = SeekTarget(timeUsecs, aSeekType);
   mCurrentTime = aTime;
 
-  // If we are already in the seeking state, then setting mRequestedSeekTarget
-  // above will result in the new seek occurring when the current seek
-  // completes.
-  if (mPlayState != PLAY_STATE_LOADING && mPlayState != PLAY_STATE_SEEKING) {
+  // If we are already in the seeking state, the new seek overrides the old one.
+  if (mPlayState != PLAY_STATE_LOADING) {
     bool paused = false;
     if (mOwner) {
       paused = mOwner->GetPaused();
     }
     mNextState = paused ? PLAY_STATE_PAUSED : PLAY_STATE_PLAYING;
     PinForSeek();
     ChangeState(PLAY_STATE_SEEKING);
   }
@@ -692,17 +689,18 @@ MediaDecoder::IsExpectingMoreData()
     return false;
   }
 
   // Otherwise, we should be getting data unless the stream is suspended.
   return !mResource->IsSuspended();
 }
 
 void MediaDecoder::MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
-                                  nsAutoPtr<MetadataTags> aTags)
+                                  nsAutoPtr<MetadataTags> aTags,
+                                  bool aRestoredFromDromant)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (mShuttingDown) {
     return;
   }
 
   DECODER_LOG("MetadataLoaded, channels=%u rate=%u hasAudio=%d hasVideo=%d",
@@ -722,37 +720,42 @@ void MediaDecoder::MetadataLoaded(nsAuto
 
   mInfo = aInfo.forget();
   ConstructMediaTracks();
 
   if (mOwner) {
     // Make sure the element and the frame (if any) are told about
     // our new size.
     Invalidate();
-    mOwner->MetadataLoaded(mInfo, nsAutoPtr<const MetadataTags>(aTags.forget()));
+    if (!aRestoredFromDromant) {
+      mOwner->MetadataLoaded(mInfo, nsAutoPtr<const MetadataTags>(aTags.forget()));
+    }
   }
 }
 
-void MediaDecoder::FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo)
+void MediaDecoder::FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo,
+                                    bool aRestoredFromDromant)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (mShuttingDown) {
     return;
   }
 
   DECODER_LOG("FirstFrameLoaded, channels=%u rate=%u hasAudio=%d hasVideo=%d",
               aInfo->mAudio.mChannels, aInfo->mAudio.mRate,
               aInfo->HasAudio(), aInfo->HasVideo());
 
   mInfo = aInfo.forget();
 
   if (mOwner) {
     Invalidate();
-    mOwner->FirstFrameLoaded();
+    if (!aRestoredFromDromant) {
+      mOwner->FirstFrameLoaded();
+    }
   }
 
   // This can run cache callbacks.
   mResource->EnsureCacheUpToDate();
 
   // The element can run javascript via events
   // before reaching here, so only change the
   // state if we're still set to the original
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -770,21 +770,23 @@ public:
 
   // May be called by the reader to notify this decoder that the metadata from
   // the media file has been read. Call on the decode thread only.
   void OnReadMetadataCompleted() MOZ_OVERRIDE { }
 
   // Called when the metadata from the media file has been loaded by the
   // state machine. Call on the main thread only.
   virtual void MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
-                              nsAutoPtr<MetadataTags> aTags) MOZ_OVERRIDE;
+                              nsAutoPtr<MetadataTags> aTags,
+                              bool aRestoredFromDromant) MOZ_OVERRIDE;
 
   // Called when the first audio and/or video from the media file has been loaded
   // by the state machine. Call on the main thread only.
-  virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo) MOZ_OVERRIDE;
+  virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo,
+                                bool aRestoredFromDromant) MOZ_OVERRIDE;
 
   // Called from MetadataLoaded(). Creates audio tracks and adds them to its
   // owner's audio track list, and implies to video tracks respectively.
   // Call on the main thread only.
   void ConstructMediaTracks();
 
   // Removes all audio tracks and video tracks that are previously added into
   // the track list. Call on the main thread only.
--- a/dom/media/MediaDecoderReader.h
+++ b/dom/media/MediaDecoderReader.h
@@ -145,22 +145,30 @@ public:
   // Returns NS_OK on success, or NS_ERROR_FAILURE on failure.
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags) = 0;
 
   // Fills aInfo with the latest cached data required to present the media,
   // ReadUpdatedMetadata will always be called once ReadMetadata has succeeded.
   virtual void ReadUpdatedMetadata(MediaInfo* aInfo) { };
 
-  // Moves the decode head to aTime microseconds. aStartTime and aEndTime
-  // denote the start and end times of the media in usecs, and aCurrentTime
-  // is the current playback position in microseconds.
+  // Moves the decode head to aTime microseconds. aEndTime denotes the end
+  // time of the media in usecs. This is only needed for OggReader, and should
+  // probably be removed somehow.
   virtual nsRefPtr<SeekPromise>
-  Seek(int64_t aTime, int64_t aStartTime,
-       int64_t aEndTime, int64_t aCurrentTime) = 0;
+  Seek(int64_t aTime, int64_t aEndTime) = 0;
+
+  // Cancels an ongoing seek, if any. Any previously-requested seek is
+  // guaranteeed to be resolved or rejected in finite time, though no
+  // guarantees are made about precise nature of the resolve/reject, since the
+  // promise might have already dispatched a resolution or an error code before
+  // the cancel arrived.
+  //
+  // Must be called on the decode task queue.
+  virtual void CancelSeek() { };
 
   // Called to move the reader into idle state. When the reader is
   // created it is assumed to be active (i.e. not idle). When the media
   // element is paused and we don't need to decode any more data, the state
   // machine calls SetIdle() to inform the reader that its decoder won't be
   // needed for a while. The reader can use these notifications to enter
   // a low power state when the decoder isn't needed, if desired.
   // This is most useful on mobile.
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -183,16 +183,17 @@ MediaDecoderStateMachine::MediaDecoderSt
       aDecoder->GetReentrantMonitor(),
       &MediaDecoderStateMachine::TimeoutExpired, this, aRealTime)),
   mState(DECODER_STATE_DECODING_NONE),
   mSyncPointInMediaStream(-1),
   mSyncPointInDecodedStream(-1),
   mPlayDuration(0),
   mStartTime(-1),
   mEndTime(-1),
+  mDurationSet(false),
   mFragmentEndTime(-1),
   mReader(aReader),
   mCurrentFrameTime(0),
   mAudioStartTime(-1),
   mAudioEndTime(-1),
   mDecodedAudioEndTime(-1),
   mVideoFrameEndTime(-1),
   mDecodedVideoEndTime(-1),
@@ -214,20 +215,22 @@ MediaDecoderStateMachine::MediaDecoderSt
   mStopAudioThread(true),
   mQuickBuffering(false),
   mMinimizePreroll(false),
   mDecodeThreadWaiting(false),
   mDropAudioUntilNextDiscontinuity(false),
   mDropVideoUntilNextDiscontinuity(false),
   mDecodeToSeekTarget(false),
   mWaitingForDecoderSeek(false),
+  mCancelingSeek(false),
   mCurrentTimeBeforeSeek(0),
   mLastFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED),
-  mDecodingFrozenAtStateMetadata(false),
-  mDecodingFrozenAtStateDecoding(false)
+  mDecodingFrozenAtStateDecoding(false),
+  mSentLoadedMetadataEvent(false),
+  mSentFirstFrameLoadedEvent(false)
 {
   MOZ_COUNT_CTOR(MediaDecoderStateMachine);
   NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
 
   mAmpleVideoFrames =
     std::max<uint32_t>(Preferences::GetUint("media.video-queue.default-size", 10), 3);
 
   mBufferingWait = IsRealTime() ? 0 : 30;
@@ -1403,30 +1406,46 @@ int64_t MediaDecoderStateMachine::GetDur
 {
   AssertCurrentThreadInMonitor();
 
   if (mEndTime == -1 || mStartTime == -1)
     return -1;
   return mEndTime - mStartTime;
 }
 
+int64_t MediaDecoderStateMachine::GetEndTime()
+{
+  if (mEndTime == -1 && mDurationSet) {
+    return INT64_MAX;
+  }
+  return mEndTime;
+}
+
 void MediaDecoderStateMachine::SetDuration(int64_t aDuration)
 {
   NS_ASSERTION(NS_IsMainThread() || OnDecodeThread(),
                "Should be on main or decode thread.");
   AssertCurrentThreadInMonitor();
 
   if (aDuration == -1) {
+    mDurationSet = false;
     return;
   }
 
+  mDurationSet = true;
+
   if (mStartTime == -1) {
     SetStartTime(0);
   }
 
+  if (aDuration == INT64_MAX) {
+    mEndTime = -1;
+    return;
+  }
+
   mEndTime = mStartTime + aDuration;
 }
 
 void MediaDecoderStateMachine::UpdateEstimatedDuration(int64_t aDuration)
 {
   AssertCurrentThreadInMonitor();
   int64_t duration = GetDuration();
   if (aDuration != duration &&
@@ -1476,19 +1495,19 @@ void MediaDecoderStateMachine::SetDorman
       } else if (mCurrentSeekTarget.IsValid()) {
         mQueuedSeekTarget = mCurrentSeekTarget;
       }
     }
     mSeekTarget.Reset();
     mCurrentSeekTarget.Reset();
     ScheduleStateMachine();
     SetState(DECODER_STATE_DORMANT);
+    StopPlayback();
     mDecoder->GetReentrantMonitor().NotifyAll();
   } else if ((aDormant != true) && (mState == DECODER_STATE_DORMANT)) {
-    mDecodingFrozenAtStateMetadata = true;
     mDecodingFrozenAtStateDecoding = true;
     ScheduleStateMachine();
     mCurrentFrameTime = 0;
     SetState(DECODER_STATE_DECODING_NONE);
     mDecoder->GetReentrantMonitor().NotifyAll();
   }
 }
 
@@ -1680,20 +1699,16 @@ void MediaDecoderStateMachine::Seek(cons
 
   // We need to be able to seek both at a transport level and at a media level
   // to seek.
   if (!mDecoder->IsMediaSeekable()) {
     DECODER_WARN("Seek() function should not be called on a non-seekable state machine");
     return;
   }
 
-  // MediaDecoder::mPlayState should be SEEKING while we seek, and
-  // in that case MediaDecoder shouldn't be calling us.
-  NS_ASSERTION(mState != DECODER_STATE_SEEKING,
-               "We shouldn't already be seeking");
   NS_ASSERTION(mState > DECODER_STATE_DECODING_METADATA,
                "We should have got duration already");
 
   if (mState < DECODER_STATE_DECODING) {
     DECODER_LOG("Seek() Not Enough Data to continue at this stage, queuing seek");
     mQueuedSeekTarget = aTarget;
     return;
   }
@@ -1730,22 +1745,23 @@ MediaDecoderStateMachine::StartSeek(cons
 
   MOZ_ASSERT(mState >= DECODER_STATE_DECODING);
 
   if (mState == DECODER_STATE_SHUTDOWN) {
     return;
   }
 
   // Bound the seek time to be inside the media range.
+  int64_t end = GetEndTime();
   NS_ASSERTION(mStartTime != -1, "Should know start time by now");
-  NS_ASSERTION(mEndTime != -1, "Should know end time by now");
+  NS_ASSERTION(end != -1, "Should know end time by now");
   int64_t seekTime = aTarget.mTime + mStartTime;
-  seekTime = std::min(seekTime, mEndTime);
+  seekTime = std::min(seekTime, end);
   seekTime = std::max(mStartTime, seekTime);
-  NS_ASSERTION(seekTime >= mStartTime && seekTime <= mEndTime,
+  NS_ASSERTION(seekTime >= mStartTime && seekTime <= end,
                "Can only seek in range [0,duration]");
   mSeekTarget = SeekTarget(seekTime, aTarget.mType);
 
   DECODER_LOG("Changed state to SEEKING (to %lld)", mSeekTarget.mTime);
   SetState(DECODER_STATE_SEEKING);
   mDecoder->RecreateDecodedStreamIfNecessary(seekTime - mStartTime);
   ScheduleStateMachine();
 }
@@ -1891,34 +1907,24 @@ MediaDecoderStateMachine::DispatchDecode
 
 nsresult
 MediaDecoderStateMachine::EnqueueDecodeSeekTask()
 {
   NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(),
                "Should be on state machine or decode thread.");
   AssertCurrentThreadInMonitor();
 
-  if (mState != DECODER_STATE_SEEKING ||
-      !mSeekTarget.IsValid() ||
-      mCurrentSeekTarget.IsValid()) {
-    return NS_OK;
-  }
-  mCurrentSeekTarget = mSeekTarget;
-  mSeekTarget.Reset();
-  mDropAudioUntilNextDiscontinuity = HasAudio();
-  mDropVideoUntilNextDiscontinuity = HasVideo();
-
   RefPtr<nsIRunnable> task(
     NS_NewRunnableMethod(this, &MediaDecoderStateMachine::DecodeSeek));
   nsresult rv = DecodeTaskQueue()->Dispatch(task);
   if (NS_FAILED(rv)) {
     DECODER_WARN("Dispatch DecodeSeek task failed.");
-    mCurrentSeekTarget.Reset();
     DecodeError();
   }
+
   return rv;
 }
 
 nsresult
 MediaDecoderStateMachine::DispatchAudioDecodeTaskIfNeeded()
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(),
@@ -2183,17 +2189,17 @@ nsresult MediaDecoderStateMachine::Decod
 
   mInfo = info;
 
   if (NS_FAILED(res) || (!info.HasValidMedia())) {
     DECODER_WARN("ReadMetadata failed, res=%x HasValidMedia=%d", res, info.HasValidMedia());
     return NS_ERROR_FAILURE;
   }
   mDecoder->StartProgressUpdates();
-  mGotDurationFromMetaData = (GetDuration() != -1);
+  mGotDurationFromMetaData = (GetDuration() != -1) || mDurationSet;
 
   if (mGotDurationFromMetaData) {
     // We have all the information required: duration and size
     // Inform the element that we've loaded the metadata.
     EnqueueLoadedMetadataEvent();
   }
 
   if (mState == DECODER_STATE_DECODING_METADATA) {
@@ -2209,18 +2215,30 @@ nsresult MediaDecoderStateMachine::Decod
 }
 
 void
 MediaDecoderStateMachine::EnqueueLoadedMetadataEvent()
 {
   nsAutoPtr<MediaInfo> info(new MediaInfo());
   *info = mInfo;
   nsCOMPtr<nsIRunnable> metadataLoadedEvent =
-    new MetadataEventRunner(mDecoder, info, mMetadataTags);
+    new MetadataEventRunner(mDecoder, info, mMetadataTags, mSentLoadedMetadataEvent);
   NS_DispatchToMainThread(metadataLoadedEvent, NS_DISPATCH_NORMAL);
+  mSentLoadedMetadataEvent = true;
+}
+
+void
+MediaDecoderStateMachine::EnqueueFirstFrameLoadedEvent()
+{
+  nsAutoPtr<MediaInfo> info(new MediaInfo());
+  *info = mInfo;
+  nsCOMPtr<nsIRunnable> event =
+    new FirstFrameLoadedEventRunner(mDecoder, info, mSentFirstFrameLoadedEvent);
+  NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
+  mSentFirstFrameLoadedEvent = true;
 }
 
 void
 MediaDecoderStateMachine::CallDecodeFirstFrame()
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   if (mState != DECODER_STATE_DECODING_FIRSTFRAME) {
     return;
@@ -2249,17 +2267,20 @@ MediaDecoderStateMachine::DecodeFirstFra
       NS_NewRunnableMethod(this, &MediaDecoderStateMachine::DispatchVideoDecodeTaskIfNeeded));
     VideoQueue().AddPopListener(decodeTask, DecodeTaskQueue());
   }
 
   if (IsRealTime()) {
     SetStartTime(0);
     nsresult res = FinishDecodeFirstFrame();
     NS_ENSURE_SUCCESS(res, res);
-  } else if (mDecodingFrozenAtStateMetadata) {
+  } else if (mSentFirstFrameLoadedEvent) {
+    // We're resuming from dormant state, so we don't need to request
+    // the first samples in order to determine the media start time,
+    // we have the start time from last time we loaded.
     SetStartTime(mStartTime);
     nsresult res = FinishDecodeFirstFrame();
     NS_ENSURE_SUCCESS(res, res);
   } else {
     if (HasAudio()) {
       ReentrantMonitorAutoExit unlock(mDecoder->GetReentrantMonitor());
       mReader->RequestAudioData()->Then(DecodeTaskQueue(), __func__, this,
                                         &MediaDecoderStateMachine::OnAudioDecoded,
@@ -2284,71 +2305,60 @@ MediaDecoderStateMachine::FinishDecodeFi
   AssertCurrentThreadInMonitor();
   NS_ASSERTION(OnDecodeThread(), "Should be on decode thread.");
   DECODER_LOG("FinishDecodeFirstFrame");
 
   if (mState == DECODER_STATE_SHUTDOWN) {
     return NS_ERROR_FAILURE;
   }
 
-  if (!IsRealTime() && !mDecodingFrozenAtStateMetadata) {
+  if (!IsRealTime() && !mSentFirstFrameLoadedEvent) {
     const VideoData* v = VideoQueue().PeekFront();
     const AudioData* a = AudioQueue().PeekFront();
     SetStartTime(mReader->ComputeStartTime(v, a));
     if (VideoQueue().GetSize()) {
       ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
       RenderVideoFrame(VideoQueue().PeekFront(), TimeStamp::Now());
     }
   }
 
   NS_ASSERTION(mStartTime != -1, "Must have start time");
-  MOZ_ASSERT((!HasVideo() && !HasAudio()) ||
-               !(mDecoder->IsMediaSeekable() && mDecoder->IsTransportSeekable()) ||
-               mEndTime != -1,
-             "Active seekable media should have end time");
   MOZ_ASSERT(!(mDecoder->IsMediaSeekable() && mDecoder->IsTransportSeekable()) ||
-               GetDuration() != -1,
+               (GetDuration() != -1) || mDurationSet,
              "Seekable media should have duration");
   DECODER_LOG("Media goes from %lld to %lld (duration %lld) "
               "transportSeekable=%d, mediaSeekable=%d",
               mStartTime, mEndTime, GetDuration(),
               mDecoder->IsTransportSeekable(), mDecoder->IsMediaSeekable());
 
-  mDecodingFrozenAtStateMetadata = false;
-
   if (HasAudio() && !HasVideo()) {
     // We're playing audio only. We don't need to worry about slow video
     // decodes causing audio underruns, so don't buffer so much audio in
     // order to reduce memory usage.
     mAmpleAudioThresholdUsecs /= NO_VIDEO_AMPLE_AUDIO_DIVISOR;
     mLowAudioThresholdUsecs /= NO_VIDEO_AMPLE_AUDIO_DIVISOR;
   }
 
   // Get potentially updated metadata
   {
     ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
     mReader->ReadUpdatedMetadata(&mInfo);
   }
 
   nsAutoPtr<MediaInfo> info(new MediaInfo());
   *info = mInfo;
-  nsCOMPtr<nsIRunnable> event;
   if (!mGotDurationFromMetaData) {
     // We now have a duration, we can fire the LoadedMetadata and
     // FirstFrame event.
-    event =
-      new MetadataUpdatedEventRunner(mDecoder,
-                                     info,
-                                     mMetadataTags);
+    EnqueueLoadedMetadataEvent();
+    EnqueueFirstFrameLoadedEvent();
   } else {
     // Inform the element that we've loaded the first frame.
-    event =
-      new FirstFrameLoadedEventRunner(mDecoder, info);
+    EnqueueFirstFrameLoadedEvent();
   }
-  NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
 
   if (mState == DECODER_STATE_DECODING_FIRSTFRAME) {
     StartDecoding();
   }
 
   // For very short media the first frame decode can decode the entire media.
   // So we need to check if this has occurred, else our decode pipeline won't
   // run (since it doesn't need to) and we won't detect end of stream.
@@ -2361,20 +2371,45 @@ MediaDecoderStateMachine::FinishDecodeFi
 
   return NS_OK;
 }
 
 void MediaDecoderStateMachine::DecodeSeek()
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   NS_ASSERTION(OnDecodeThread(), "Should be on decode thread.");
-  if (mState != DECODER_STATE_SEEKING) {
+
+  if (mState != DECODER_STATE_SEEKING ||
+      !mSeekTarget.IsValid()) {
+    DECODER_LOG("Early returning from DecodeSeek");
     return;
   }
 
+  // If there's already an existing seek in progress, we need to handle that.
+  if (mCurrentSeekTarget.IsValid()) {
+    // There are 3 states we might be in, listed in the order that they occur:
+    //   (1) Waiting for the seek to be resolved.
+    //   (2) Waiting for the seek to be resolved, having already issued a cancel.
+    //   (3) After seek resolution, waiting for SeekComplete to run.
+    //
+    // If we're in the first state, we move to the second. Otherwise, we just wait
+    // for things to sort themselves out.
+    if (mWaitingForDecoderSeek && !mCancelingSeek) {
+      mReader->CancelSeek();
+      mCancelingSeek = true;
+    }
+
+    return;
+  }
+
+  mCurrentSeekTarget = mSeekTarget;
+  mSeekTarget.Reset();
+  mDropAudioUntilNextDiscontinuity = HasAudio();
+  mDropVideoUntilNextDiscontinuity = HasVideo();
+
   // During the seek, don't have a lock on the decoder state,
   // otherwise long seek operations can block the main thread.
   // The events dispatched to the main thread are SYNC calls.
   // These calls are made outside of the decode monitor lock so
   // it is safe for the main thread to makes calls that acquire
   // the lock since it won't deadlock. We check the state when
   // acquiring the lock again in case shutdown has occurred
   // during the time when we didn't have the lock.
@@ -2424,17 +2459,17 @@ void MediaDecoderStateMachine::DecodeSee
 
     nsresult res;
     {
       ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
       // We must not hold the state machine monitor while we call into
       // the reader, since it could do I/O or deadlock some other way.
       res = mReader->ResetDecode();
       if (NS_SUCCEEDED(res)) {
-        mReader->Seek(seekTime, mStartTime, mEndTime, mCurrentTimeBeforeSeek)
+        mReader->Seek(seekTime, GetEndTime())
                ->Then(DecodeTaskQueue(), __func__, this,
                       &MediaDecoderStateMachine::OnSeekCompleted,
                       &MediaDecoderStateMachine::OnSeekFailed);
       }
     }
     if (NS_FAILED(res)) {
       DecodeError();
       return;
@@ -2443,33 +2478,43 @@ void MediaDecoderStateMachine::DecodeSee
   }
 }
 
 void
 MediaDecoderStateMachine::OnSeekCompleted(int64_t aTime)
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   mWaitingForDecoderSeek = false;
+  mCancelingSeek = false;
 
   // We must decode the first samples of active streams, so we can determine
   // the new stream time. So dispatch tasks to do that.
   mDecodeToSeekTarget = true;
   DispatchDecodeTasksIfNeeded();
 }
 
 void
 MediaDecoderStateMachine::OnSeekFailed(nsresult aResult)
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+  bool wasCanceled = mCancelingSeek;
   mWaitingForDecoderSeek = false;
-  // Sometimes we reject the promise for non-failure reasons, like
-  // when we request a second seek before the previous one has
-  // completed.
+  mCancelingSeek = false;
+
   if (NS_FAILED(aResult)) {
     DecodeError();
+  } else if (wasCanceled && mSeekTarget.IsValid() && mState == DECODER_STATE_SEEKING) {
+    // Try again.
+    mCurrentSeekTarget = mSeekTarget;
+    mSeekTarget.Reset();
+    mReader->Seek(mCurrentSeekTarget.mTime, mEndTime)
+           ->Then(DecodeTaskQueue(), __func__, this,
+                  &MediaDecoderStateMachine::OnSeekCompleted,
+                  &MediaDecoderStateMachine::OnSeekFailed);
+    mWaitingForDecoderSeek = true;
   }
 }
 
 void
 MediaDecoderStateMachine::SeekCompleted()
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
 
@@ -2522,17 +2567,22 @@ MediaDecoderStateMachine::SeekCompleted(
   }
 
   // Change state to DECODING or COMPLETED now. SeekingStopped will
   // call MediaDecoderStateMachine::Seek to reset our state to SEEKING
   // if we need to seek again.
 
   nsCOMPtr<nsIRunnable> stopEvent;
   bool isLiveStream = mDecoder->GetResource()->GetLength() == -1;
-  if (GetMediaTime() == mEndTime && !isLiveStream) {
+  if (mSeekTarget.IsValid()) {
+    // A new seek target came in while we were processing the old one. No rest
+    // for the seeking.
+    DECODER_LOG("A new seek came along while we were finishing the old one - staying in SEEKING");
+    SetState(DECODER_STATE_SEEKING);
+  } else if (GetMediaTime() == mEndTime && !isLiveStream) {
     // Seeked to end of media, move to COMPLETED state. Note we don't do
     // this if we're playing a live stream, since the end of media will advance
     // once we download more data!
     DECODER_LOG("Changed state from SEEKING (to %lld) to COMPLETED", seekTime);
     stopEvent = NS_NewRunnableMethod(mDecoder, &MediaDecoder::SeekingStoppedAtEnd);
     // Explicitly set our state so we don't decode further, and so
     // we report playback ended to the media element.
     SetState(DECODER_STATE_COMPLETED);
@@ -3239,17 +3289,17 @@ MediaDecoderStateMachine::DropAudioUpToS
 
 void MediaDecoderStateMachine::SetStartTime(int64_t aStartTimeUsecs)
 {
   AssertCurrentThreadInMonitor();
   DECODER_LOG("SetStartTime(%lld)", aStartTimeUsecs);
   mStartTime = 0;
   if (aStartTimeUsecs != 0) {
     mStartTime = aStartTimeUsecs;
-    if (mGotDurationFromMetaData) {
+    if (mGotDurationFromMetaData && GetEndTime() != INT64_MAX) {
       NS_ASSERTION(mEndTime != -1,
                    "We should have mEndTime as supplied duration here");
       // We were specified a duration from a Content-Duration HTTP header.
       // Adjust mEndTime so that mEndTime-mStartTime matches the specified
       // duration.
       mEndTime = mStartTime + mEndTime;
     }
   }
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -166,21 +166,28 @@ public:
   void FinishShutdown();
 
   bool IsRealTime() const;
 
   // Called from the main thread to get the duration. The decoder monitor
   // must be obtained before calling this. It is in units of microseconds.
   int64_t GetDuration();
 
+  // Time of the last frame in the media, in microseconds or INT64_MAX if
+  // media has an infinite duration.
+  // Accessed on state machine, decode, and main threads.
+  // Access controlled by decoder monitor.
+  int64_t GetEndTime();
+
   // Called from the main thread to set the duration of the media resource
   // if it is able to be obtained via HTTP headers. Called from the
   // state machine thread to set the duration if it is obtained from the
   // media metadata. The decoder monitor must be obtained before calling this.
   // aDuration is in microseconds.
+  // A value of INT64_MAX will be treated as infinity.
   void SetDuration(int64_t aDuration);
 
   // Called while decoding metadata to set the end time of the media
   // resource. The decoder monitor must be obtained before calling this.
   // aEndTime is in microseconds.
   void SetMediaEndTime(int64_t aEndTime);
 
   // Called from main thread to update the duration with an estimated value.
@@ -616,16 +623,18 @@ protected:
   // The decoder monitor must be held.
   nsresult EnqueueDecodeMetadataTask();
 
   // Dispatches a LoadedMetadataEvent.
   // This is threadsafe and can be called on any thread.
   // The decoder monitor must be held.
   void EnqueueLoadedMetadataEvent();
 
+  void EnqueueFirstFrameLoadedEvent();
+
   // Dispatches a task to the decode task queue to begin decoding content.
   // This is threadsafe and can be called on any thread.
   // The decoder monitor must be held.
   nsresult EnqueueDecodeFirstFrameTask();
 
   // Dispatches a task to the decode task queue to seek the decoder.
   // The decoder monitor must be held.
   nsresult EnqueueDecodeSeekTask();
@@ -827,18 +836,24 @@ protected:
   // time of the first frame decoded from the media, and is used to calculate
   // duration and as a bounds for seeking. Accessed on state machine, decode,
   // and main threads. Access controlled by decoder monitor.
   int64_t mStartTime;
 
   // Time of the last frame in the media, in microseconds. This is the
   // end time of the last frame in the media. Accessed on state
   // machine, decode, and main threads. Access controlled by decoder monitor.
+  // It will be set to -1 if the duration is infinite
   int64_t mEndTime;
 
+  // Will be set when SetDuration has been called with a value != -1
+  // mDurationSet false doesn't indicate that we do not have a valid duration
+  // as mStartTime and mEndTime could have been set separately.
+  bool mDurationSet;
+
   // Position to seek to in microseconds when the seek state transition occurs.
   // The decoder monitor lock must be obtained before reading or writing
   // this value. Accessed on main and decode thread.
   SeekTarget mSeekTarget;
 
   // Position to seek to in microseconds when DecodeFirstFrame completes.
   // The decoder monitor lock must be obtained before reading or writing
   // this value. Accessed on main and decode thread.
@@ -1092,35 +1107,42 @@ protected:
   // mCurrentSeekTarget.
   bool mDecodeToSeekTarget;
 
   // True if we've issued Seek() to the reader, but haven't yet received
   // OnSeekCompleted. We should avoid trying to decode more audio/video
   // until this completes.
   bool mWaitingForDecoderSeek;
 
+  // True if we're in the process of canceling a seek. This allows us to avoid
+  // invoking CancelSeek() multiple times.
+  bool mCancelingSeek;
+
   // We record the playback position before we seek in order to
   // determine where the seek terminated relative to the playback position
   // we were at before the seek.
   int64_t mCurrentTimeBeforeSeek;
 
   // Stores presentation info required for playback. The decoder monitor
   // must be held when accessing this.
   MediaInfo mInfo;
 
   mozilla::MediaMetadataManager mMetadataManager;
 
   MediaDecoderOwner::NextFrameStatus mLastFrameStatus;
 
-  // True if we are back from DECODER_STATE_DORMANT state, and we can skip
+  // mDecodingFrozenAtStateDecoding: turn on/off at
+  //                                 SetDormant/Seek,Play.
+  bool mDecodingFrozenAtStateDecoding;
+
+  // True if we are back from DECODER_STATE_DORMANT state and
+  // LoadedMetadataEvent was already sent.
+  bool mSentLoadedMetadataEvent;
+  // True if we are back from DECODER_STATE_DORMANT state and
+  // FirstFrameLoadedEvent was already sent, then we can skip
   // SetStartTime because the mStartTime already set before. Also we don't need
   // to decode any audio/video since the MediaDecoder will trigger a seek
   // operation soon.
-  // mDecodingFrozenAtStateMetadata: turn on/off at
-  //                                 SetDormant/FinishDecodeMetadata.
-  // mDecodingFrozenAtStateDecoding: turn on/off at
-  //                                 SetDormant/Seek,Play.
-  bool mDecodingFrozenAtStateMetadata;
-  bool mDecodingFrozenAtStateDecoding;
+  bool mSentFirstFrameLoadedEvent;
 };
 
 } // namespace mozilla;
 #endif
--- a/dom/media/android/AndroidMediaReader.cpp
+++ b/dom/media/android/AndroidMediaReader.cpp
@@ -315,17 +315,17 @@ bool AndroidMediaReader::DecodeAudioData
                               frames,
                               source.mAudioChannels,
                               MPCopy(static_cast<uint8_t *>(source.mData),
                                      source.mSize,
                                      source.mAudioChannels));
 }
 
 nsRefPtr<MediaDecoderReader::SeekPromise>
-AndroidMediaReader::Seek(int64_t aTarget, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime)
+AndroidMediaReader::Seek(int64_t aTarget, int64_t aEndTime)
 {
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
 
   if (mHasAudio && mHasVideo) {
     // The decoder seeks/demuxes audio and video streams separately. So if
     // we seek both audio and video to aTarget, the audio stream can typically
     // seek closer to the seek target, since typically every audio block is
     // a sync point, whereas for video there are only keyframes once every few
--- a/dom/media/android/AndroidMediaReader.h
+++ b/dom/media/android/AndroidMediaReader.h
@@ -65,17 +65,17 @@ public:
   {
     // not used
     return true;
   }
 
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags);
   virtual nsRefPtr<SeekPromise>
-  Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) MOZ_OVERRIDE;
+  Seek(int64_t aTime, int64_t aEndTime) MOZ_OVERRIDE;
 
   virtual nsRefPtr<ShutdownPromise> Shutdown() MOZ_OVERRIDE;
 
   class ImageBufferCallback : public MPAPI::BufferCallback {
     typedef mozilla::layers::Image Image;
 
   public:
     ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer);
--- a/dom/media/apple/AppleMP3Reader.cpp
+++ b/dom/media/apple/AppleMP3Reader.cpp
@@ -488,24 +488,19 @@ AppleMP3Reader::SetupDecoder()
     LOGE("Error constructing audio format converter: %x\n", rv);
     mAudioConverter = nullptr;
     return;
   }
 }
 
 
 nsRefPtr<MediaDecoderReader::SeekPromise>
-AppleMP3Reader::Seek(int64_t aTime,
-                     int64_t aStartTime,
-                     int64_t aEndTime,
-                     int64_t aCurrentTime)
+AppleMP3Reader::Seek(int64_t aTime, int64_t aEndTime)
 {
   MOZ_ASSERT(mDecoder->OnDecodeThread(), "Should be on decode thread");
-  NS_ASSERTION(aStartTime < aEndTime,
-               "Seeking should happen over a positive range");
 
   // Find the exact frame/packet that contains |aTime|.
   mCurrentAudioFrame = aTime * mAudioSampleRate / USECS_PER_S;
   SInt64 packet = mCurrentAudioFrame / mAudioFramesPerCompressedPacket;
 
   // |AudioFileStreamSeek| will pass back through |byteOffset| the byte offset
   // into the stream it expects next time it reads.
   SInt64 byteOffset;
--- a/dom/media/apple/AppleMP3Reader.h
+++ b/dom/media/apple/AppleMP3Reader.h
@@ -29,20 +29,17 @@ public:
 
   virtual bool HasAudio() MOZ_OVERRIDE;
   virtual bool HasVideo() MOZ_OVERRIDE;
 
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags) MOZ_OVERRIDE;
 
   virtual nsRefPtr<SeekPromise>
-  Seek(int64_t aTime,
-       int64_t aStartTime,
-       int64_t aEndTime,
-       int64_t aCurrentTime) MOZ_OVERRIDE;
+  Seek(int64_t aTime, int64_t aEndTime) MOZ_OVERRIDE;
 
   void AudioSampleCallback(UInt32 aNumBytes,
                            UInt32 aNumPackets,
                            const void *aData,
                            AudioStreamPacketDescription *aPackets);
 
   void AudioMetadataCallback(AudioFileStreamID aFileStream,
                              AudioFileStreamPropertyID aPropertyID,
--- a/dom/media/directshow/DirectShowReader.cpp
+++ b/dom/media/directshow/DirectShowReader.cpp
@@ -363,20 +363,17 @@ DirectShowReader::HasAudio()
 bool
 DirectShowReader::HasVideo()
 {
   MOZ_ASSERT(mDecoder->OnDecodeThread(), "Should be on decode thread.");
   return false;
 }
 
 nsRefPtr<MediaDecoderReader::SeekPromise>
-DirectShowReader::Seek(int64_t aTargetUs,
-                       int64_t aStartTime,
-                       int64_t aEndTime,
-                       int64_t aCurrentTime)
+DirectShowReader::Seek(int64_t aTargetUs, int64_t aEndTime)
 {
   nsresult res = SeekInternal(aTargetUs);
   if (NS_FAILED(res)) {
     return SeekPromise::CreateAndReject(res, __func__);
   } else {
     return SeekPromise::CreateAndResolve(aTargetUs, __func__);
   }
 }
--- a/dom/media/directshow/DirectShowReader.h
+++ b/dom/media/directshow/DirectShowReader.h
@@ -56,20 +56,17 @@ public:
 
   bool HasAudio() MOZ_OVERRIDE;
   bool HasVideo() MOZ_OVERRIDE;
 
   nsresult ReadMetadata(MediaInfo* aInfo,
                         MetadataTags** aTags) MOZ_OVERRIDE;
 
   nsRefPtr<SeekPromise>
-  Seek(int64_t aTime,
-       int64_t aStartTime,
-       int64_t aEndTime,
-       int64_t aCurrentTime) MOZ_OVERRIDE;
+  Seek(int64_t aTime, int64_t aEndTime) MOZ_OVERRIDE;
 
   void NotifyDataArrived(const char* aBuffer,
                          uint32_t aLength,
                          int64_t aOffset) MOZ_OVERRIDE;
 
   bool IsMediaSeekable() MOZ_OVERRIDE;
 
 private:
--- a/dom/media/fmp4/MP4Reader.cpp
+++ b/dom/media/fmp4/MP4Reader.cpp
@@ -893,20 +893,17 @@ MP4Reader::SkipVideoDemuxToNextKeyFrame(
     mQueuedVideoSample = compressed;
     break;
   }
 
   return true;
 }
 
 nsRefPtr<MediaDecoderReader::SeekPromise>
-MP4Reader::Seek(int64_t aTime,
-                int64_t aStartTime,
-                int64_t aEndTime,
-                int64_t aCurrentTime)
+MP4Reader::Seek(int64_t aTime, int64_t aEndTime)
 {
   LOG("MP4Reader::Seek(%lld)", aTime);
   MOZ_ASSERT(GetTaskQueue()->IsCurrentThreadIn());
   MonitorAutoLock mon(mDemuxerMonitor);
   if (!mDecoder->GetResource()->IsTransportSeekable() || !mDemuxer->CanSeek()) {
     VLOG("Seek() END (Unseekable)");
     return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
   }
--- a/dom/media/fmp4/MP4Reader.h
+++ b/dom/media/fmp4/MP4Reader.h
@@ -54,20 +54,17 @@ public:
   // not available.
   virtual void PreReadMetadata() MOZ_OVERRIDE;
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags) MOZ_OVERRIDE;
 
   virtual void ReadUpdatedMetadata(MediaInfo* aInfo) MOZ_OVERRIDE;
 
   virtual nsRefPtr<SeekPromise>
-  Seek(int64_t aTime,
-       int64_t aStartTime,
-       int64_t aEndTime,
-       int64_t aCurrentTime) MOZ_OVERRIDE;
+  Seek(int64_t aTime, int64_t aEndTime) MOZ_OVERRIDE;
 
   virtual bool IsMediaSeekable() MOZ_OVERRIDE;
 
   virtual int64_t GetEvictionOffset(double aTime) MOZ_OVERRIDE;
 
   virtual nsresult GetBuffered(dom::TimeRanges* aBuffered) MOZ_OVERRIDE;
 
   // For Media Resource Management
--- a/dom/media/gmp/GMPDecryptorChild.cpp
+++ b/dom/media/gmp/GMPDecryptorChild.cpp
@@ -206,17 +206,17 @@ GMPDecryptorChild::RecvInit()
   mSession->Init(this);
   return true;
 }
 
 bool
 GMPDecryptorChild::RecvCreateSession(const uint32_t& aCreateSessionToken,
                                      const uint32_t& aPromiseId,
                                      const nsCString& aInitDataType,
-                                     const nsTArray<uint8_t>& aInitData,
+                                     InfallibleTArray<uint8_t>&& aInitData,
                                      const GMPSessionType& aSessionType)
 {
   if (!mSession) {
     return false;
   }
 
   mSession->CreateSession(aCreateSessionToken,
                           aPromiseId,
@@ -242,17 +242,17 @@ GMPDecryptorChild::RecvLoadSession(const
                         aSessionId.Length());
 
   return true;
 }
 
 bool
 GMPDecryptorChild::RecvUpdateSession(const uint32_t& aPromiseId,
                                      const nsCString& aSessionId,
-                                     const nsTArray<uint8_t>& aResponse)
+                                     InfallibleTArray<uint8_t>&& aResponse)
 {
   if (!mSession) {
     return false;
   }
 
   mSession->UpdateSession(aPromiseId,
                           aSessionId.get(),
                           aSessionId.Length(),
@@ -289,32 +289,32 @@ GMPDecryptorChild::RecvRemoveSession(con
                           aSessionId.get(),
                           aSessionId.Length());
 
   return true;
 }
 
 bool
 GMPDecryptorChild::RecvSetServerCertificate(const uint32_t& aPromiseId,
-                                            const nsTArray<uint8_t>& aServerCert)
+                                            InfallibleTArray<uint8_t>&& aServerCert)
 {
   if (!mSession) {
     return false;
   }
 
   mSession->SetServerCertificate(aPromiseId,
                                  aServerCert.Elements(),
                                  aServerCert.Length());
 
   return true;
 }
 
 bool
 GMPDecryptorChild::RecvDecrypt(const uint32_t& aId,
-                               const nsTArray<uint8_t>& aBuffer,
+                               InfallibleTArray<uint8_t>&& aBuffer,
                                const GMPDecryptionData& aMetadata)
 {
   if (!mSession) {
     return false;
   }
 
   // Note: the GMPBufferImpl created here is deleted when the GMP passes
   // it back in the Decrypted() callback above.
--- a/dom/media/gmp/GMPDecryptorChild.h
+++ b/dom/media/gmp/GMPDecryptorChild.h
@@ -87,39 +87,39 @@ private:
   ~GMPDecryptorChild();
 
   // GMPDecryptorChild
   virtual bool RecvInit() MOZ_OVERRIDE;
 
   virtual bool RecvCreateSession(const uint32_t& aCreateSessionToken,
                                  const uint32_t& aPromiseId,
                                  const nsCString& aInitDataType,
-                                 const nsTArray<uint8_t>& aInitData,
+                                 InfallibleTArray<uint8_t>&& aInitData,
                                  const GMPSessionType& aSessionType) MOZ_OVERRIDE;
 
   virtual bool RecvLoadSession(const uint32_t& aPromiseId,
                                const nsCString& aSessionId) MOZ_OVERRIDE;
 
   virtual bool RecvUpdateSession(const uint32_t& aPromiseId,
                                  const nsCString& aSessionId,
-                                 const nsTArray<uint8_t>& aResponse) MOZ_OVERRIDE;
+                                 InfallibleTArray<uint8_t>&& aResponse) MOZ_OVERRIDE;
 
   virtual bool RecvCloseSession(const uint32_t& aPromiseId,
                                 const nsCString& aSessionId) MOZ_OVERRIDE;
 
   virtual bool RecvRemoveSession(const uint32_t& aPromiseId,
                                  const nsCString& aSessionId) MOZ_OVERRIDE;
 
   virtual bool RecvDecrypt(const uint32_t& aId,
-                           const nsTArray<uint8_t>& aBuffer,
+                           InfallibleTArray<uint8_t>&& aBuffer,
                            const GMPDecryptionData& aMetadata) MOZ_OVERRIDE;
 
   // Resolve/reject promise on completion.
   virtual bool RecvSetServerCertificate(const uint32_t& aPromiseId,
-                                        const nsTArray<uint8_t>& aServerCert) MOZ_OVERRIDE;
+                                        InfallibleTArray<uint8_t>&& aServerCert) MOZ_OVERRIDE;
 
   virtual bool RecvDecryptingComplete() MOZ_OVERRIDE;
 
   // GMP's GMPDecryptor implementation.
   // Only call into this on the (GMP process) main thread.
   GMPDecryptor* mSession;
   GMPChild* mPlugin;
 
--- a/dom/media/gmp/GMPDecryptorParent.cpp
+++ b/dom/media/gmp/GMPDecryptorParent.cpp
@@ -209,17 +209,17 @@ GMPDecryptorParent::RecvRejectPromise(co
   }
   mCallback->RejectPromise(aPromiseId, GMPExToNsresult(aException), aMessage);
   return true;
 }
 
 bool
 GMPDecryptorParent::RecvSessionMessage(const nsCString& aSessionId,
                                        const GMPSessionMessageType& aMessageType,
-                                       const nsTArray<uint8_t>& aMessage)
+                                       nsTArray<uint8_t>&& aMessage)
 {
   if (!mIsOpen) {
     NS_WARNING("Trying to use a dead GMP decrypter!");
     return false;
   }
   mCallback->SessionMessage(aSessionId, aMessageType, aMessage);
   return true;
 }
@@ -261,29 +261,29 @@ GMPDecryptorParent::RecvSessionError(con
                           GMPExToNsresult(aException),
                           aSystemCode,
                           aMessage);
   return true;
 }
 
 bool
 GMPDecryptorParent::RecvKeyIdUsable(const nsCString& aSessionId,
-                                    const nsTArray<uint8_t>& aKeyId)
+                                    InfallibleTArray<uint8_t>&& aKeyId)
 {
   if (!mIsOpen) {
     NS_WARNING("Trying to use a dead GMP decrypter!");
     return false;
   }
   mCallback->KeyIdUsable(aSessionId, aKeyId);
   return true;
 }
 
 bool
 GMPDecryptorParent::RecvKeyIdNotUsable(const nsCString& aSessionId,
-                                       const nsTArray<uint8_t>& aKeyId)
+                                       InfallibleTArray<uint8_t>&& aKeyId)
 {
   if (!mIsOpen) {
     NS_WARNING("Trying to use a dead GMP decrypter!");
     return false;
   }
   mCallback->KeyIdNotUsable(aSessionId, aKeyId);
   return true;
 }
@@ -297,17 +297,17 @@ GMPDecryptorParent::RecvSetCaps(const ui
   }
   mCallback->SetCaps(aCaps);
   return true;
 }
 
 bool
 GMPDecryptorParent::RecvDecrypted(const uint32_t& aId,
                                   const GMPErr& aErr,
-                                  const nsTArray<uint8_t>& aBuffer)
+                                  InfallibleTArray<uint8_t>&& aBuffer)
 {
   if (!mIsOpen) {
     NS_WARNING("Trying to use a dead GMP decrypter!");
     return false;
   }
   mCallback->Decrypted(aId, aErr, aBuffer);
   return true;
 }
--- a/dom/media/gmp/GMPDecryptorParent.h
+++ b/dom/media/gmp/GMPDecryptorParent.h
@@ -74,37 +74,37 @@ private:
   virtual bool RecvResolvePromise(const uint32_t& aPromiseId) MOZ_OVERRIDE;
 
   virtual bool RecvRejectPromise(const uint32_t& aPromiseId,
                                  const GMPDOMException& aException,
                                  const nsCString& aMessage) MOZ_OVERRIDE;
 
   virtual bool RecvSessionMessage(const nsCString& aSessionId,
                                   const GMPSessionMessageType& aMessageType,
-                                  const nsTArray<uint8_t>& aMessage) MOZ_OVERRIDE;
+                                  nsTArray<uint8_t>&& aMessage) MOZ_OVERRIDE;
 
   virtual bool RecvExpirationChange(const nsCString& aSessionId,
                                     const double& aExpiryTime) MOZ_OVERRIDE;
 
   virtual bool RecvSessionClosed(const nsCString& aSessionId) MOZ_OVERRIDE;
 
   virtual bool RecvSessionError(const nsCString& aSessionId,
                                 const GMPDOMException& aException,
                                 const uint32_t& aSystemCode,
                                 const nsCString& aMessage) MOZ_OVERRIDE;
 
   virtual bool RecvKeyIdUsable(const nsCString& aSessionId,
-                                const nsTArray<uint8_t>& aKeyId) MOZ_OVERRIDE;
+                               InfallibleTArray<uint8_t>&& aKeyId) MOZ_OVERRIDE;
 
   virtual bool RecvKeyIdNotUsable(const nsCString& aSessionId,
-                                  const nsTArray<uint8_t>& aKeyId) MOZ_OVERRIDE;
+                                  InfallibleTArray<uint8_t>&& aKeyId) MOZ_OVERRIDE;
 
   virtual bool RecvDecrypted(const uint32_t& aId,
                              const GMPErr& aErr,
-                             const nsTArray<uint8_t>& aBuffer) MOZ_OVERRIDE;
+                             InfallibleTArray<uint8_t>&& aBuffer) MOZ_OVERRIDE;
 
   virtual bool RecvSetCaps(const uint64_t& aCaps) MOZ_OVERRIDE;
 
   virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
   virtual bool Recv__delete__() MOZ_OVERRIDE;
 
   bool mIsOpen;
   bool mShuttingDown;
--- a/dom/media/gmp/GMPStorageChild.cpp
+++ b/dom/media/gmp/GMPStorageChild.cpp
@@ -237,17 +237,17 @@ GMPStorageChild::RecvOpenComplete(const 
   }
   record->OpenComplete(aStatus);
   return true;
 }
 
 bool
 GMPStorageChild::RecvReadComplete(const nsCString& aRecordName,
                                   const GMPErr& aStatus,
-                                  const InfallibleTArray<uint8_t>& aBytes)
+                                  InfallibleTArray<uint8_t>&& aBytes)
 {
   if (mShutdown) {
     return true;
   }
   nsRefPtr<GMPRecordImpl> record = GetRecord(aRecordName);
   if (!record) {
     // Not fatal.
     return true;
@@ -325,17 +325,17 @@ public:
   }
 
 private:
   nsTArray<nsCString> mRecordNames;
   size_t mIndex;
 };
 
 bool
-GMPStorageChild::RecvRecordNames(const InfallibleTArray<nsCString>& aRecordNames,
+GMPStorageChild::RecvRecordNames(InfallibleTArray<nsCString>&& aRecordNames,
                                  const GMPErr& aStatus)
 {
   RecordIteratorContext ctx;
   {
     MonitorAutoLock lock(mMonitor);
     if (mShutdown || mPendingRecordIterators.empty()) {
       return true;
     }
--- a/dom/media/gmp/GMPStorageChild.h
+++ b/dom/media/gmp/GMPStorageChild.h
@@ -80,20 +80,20 @@ private:
 protected:
   ~GMPStorageChild() {}
 
   // PGMPStorageChild
   virtual bool RecvOpenComplete(const nsCString& aRecordName,
                                 const GMPErr& aStatus) MOZ_OVERRIDE;
   virtual bool RecvReadComplete(const nsCString& aRecordName,
                                 const GMPErr& aStatus,
-                                const InfallibleTArray<uint8_t>& aBytes) MOZ_OVERRIDE;
+                                InfallibleTArray<uint8_t>&& aBytes) MOZ_OVERRIDE;
   virtual bool RecvWriteComplete(const nsCString& aRecordName,
                                  const GMPErr& aStatus) MOZ_OVERRIDE;
-  virtual bool RecvRecordNames(const InfallibleTArray<nsCString>& aRecordNames,
+  virtual bool RecvRecordNames(InfallibleTArray<nsCString>&& aRecordNames,
                                const GMPErr& aStatus) MOZ_OVERRIDE;
   virtual bool RecvShutdown() MOZ_OVERRIDE;
 
 private:
   Monitor mMonitor;
   nsRefPtrHashtable<nsCStringHashKey, GMPRecordImpl> mRecords;
   GMPChild* mPlugin;
 
--- a/dom/media/gmp/GMPStorageParent.cpp
+++ b/dom/media/gmp/GMPStorageParent.cpp
@@ -535,17 +535,17 @@ GMPStorageParent::RecvRead(const nsCStri
     unused << SendReadComplete(aRecordName, mStorage->Read(aRecordName, data), data);
   }
 
   return true;
 }
 
 bool
 GMPStorageParent::RecvWrite(const nsCString& aRecordName,
-                            const InfallibleTArray<uint8_t>& aBytes)
+                            InfallibleTArray<uint8_t>&& aBytes)
 {
   LOGD(("%s::%s: %p record=%s", __CLASS__, __FUNCTION__, this, aRecordName.get()));
 
   if (mShutdown) {
     return false;
   }
 
   if (!mStorage->IsOpen(aRecordName)) {
--- a/dom/media/gmp/GMPStorageParent.h
+++ b/dom/media/gmp/GMPStorageParent.h
@@ -37,17 +37,17 @@ public:
 
   nsresult Init();
   void Shutdown();
 
 protected:
   virtual bool RecvOpen(const nsCString& aRecordName) MOZ_OVERRIDE;
   virtual bool RecvRead(const nsCString& aRecordName) MOZ_OVERRIDE;
   virtual bool RecvWrite(const nsCString& aRecordName,
-                         const InfallibleTArray<uint8_t>& aBytes) MOZ_OVERRIDE;
+                         InfallibleTArray<uint8_t>&& aBytes) MOZ_OVERRIDE;
   virtual bool RecvGetRecordNames() MOZ_OVERRIDE;
   virtual bool RecvClose(const nsCString& aRecordName) MOZ_OVERRIDE;
   virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
 
 private:
   ~GMPStorageParent() {}
 
   UniquePtr<GMPStorage> mStorage;
--- a/dom/media/gmp/GMPVideoDecoderChild.cpp
+++ b/dom/media/gmp/GMPVideoDecoderChild.cpp
@@ -102,17 +102,17 @@ GMPVideoDecoderChild::Error(GMPErr aErro
 {
   MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
 
   SendError(aError);
 }
 
 bool
 GMPVideoDecoderChild::RecvInitDecode(const GMPVideoCodec& aCodecSettings,
-                                     const nsTArray<uint8_t>& aCodecSpecific,
+                                     InfallibleTArray<uint8_t>&& aCodecSpecific,
                                      const int32_t& aCoreCount)
 {
   if (!mVideoDecoder) {
     return false;
   }
 
   // Ignore any return code. It is OK for this to fail without killing the process.
   mVideoDecoder->InitDecode(aCodecSettings,
@@ -121,17 +121,17 @@ GMPVideoDecoderChild::RecvInitDecode(con
                             this,
                             aCoreCount);
   return true;
 }
 
 bool
 GMPVideoDecoderChild::RecvDecode(const GMPVideoEncodedFrameData& aInputFrame,
                                  const bool& aMissingFrames,
-                                 const nsTArray<uint8_t>& aCodecSpecificInfo,
+                                 InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
                                  const int64_t& aRenderTimeMs)
 {
   if (!mVideoDecoder) {
     return false;
   }
 
   auto f = new GMPVideoEncodedFrameImpl(aInputFrame, &mVideoHost);
 
@@ -141,17 +141,17 @@ GMPVideoDecoderChild::RecvDecode(const G
                         aCodecSpecificInfo.Elements(),
                         aCodecSpecificInfo.Length(),
                         aRenderTimeMs);
 
   return true;
 }
 
 bool
-GMPVideoDecoderChild::RecvChildShmemForPool(Shmem& aFrameBuffer)
+GMPVideoDecoderChild::RecvChildShmemForPool(Shmem&& aFrameBuffer)
 {
   if (aFrameBuffer.IsWritable()) {
     mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPFrameData,
                                                aFrameBuffer);
   }
   return true;
 }
 
--- a/dom/media/gmp/GMPVideoDecoderChild.h
+++ b/dom/media/gmp/GMPVideoDecoderChild.h
@@ -58,23 +58,23 @@ public:
 #else
     DeallocShmem(aMem);
 #endif
   }
 
 private:
   // PGMPVideoDecoderChild
   virtual bool RecvInitDecode(const GMPVideoCodec& aCodecSettings,
-                              const nsTArray<uint8_t>& aCodecSpecific,
+                              InfallibleTArray<uint8_t>&& aCodecSpecific,
                               const int32_t& aCoreCount) MOZ_OVERRIDE;
   virtual bool RecvDecode(const GMPVideoEncodedFrameData& aInputFrame,
                           const bool& aMissingFrames,
-                          const nsTArray<uint8_t>& aCodecSpecificInfo,
+                          InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
                           const int64_t& aRenderTimeMs) MOZ_OVERRIDE;
-  virtual bool RecvChildShmemForPool(Shmem& aFrameBuffer) MOZ_OVERRIDE;
+  virtual bool RecvChildShmemForPool(Shmem&& aFrameBuffer) MOZ_OVERRIDE;
   virtual bool RecvReset() MOZ_OVERRIDE;
   virtual bool RecvDrain() MOZ_OVERRIDE;
   virtual bool RecvDecodingComplete() MOZ_OVERRIDE;
 
   GMPChild* mPlugin;
   GMPVideoDecoder* mVideoDecoder;
   GMPVideoHostImpl mVideoHost;
 };
--- a/dom/media/gmp/GMPVideoDecoderParent.cpp
+++ b/dom/media/gmp/GMPVideoDecoderParent.cpp
@@ -317,17 +317,17 @@ GMPVideoDecoderParent::RecvError(const G
 
   // Ignore any return code. It is OK for this to fail without killing the process.
   mCallback->Error(aError);
 
   return true;
 }
 
 bool
-GMPVideoDecoderParent::RecvParentShmemForPool(Shmem& aEncodedBuffer)
+GMPVideoDecoderParent::RecvParentShmemForPool(Shmem&& aEncodedBuffer)
 {
   if (aEncodedBuffer.IsWritable()) {
     mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData,
                                                aEncodedBuffer);
   }
   return true;
 }
 
--- a/dom/media/gmp/GMPVideoDecoderParent.h
+++ b/dom/media/gmp/GMPVideoDecoderParent.h
@@ -66,17 +66,17 @@ private:
   virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
   virtual bool RecvDecoded(const GMPVideoi420FrameData& aDecodedFrame) MOZ_OVERRIDE;
   virtual bool RecvReceivedDecodedReferenceFrame(const uint64_t& aPictureId) MOZ_OVERRIDE;
   virtual bool RecvReceivedDecodedFrame(const uint64_t& aPictureId) MOZ_OVERRIDE;
   virtual bool RecvInputDataExhausted() MOZ_OVERRIDE;
   virtual bool RecvDrainComplete() MOZ_OVERRIDE;
   virtual bool RecvResetComplete() MOZ_OVERRIDE;
   virtual bool RecvError(const GMPErr& aError) MOZ_OVERRIDE;
-  virtual bool RecvParentShmemForPool(Shmem& aEncodedBuffer) MOZ_OVERRIDE;
+  virtual bool RecvParentShmemForPool(Shmem&& aEncodedBuffer) MOZ_OVERRIDE;
   virtual bool AnswerNeedShmem(const uint32_t& aFrameBufferSize,
                                Shmem* aMem) MOZ_OVERRIDE;
   virtual bool Recv__delete__() MOZ_OVERRIDE;
 
   bool mIsOpen;
   bool mShuttingDown;
   nsRefPtr<GMPParent> mPlugin;
   GMPVideoDecoderCallbackProxy* mCallback;
--- a/dom/media/gmp/GMPVideoEncoderChild.cpp
+++ b/dom/media/gmp/GMPVideoEncoderChild.cpp
@@ -63,17 +63,17 @@ GMPVideoEncoderChild::Error(GMPErr aErro
 {
   MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
 
   SendError(aError);
 }
 
 bool
 GMPVideoEncoderChild::RecvInitEncode(const GMPVideoCodec& aCodecSettings,
-                                     const nsTArray<uint8_t>& aCodecSpecific,
+                                     InfallibleTArray<uint8_t>&& aCodecSpecific,
                                      const int32_t& aNumberOfCores,
                                      const uint32_t& aMaxPayloadSize)
 {
   if (!mVideoEncoder) {
     return false;
   }
 
   // Ignore any return code. It is OK for this to fail without killing the process.
@@ -84,18 +84,18 @@ GMPVideoEncoderChild::RecvInitEncode(con
                             aNumberOfCores,
                             aMaxPayloadSize);
 
   return true;
 }
 
 bool
 GMPVideoEncoderChild::RecvEncode(const GMPVideoi420FrameData& aInputFrame,
-                                 const nsTArray<uint8_t>& aCodecSpecificInfo,
-                                 const nsTArray<GMPVideoFrameType>& aFrameTypes)
+                                 InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
+                                 InfallibleTArray<GMPVideoFrameType>&& aFrameTypes)
 {
   if (!mVideoEncoder) {
     return false;
   }
 
   auto f = new GMPVideoi420FrameImpl(aInputFrame, &mVideoHost);
 
   // Ignore any return code. It is OK for this to fail without killing the process.
@@ -104,17 +104,17 @@ GMPVideoEncoderChild::RecvEncode(const G
                         aCodecSpecificInfo.Length(),
                         aFrameTypes.Elements(),
                         aFrameTypes.Length());
 
   return true;
 }
 
 bool
-GMPVideoEncoderChild::RecvChildShmemForPool(Shmem& aEncodedBuffer)
+GMPVideoEncoderChild::RecvChildShmemForPool(Shmem&& aEncodedBuffer)
 {
   if (aEncodedBuffer.IsWritable()) {
     mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData,
                                                aEncodedBuffer);
   }
   return true;
 }
 
--- a/dom/media/gmp/GMPVideoEncoderChild.h
+++ b/dom/media/gmp/GMPVideoEncoderChild.h
@@ -54,23 +54,23 @@ public:
 #else
     DeallocShmem(aMem);
 #endif
   }
 
 private:
   // PGMPVideoEncoderChild
   virtual bool RecvInitEncode(const GMPVideoCodec& aCodecSettings,
-                              const nsTArray<uint8_t>& aCodecSpecific,
+                              InfallibleTArray<uint8_t>&& aCodecSpecific,
                               const int32_t& aNumberOfCores,
                               const uint32_t& aMaxPayloadSize) MOZ_OVERRIDE;
   virtual bool RecvEncode(const GMPVideoi420FrameData& aInputFrame,
-                          const nsTArray<uint8_t>& aCodecSpecificInfo,
-                          const nsTArray<GMPVideoFrameType>& aFrameTypes) MOZ_OVERRIDE;
-  virtual bool RecvChildShmemForPool(Shmem& aEncodedBuffer) MOZ_OVERRIDE;
+                          InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
+                          InfallibleTArray<GMPVideoFrameType>&& aFrameTypes) MOZ_OVERRIDE;
+  virtual bool RecvChildShmemForPool(Shmem&& aEncodedBuffer) MOZ_OVERRIDE;
   virtual bool RecvSetChannelParameters(const uint32_t& aPacketLoss,
                                         const uint32_t& aRTT) MOZ_OVERRIDE;
   virtual bool RecvSetRates(const uint32_t& aNewBitRate,
                             const uint32_t& aFrameRate) MOZ_OVERRIDE;
   virtual bool RecvSetPeriodicKeyFrames(const bool& aEnable) MOZ_OVERRIDE;
   virtual bool RecvEncodingComplete() MOZ_OVERRIDE;
 
   GMPChild* mPlugin;
--- a/dom/media/gmp/GMPVideoEncoderParent.cpp
+++ b/dom/media/gmp/GMPVideoEncoderParent.cpp
@@ -283,17 +283,17 @@ EncodedCallback(GMPVideoEncoderCallbackP
   // XXX add locks to the ShmemManager instead?
   aThread->Dispatch(WrapRunnable(aEncodedFrame,
                                 &GMPVideoEncodedFrame::Destroy),
                    NS_DISPATCH_NORMAL);
 }
 
 bool
 GMPVideoEncoderParent::RecvEncoded(const GMPVideoEncodedFrameData& aEncodedFrame,
-                                   const nsTArray<uint8_t>& aCodecSpecificInfo)
+                                   InfallibleTArray<uint8_t>&& aCodecSpecificInfo)
 {
   if (!mCallback) {
     return false;
   }
 
   auto f = new GMPVideoEncodedFrameImpl(aEncodedFrame, &mVideoHost);
   nsTArray<uint8_t> *codecSpecificInfo = new nsTArray<uint8_t>;
   codecSpecificInfo->AppendElements((uint8_t*)aCodecSpecificInfo.Elements(), aCodecSpecificInfo.Length());
@@ -315,17 +315,17 @@ GMPVideoEncoderParent::RecvError(const G
 
   // Ignore any return code. It is OK for this to fail without killing the process.
   mCallback->Error(aError);
 
   return true;
 }
 
 bool
-GMPVideoEncoderParent::RecvParentShmemForPool(Shmem& aFrameBuffer)
+GMPVideoEncoderParent::RecvParentShmemForPool(Shmem&& aFrameBuffer)
 {
   if (aFrameBuffer.IsWritable()) {
     mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPFrameData,
                                                aFrameBuffer);
   }
   return true;
 }
 
--- a/dom/media/gmp/GMPVideoEncoderParent.h
+++ b/dom/media/gmp/GMPVideoEncoderParent.h
@@ -61,19 +61,19 @@ public:
   }
 
 private:
   virtual ~GMPVideoEncoderParent();
 
   // PGMPVideoEncoderParent
   virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
   virtual bool RecvEncoded(const GMPVideoEncodedFrameData& aEncodedFrame,
-                           const nsTArray<uint8_t>& aCodecSpecificInfo) MOZ_OVERRIDE;
+                           InfallibleTArray<uint8_t>&& aCodecSpecificInfo) MOZ_OVERRIDE;
   virtual bool RecvError(const GMPErr& aError) MOZ_OVERRIDE;
-  virtual bool RecvParentShmemForPool(Shmem& aFrameBuffer) MOZ_OVERRIDE;
+  virtual bool RecvParentShmemForPool(Shmem&& aFrameBuffer) MOZ_OVERRIDE;
   virtual bool AnswerNeedShmem(const uint32_t& aEncodedBufferSize,
                                Shmem* aMem) MOZ_OVERRIDE;
   virtual bool Recv__delete__() MOZ_OVERRIDE;
 
   bool mIsOpen;
   bool mShuttingDown;
   nsRefPtr<GMPParent> mPlugin;
   GMPVideoEncoderCallbackProxy* mCallback;
--- a/dom/media/gstreamer/GStreamerReader.cpp
+++ b/dom/media/gstreamer/GStreamerReader.cpp
@@ -784,20 +784,17 @@ bool GStreamerReader::DecodeVideoFrame(b
   mVideoQueue.Push(video);
 
   gst_buffer_unref(buffer);
 
   return true;
 }
 
 nsRefPtr<MediaDecoderReader::SeekPromise>
-GStreamerReader::Seek(int64_t aTarget,
-                      int64_t aStartTime,
-                      int64_t aEndTime,
-                      int64_t aCurrentTime)
+GStreamerReader::Seek(int64_t aTarget, int64_t aEndTime)
 {
   NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
 
   gint64 seekPos = aTarget * GST_USECOND;
   LOG(PR_LOG_DEBUG, "%p About to seek to %" GST_TIME_FORMAT,
         mDecoder, GST_TIME_ARGS(seekPos));
 
   int flags = GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT;
--- a/dom/media/gstreamer/GStreamerReader.h
+++ b/dom/media/gstreamer/GStreamerReader.h
@@ -44,20 +44,17 @@ public:
   virtual nsresult Init(MediaDecoderReader* aCloneDonor);
   virtual nsresult ResetDecode();
   virtual bool DecodeAudioData();
   virtual bool DecodeVideoFrame(bool &aKeyframeSkip,
                                 int64_t aTimeThreshold);
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags);
   virtual nsRefPtr<SeekPromise>
-  Seek(int64_t aTime,
-       int64_t aStartTime,
-       int64_t aEndTime,
-       int64_t aCurrentTime) MOZ_OVERRIDE;
+  Seek(int64_t aTime, int64_t aEndTime) MOZ_OVERRIDE;
   virtual nsresult GetBuffered(dom::TimeRanges* aBuffered);
 
   virtual void NotifyDataArrived(const char *aBuffer,
                                  uint32_t aLength,
                                  int64_t aOffset) MOZ_OVERRIDE;
 
   virtual bool HasAudio() {
     return mInfo.HasAudio();
--- a/dom/media/mediasource/MediaSource.cpp
+++ b/dom/media/mediasource/MediaSource.cpp
@@ -184,25 +184,25 @@ MediaSource::SetDuration(double aDuratio
     aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
     return;
   }
   if (mReadyState != MediaSourceReadyState::Open ||
       mSourceBuffers->AnyUpdating()) {
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return;
   }
-  SetDuration(aDuration);
+  SetDuration(aDuration, MSRangeRemovalAction::RUN);
 }
 
 void
-MediaSource::SetDuration(double aDuration)
+MediaSource::SetDuration(double aDuration, MSRangeRemovalAction aAction)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MSE_API("MediaSource(%p)::SetDuration(aDuration=%f)", this, aDuration);
-  mDecoder->SetMediaSourceDuration(aDuration);
+  mDecoder->SetMediaSourceDuration(aDuration, aAction);
 }
 
 already_AddRefed<SourceBuffer>
 MediaSource::AddSourceBuffer(const nsAString& aType, ErrorResult& aRv)
 {
   MOZ_ASSERT(NS_IsMainThread());
   nsresult rv = mozilla::IsTypeSupported(aType);
   MSE_API("MediaSource(%p)::AddSourceBuffer(aType=%s)%s",
@@ -280,17 +280,18 @@ MediaSource::EndOfStream(const Optional<
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return;
   }
 
   SetReadyState(MediaSourceReadyState::Ended);
   mSourceBuffers->Ended();
   mDecoder->Ended();
   if (!aError.WasPassed()) {
-    mDecoder->SetMediaSourceDuration(mSourceBuffers->GetHighestBufferedEndTime());
+    mDecoder->SetMediaSourceDuration(mSourceBuffers->GetHighestBufferedEndTime(),
+                                     MSRangeRemovalAction::SKIP);
     if (aRv.Failed()) {
       return;
     }
     // TODO:
     //   Notify media element that all data is now available.
     return;
   }
   switch (aError.Value()) {
--- a/dom/media/mediasource/MediaSource.h
+++ b/dom/media/mediasource/MediaSource.h
@@ -24,16 +24,21 @@ struct JSContext;
 class JSObject;
 class nsPIDOMWindow;
 
 namespace mozilla {
 
 class ErrorResult;
 template <typename T> class AsyncEventRunner;
 
+enum MSRangeRemovalAction: uint8_t {
+  RUN = 0,
+  SKIP = 1
+};
+
 namespace dom {
 
 class GlobalObject;
 class SourceBuffer;
 class SourceBufferList;
 template <typename T> class Optional;
 
 #define MOZILLA_DOM_MEDIASOURCE_IMPLEMENTATION_IID \
@@ -124,17 +129,17 @@ private:
   void DispatchSimpleEvent(const char* aName);
   void QueueAsyncSimpleEvent(const char* aName);
 
   void DurationChange(double aOldDuration, double aNewDuration);
 
   void InitializationEvent();
 
   // SetDuration with no checks.
-  void SetDuration(double aDuration);
+  void SetDuration(double aDuration, MSRangeRemovalAction aAction);
 
   nsRefPtr<SourceBufferList> mSourceBuffers;
   nsRefPtr<SourceBufferList> mActiveSourceBuffers;
 
   nsRefPtr<MediaSourceDecoder> mDecoder;
   // Ensures the media element remains alive to dispatch progress and
   // durationchanged events.
   nsRefPtr<HTMLMediaElement> mMediaElement;
--- a/dom/media/mediasource/MediaSourceDecoder.cpp
+++ b/dom/media/mediasource/MediaSourceDecoder.cpp
@@ -168,19 +168,19 @@ bool
 MediaSourceDecoder::IsExpectingMoreData()
 {
   ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
   return !mReader->IsEnded();
 }
 
 class DurationChangedRunnable : public nsRunnable {
 public:
-  explicit DurationChangedRunnable(MediaSourceDecoder* aDecoder,
-                                   double aOldDuration,
-                                   double aNewDuration)
+  DurationChangedRunnable(MediaSourceDecoder* aDecoder,
+                          double aOldDuration,
+                          double aNewDuration)
     : mDecoder(aDecoder)
     , mOldDuration(aOldDuration)
     , mNewDuration(aNewDuration)
   { }
 
   NS_IMETHOD Run() MOZ_OVERRIDE MOZ_FINAL {
     mDecoder->DurationChanged(mOldDuration, mNewDuration);
     return NS_OK;
@@ -209,33 +209,65 @@ MediaSourceDecoder::SetDecodedDuration(i
 {
   // Only use the decoded duration if one wasn't already
   // set.
   ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
   if (!mMediaSource || !IsNaN(mMediaSourceDuration)) {
     return;
   }
   double duration = aDuration;
-  duration /= USECS_PER_S;
-  SetMediaSourceDuration(duration);
+  // A duration of -1 is +Infinity.
+  if (aDuration >= 0) {
+    duration /= USECS_PER_S;
+  }
+  DoSetMediaSourceDuration(duration);
 }
 
 void
-MediaSourceDecoder::SetMediaSourceDuration(double aDuration)
+MediaSourceDecoder::SetMediaSourceDuration(double aDuration, MSRangeRemovalAction aAction)
 {
   ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
   double oldDuration = mMediaSourceDuration;
-  mMediaSourceDuration = aDuration;
-  mDecoderStateMachine->SetDuration(aDuration * USECS_PER_S);
-  if (NS_IsMainThread()) {
-    DurationChanged(oldDuration, aDuration);
+  DoSetMediaSourceDuration(aDuration);
+  ScheduleDurationChange(oldDuration, aDuration, aAction);
+}
+
+void
+MediaSourceDecoder::DoSetMediaSourceDuration(double aDuration)
+{
+  if (aDuration >= 0) {
+    mDecoderStateMachine->SetDuration(aDuration * USECS_PER_S);
+    mMediaSourceDuration = aDuration;
   } else {
-    nsRefPtr<nsIRunnable> task =
-      new DurationChangedRunnable(this, oldDuration, aDuration);
-    NS_DispatchToMainThread(task);
+    mDecoderStateMachine->SetDuration(INT64_MAX);
+    mMediaSourceDuration = PositiveInfinity<double>();
+  }
+}
+
+void
+MediaSourceDecoder::ScheduleDurationChange(double aOldDuration,
+                                           double aNewDuration,
+                                           MSRangeRemovalAction aAction)
+{
+  if (aAction == MSRangeRemovalAction::SKIP) {
+    if (NS_IsMainThread()) {
+      MediaDecoder::DurationChanged();
+    } else {
+      nsCOMPtr<nsIRunnable> task =
+        NS_NewRunnableMethod(this, &MediaDecoder::DurationChanged);
+      NS_DispatchToMainThread(task);
+    }
+  } else {
+    if (NS_IsMainThread()) {
+      DurationChanged(aOldDuration, aNewDuration);
+    } else {
+      nsRefPtr<nsIRunnable> task =
+        new DurationChangedRunnable(this, aOldDuration, aNewDuration);
+      NS_DispatchToMainThread(task);
+    }
   }
 }
 
 double
 MediaSourceDecoder::GetMediaSourceDuration()
 {
   ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
   return mMediaSourceDuration;
--- a/dom/media/mediasource/MediaSourceDecoder.h
+++ b/dom/media/mediasource/MediaSourceDecoder.h
@@ -16,16 +16,17 @@
 class nsIStreamListener;
 
 namespace mozilla {
 
 class MediaResource;
 class MediaDecoderStateMachine;
 class SourceBufferDecoder;
 class TrackBuffer;
+enum MSRangeRemovalAction : uint8_t;
 
 namespace dom {
 
 class HTMLMediaElement;
 class MediaSource;
 
 } // namespace dom
 
@@ -51,17 +52,17 @@ public:
   void AddTrackBuffer(TrackBuffer* aTrackBuffer);
   void RemoveTrackBuffer(TrackBuffer* aTrackBuffer);
   void OnTrackBufferConfigured(TrackBuffer* aTrackBuffer, const MediaInfo& aInfo);
 
   void Ended();
   bool IsExpectingMoreData() MOZ_OVERRIDE;
 
   void SetDecodedDuration(int64_t aDuration);
-  void SetMediaSourceDuration(double aDuration);
+  void SetMediaSourceDuration(double aDuration, MSRangeRemovalAction aAction);
   double GetMediaSourceDuration();
   void DurationChanged(double aOldDuration, double aNewDuration);
 
   // Called whenever a TrackBuffer has new data appended or a new decoder
   // initializes.  Safe to call from any thread.
   void NotifyTimeRangesChanged();
 
   // Indicates the point in time at which the reader should consider
@@ -74,16 +75,21 @@ public:
 
   MediaSourceReader* GetReader() { return mReader; }
 
   // Returns true if aReader is a currently active audio or video
   // reader in this decoders MediaSourceReader.
   bool IsActiveReader(MediaDecoderReader* aReader);
 
 private:
+  void DoSetMediaSourceDuration(double aDuration);
+  void ScheduleDurationChange(double aOldDuration,
+                              double aNewDuration,
+                              MSRangeRemovalAction aAction);
+
   // The owning MediaSource holds a strong reference to this decoder, and
   // calls Attach/DetachMediaSource on this decoder to set and clear
   // mMediaSource.
   dom::MediaSource* mMediaSource;
   nsRefPtr<MediaSourceReader> mReader;
 
   // Protected by GetReentrantMonitor()
   double mMediaSourceDuration;
--- a/dom/media/mediasource/MediaSourceReader.cpp
+++ b/dom/media/mediasource/MediaSourceReader.cpp
@@ -44,26 +44,23 @@ using mozilla::dom::TimeRanges;
 
 namespace mozilla {
 
 MediaSourceReader::MediaSourceReader(MediaSourceDecoder* aDecoder)
   : MediaDecoderReader(aDecoder)
   , mLastAudioTime(0)
   , mLastVideoTime(0)
   , mPendingSeekTime(-1)
-  , mPendingStartTime(-1)
-  , mPendingEndTime(-1)
-  , mPendingCurrentTime(-1)
   , mWaitingForSeekData(false)
+  , mAudioIsSeeking(false)
+  , mVideoIsSeeking(false)
   , mTimeThreshold(-1)
   , mDropAudioBeforeThreshold(false)
   , mDropVideoBeforeThreshold(false)
   , mEnded(false)
-  , mAudioIsSeeking(false)
-  , mVideoIsSeeking(false)
   , mHasEssentialTrackBuffers(false)
 #ifdef MOZ_FMP4
   , mSharedDecoderManager(new SharedDecoderManager())
 #endif
 {
 }
 
 void
@@ -116,19 +113,23 @@ MediaSourceReader::RequestAudioData()
 {
   nsRefPtr<AudioDataPromise> p = mAudioPromise.Ensure(__func__);
   MSE_DEBUGV("MediaSourceReader(%p)::RequestAudioData", this);
   if (!mAudioReader) {
     MSE_DEBUG("MediaSourceReader(%p)::RequestAudioData called with no audio reader", this);
     mAudioPromise.Reject(DECODE_ERROR, __func__);
     return p;
   }
-  mAudioIsSeeking = false;
+  if (mAudioIsSeeking) {
+    MSE_DEBUG("MediaSourceReader(%p)::RequestAudioData called mid-seek. Rejecting.", this);
+    mAudioPromise.Reject(CANCELED, __func__);
+    return p;
+  }
   if (SwitchAudioReader(mLastAudioTime)) {
-    mAudioReader->Seek(mLastAudioTime, 0, 0, 0)
+    mAudioReader->Seek(mLastAudioTime, 0)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::RequestAudioDataComplete,
                        &MediaSourceReader::RequestAudioDataFailed);
   } else {
     RequestAudioDataComplete(0);
   }
   return p;
 }
@@ -215,17 +216,17 @@ MediaSourceReader::OnAudioNotDecoded(Not
   if (mAudioReader) {
     AdjustEndTime(&mLastAudioTime, mAudioReader);
   }
 
   // See if we can find a different reader that can pick up where we left off. We use the
   // EOS_FUZZ_US to allow for the fact that our end time can be inaccurate due to bug
   // 1065207.
   if (SwitchAudioReader(mLastAudioTime, EOS_FUZZ_US)) {
-    mAudioReader->Seek(mLastAudioTime, 0, 0, 0)
+    mAudioReader->Seek(mLastAudioTime, 0)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::RequestAudioDataComplete,
                        &MediaSourceReader::RequestAudioDataFailed);
     return;
   }
 
   // If the entire MediaSource is done, generate an EndOfStream.
   if (IsEnded()) {
@@ -250,19 +251,23 @@ MediaSourceReader::RequestVideoData(bool
     mVideoPromise.Reject(DECODE_ERROR, __func__);
     return p;
   }
   if (aSkipToNextKeyframe) {
     mTimeThreshold = aTimeThreshold;
     mDropAudioBeforeThreshold = true;
     mDropVideoBeforeThreshold = true;
   }
-  mVideoIsSeeking = false;
+  if (mVideoIsSeeking) {
+    MSE_DEBUG("MediaSourceReader(%p)::RequestVideoData called mid-seek. Rejecting.", this);
+    mVideoPromise.Reject(CANCELED, __func__);
+    return p;
+  }
   if (SwitchVideoReader(mLastVideoTime)) {
-    mVideoReader->Seek(mLastVideoTime, 0, 0, 0)
+    mVideoReader->Seek(mLastVideoTime, 0)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::RequestVideoDataComplete,
                        &MediaSourceReader::RequestVideoDataFailed);
   } else {
     mVideoReader->RequestVideoData(aSkipToNextKeyframe, aTimeThreshold)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::OnVideoDecoded, &MediaSourceReader::OnVideoNotDecoded);
   }
@@ -326,17 +331,17 @@ MediaSourceReader::OnVideoNotDecoded(Not
   if (mVideoReader) {
     AdjustEndTime(&mLastVideoTime, mVideoReader);
   }
 
   // See if we can find a different reader that can pick up where we left off. We use the
   // EOS_FUZZ_US to allow for the fact that our end time can be inaccurate due to bug
   // 1065207.
   if (SwitchVideoReader(mLastVideoTime, EOS_FUZZ_US)) {
-    mVideoReader->Seek(mLastVideoTime, 0, 0, 0)
+    mVideoReader->Seek(mLastVideoTime, 0)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::RequestVideoDataComplete,
                        &MediaSourceReader::RequestVideoDataFailed);
     return;
   }
 
   // If the entire MediaSource is done, generate an EndOfStream.
   if (IsEnded()) {
@@ -620,126 +625,147 @@ MediaSourceReader::NotifyTimeRangesChang
     //post a task to the state machine thread to call seek.
     RefPtr<nsIRunnable> task(NS_NewRunnableMethod(
         this, &MediaSourceReader::AttemptSeek));
     GetTaskQueue()->Dispatch(task.forget());
   }
 }
 
 nsRefPtr<MediaDecoderReader::SeekPromise>
-MediaSourceReader::Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime,
-                        int64_t aCurrentTime)
+MediaSourceReader::Seek(int64_t aTime, int64_t aIgnored /* Used only for ogg which is non-MSE */)
 {
-  MSE_DEBUG("MediaSourceReader(%p)::Seek(aTime=%lld, aStart=%lld, aEnd=%lld, aCurrent=%lld)",
-            this, aTime, aStartTime, aEndTime, aCurrentTime);
+  MSE_DEBUG("MediaSourceReader(%p)::Seek(aTime=%lld, aEnd=%lld, aCurrent=%lld)",
+            this, aTime);
 
-  mSeekPromise.RejectIfExists(NS_OK, __func__);
+  MOZ_ASSERT(mSeekPromise.IsEmpty());
   nsRefPtr<SeekPromise> p = mSeekPromise.Ensure(__func__);
 
   if (IsShutdown()) {
     mSeekPromise.Reject(NS_ERROR_FAILURE, __func__);
     return p;
   }
 
   // Store pending seek target in case the track buffers don't contain
   // the desired time and we delay doing the seek.
   mPendingSeekTime = aTime;
-  mPendingStartTime = aStartTime;
-  mPendingEndTime = aEndTime;
-  mPendingCurrentTime = aCurrentTime;
 
-  // Only increment the number of expected OnSeekCompleted
-  // notifications if we weren't already waiting for AttemptSeek
-  // to complete (and they would have been accounted for already).
   {
     ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
     mWaitingForSeekData = true;
   }
 
   AttemptSeek();
   return p;
 }
 
 void
+MediaSourceReader::CancelSeek()
+{
+  MOZ_ASSERT(OnDecodeThread());
+  ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+  if (mWaitingForSeekData) {
+    mSeekPromise.Reject(NS_OK, __func__);
+    mWaitingForSeekData = false;
+    mPendingSeekTime = -1;
+  } else if (mVideoIsSeeking) {
+    // NB: Currently all readers have sync Seeks(), so this is a no-op.
+    mVideoReader->CancelSeek();
+  } else if (mAudioIsSeeking) {
+    // NB: Currently all readers have sync Seeks(), so this is a no-op.
+    mAudioReader->CancelSeek();
+  } else {
+    MOZ_ASSERT(mSeekPromise.IsEmpty());
+  }
+}
+
+void
 MediaSourceReader::OnVideoSeekCompleted(int64_t aTime)
 {
   mPendingSeekTime = aTime;
+  MOZ_ASSERT(mVideoIsSeeking);
+  MOZ_ASSERT(!mAudioIsSeeking);
+  mVideoIsSeeking = false;
+
   if (mAudioTrack) {
     mAudioIsSeeking = true;
     SwitchAudioReader(mPendingSeekTime);
-    mAudioReader->Seek(mPendingSeekTime,
-                       mPendingStartTime,
-                       mPendingEndTime,
-                       mPendingCurrentTime)
+    mAudioReader->Seek(mPendingSeekTime, 0)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::OnAudioSeekCompleted,
                        &MediaSourceReader::OnSeekFailed);
     MSE_DEBUG("MediaSourceReader(%p)::Seek audio reader=%p", this, mAudioReader.get());
     return;
   }
   mSeekPromise.Resolve(mPendingSeekTime, __func__);
 }
 
 void
 MediaSourceReader::OnAudioSeekCompleted(int64_t aTime)
 {
+  mPendingSeekTime = aTime;
+  MOZ_ASSERT(mAudioIsSeeking);
+  MOZ_ASSERT(!mVideoIsSeeking);
+  mAudioIsSeeking = false;
+
   mSeekPromise.Resolve(mPendingSeekTime, __func__);
+  mPendingSeekTime = -1;
 }
 
 void
 MediaSourceReader::OnSeekFailed(nsresult aResult)
 {
-  // Keep the most recent failed result (if any)
-  if (NS_FAILED(aResult)) {
-    mSeekPromise.Reject(aResult, __func__);
-    return;
+  MOZ_ASSERT(mVideoIsSeeking || mAudioIsSeeking);
+
+  if (mVideoIsSeeking) {
+    MOZ_ASSERT(!mAudioIsSeeking);
+    mVideoIsSeeking = false;
   }
-  mSeekPromise.Resolve(mPendingSeekTime, __func__);
+
+  if (mAudioIsSeeking) {
+    MOZ_ASSERT(!mVideoIsSeeking);
+    mAudioIsSeeking = false;
+  }
+
+  mPendingSeekTime = -1;
+  mSeekPromise.Reject(aResult, __func__);
 }
 
 void
 MediaSourceReader::AttemptSeek()
 {
   // Make sure we don't hold the monitor while calling into the reader
   // Seek methods since it can deadlock.
   {
     ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
     if (!mWaitingForSeekData || !TrackBuffersContainTime(mPendingSeekTime)) {
       return;
     }
+    mWaitingForSeekData = false;
   }
 
   ResetDecode();
   for (uint32_t i = 0; i < mTrackBuffers.Length(); ++i) {
     mTrackBuffers[i]->ResetDecode();
   }
 
   // Decoding discontinuity upon seek, reset last times to seek target.
   mLastAudioTime = mPendingSeekTime;
   mLastVideoTime = mPendingSeekTime;
 
   if (mVideoTrack) {
     mVideoIsSeeking = true;
     SwitchVideoReader(mPendingSeekTime);
-    mVideoReader->Seek(mPendingSeekTime,
-                       mPendingStartTime,
-                       mPendingEndTime,
-                       mPendingCurrentTime)
+    mVideoReader->Seek(mPendingSeekTime, 0)
                 ->Then(GetTaskQueue(), __func__, this,
                        &MediaSourceReader::OnVideoSeekCompleted,
                        &MediaSourceReader::OnSeekFailed);
     MSE_DEBUG("MediaSourceReader(%p)::Seek video reader=%p", this, mVideoReader.get());
   } else {
     OnVideoSeekCompleted(mPendingSeekTime);
   }
-
-  {
-    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-    mWaitingForSeekData = false;
-  }
 }
 
 nsresult
 MediaSourceReader::GetBuffered(dom::TimeRanges* aBuffered)
 {
   ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
   MOZ_ASSERT(aBuffered->Length() == 0);
   if (mTrackBuffers.IsEmpty()) {
@@ -840,19 +866,21 @@ MediaSourceReader::ReadMetadata(MediaInf
     const MediaInfo& info = mVideoReader->GetMediaInfo();
     MOZ_ASSERT(info.HasVideo());
     mInfo.mVideo = info.mVideo;
     maxDuration = std::max(maxDuration, mVideoReader->GetDecoder()->GetMediaDuration());
     MSE_DEBUG("MediaSourceReader(%p)::ReadMetadata video reader=%p maxDuration=%lld",
               this, mVideoReader.get(), maxDuration);
   }
 
-  if (maxDuration != -1) {
-    static_cast<MediaSourceDecoder*>(mDecoder)->SetDecodedDuration(maxDuration);
+  if (!maxDuration) {
+    // Treat a duration of 0 as infinity
+    maxDuration = -1;
   }
+  static_cast<MediaSourceDecoder*>(mDecoder)->SetDecodedDuration(maxDuration);
 
   *aInfo = mInfo;
   *aTags = nullptr; // TODO: Handle metadata.
 
   return NS_OK;
 }
 
 void
--- a/dom/media/mediasource/MediaSourceReader.h
+++ b/dom/media/mediasource/MediaSourceReader.h
@@ -92,18 +92,19 @@ public:
   // through.
   bool UseBufferingHeuristics() MOZ_OVERRIDE { return false; }
 
   bool IsMediaSeekable() MOZ_OVERRIDE { return true; }
 
   nsresult ReadMetadata(MediaInfo* aInfo, MetadataTags** aTags) MOZ_OVERRIDE;
   void ReadUpdatedMetadata(MediaInfo* aInfo) MOZ_OVERRIDE;
   nsRefPtr<SeekPromise>
-  Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime,
-       int64_t aCurrentTime) MOZ_OVERRIDE;
+  Seek(int64_t aTime, int64_t aEndTime) MOZ_OVERRIDE;
+
+  void CancelSeek() MOZ_OVERRIDE;
 
   // Acquires the decoder monitor, and is thus callable on any thread.
   nsresult GetBuffered(dom::TimeRanges* aBuffered) MOZ_OVERRIDE;
 
   already_AddRefed<SourceBufferDecoder> CreateSubDecoder(const nsACString& aType,
                                                          int64_t aTimestampOffset /* microseconds */);
 
   void AddTrackBuffer(TrackBuffer* aTrackBuffer);
@@ -187,35 +188,26 @@ private:
   // These are read and written on the decode task queue threads.
   int64_t mLastAudioTime;
   int64_t mLastVideoTime;
 
   // Temporary seek information while we wait for the data
   // to be added to the track buffer.
   MediaPromiseHolder<SeekPromise> mSeekPromise;
   int64_t mPendingSeekTime;
-  int64_t mPendingStartTime;
-  int64_t mPendingEndTime;
-  int64_t mPendingCurrentTime;
   bool mWaitingForSeekData;
+  bool mAudioIsSeeking;
+  bool mVideoIsSeeking;
 
   int64_t mTimeThreshold;
   bool mDropAudioBeforeThreshold;
   bool mDropVideoBeforeThreshold;
 
   bool mEnded;
 
-  // For a seek to complete we need to send a sample with
-  // the mDiscontinuity field set to true once we have the
-  // first decoded sample. These flags are set during seeking
-  // so we can detect when we have the first decoded sample
-  // after a seek.
-  bool mAudioIsSeeking;
-  bool mVideoIsSeeking;
-
   bool mHasEssentialTrackBuffers;
 
   void ContinueShutdown();
   MediaPromiseHolder<ShutdownPromise> mMediaSourceShutdownPromise;
 #ifdef MOZ_FMP4
   nsRefPtr<SharedDecoderManager> mSharedDecoderManager;
 #endif
 };
--- a/dom/media/mediasource/SourceBuffer.cpp
+++ b/dom/media/mediasource/SourceBuffer.cpp
@@ -228,17 +228,17 @@ SourceBuffer::Detach()
 }
 
 void
 SourceBuffer::Ended()
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(IsAttached());
   MSE_DEBUG("SourceBuffer(%p)::Ended", this);
-  mTrackBuffer->DiscardDecoder();
+  mTrackBuffer->EndCurrentDecoder();
 }
 
 SourceBuffer::SourceBuffer(MediaSource* aMediaSource, const nsACString& aType)
   : DOMEventTargetHelper(aMediaSource->GetParentObject())
   , mMediaSource(aMediaSource)
   , mAppendWindowStart(0)
   , mAppendWindowEnd(PositiveInfinity<double>())
   , mTimestampOffset(0)
@@ -327,52 +327,75 @@ SourceBuffer::AbortUpdating()
 }
 
 void
 SourceBuffer::CheckEndTime()
 {
   // Check if we need to update mMediaSource duration
   double endTime = GetBufferedEnd();
   if (endTime > mMediaSource->Duration()) {
-    mMediaSource->SetDuration(endTime);
+    mMediaSource->SetDuration(endTime, MSRangeRemovalAction::SKIP);
   }
 }
 
 void
 SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aRv)
 {
   MSE_DEBUG("SourceBuffer(%p)::AppendData(aLength=%u)", this, aLength);
   if (!PrepareAppend(aRv)) {
     return;
   }
   StartUpdating();
 
   MOZ_ASSERT(mAppendMode == SourceBufferAppendMode::Segments,
              "We don't handle timestampOffset for sequence mode yet");
-  if (!mTrackBuffer->AppendData(aData, aLength, mTimestampOffset * USECS_PER_S)) {
-    Optional<MediaSourceEndOfStreamError> decodeError(MediaSourceEndOfStreamError::Decode);
-    ErrorResult dummy;
-    mMediaSource->EndOfStream(decodeError, dummy);
-    aRv.Throw(NS_ERROR_FAILURE);
-    return;
+  if (aLength) {
+    if (!mTrackBuffer->AppendData(aData, aLength, mTimestampOffset * USECS_PER_S)) {
+      nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethodWithArg<bool>(this, &SourceBuffer::AppendError, true);
+      NS_DispatchToMainThread(event);
+      return;
+    }
+
+    if (mTrackBuffer->HasInitSegment()) {
+      mMediaSource->QueueInitializationEvent();
+    }
+
+    CheckEndTime();
   }
 
-  if (mTrackBuffer->HasInitSegment()) {
-    mMediaSource->QueueInitializationEvent();
-  }
-
-  CheckEndTime();
-
   // Run the final step of the buffer append algorithm asynchronously to
   // ensure the SourceBuffer's updating flag transition behaves as required
   // by the spec.
   nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(this, &SourceBuffer::StopUpdating);
   NS_DispatchToMainThread(event);
 }
 
+void
+SourceBuffer::AppendError(bool aDecoderError)
+{
+  MOZ_ASSERT(NS_IsMainThread());
+  if (!mUpdating) {
+    // The buffer append algorithm has been interrupted by abort().
+    return;
+  }
+  mTrackBuffer->ResetParserState();
+
+  mUpdating = false;
+
+  QueueAsyncSimpleEvent("error");
+  QueueAsyncSimpleEvent("updateend");
+
+  if (aDecoderError) {
+    Optional<MediaSourceEndOfStreamError> decodeError(
+      MediaSourceEndOfStreamError::Decode);
+    ErrorResult dummy;
+    mMediaSource->EndOfStream(decodeError, dummy);
+  }
+}
+
 bool
 SourceBuffer::PrepareAppend(ErrorResult& aRv)
 {
   if (!IsAttached() || mUpdating) {
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return false;
   }
   if (mMediaSource->ReadyState() == MediaSourceReadyState::Ended) {
--- a/dom/media/mediasource/SourceBuffer.h
+++ b/dom/media/mediasource/SourceBuffer.h
@@ -130,16 +130,22 @@ private:
   // If the media segment contains data beyond the current duration,
   // then run the duration change algorithm with new duration set to the
   // maximum of the current duration and the group end timestamp.
   void CheckEndTime();
 
   // Shared implementation of AppendBuffer overloads.
   void AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aRv);
 
+  // Implement the "Append Error Algorithm".
+  // Will call endOfStream() with "decode" error if aDecodeError is true.
+  // 3.5.3 Append Error Algorithm
+  // http://w3c.github.io/media-source/#sourcebuffer-append-error
+  void AppendError(bool aDecoderError);
+
   // Implements the "Prepare Append Algorithm".  Returns true if the append
   // may continue, or false (with aRv set) on error.
   bool PrepareAppend(ErrorResult& aRv);
 
   nsRefPtr<MediaSource> mMediaSource;
 
   uint32_t mEvictionThreshold;
 
--- a/dom/media/mediasource/SourceBufferDecoder.cpp
+++ b/dom/media/mediasource/SourceBufferDecoder.cpp
@@ -88,23 +88,25 @@ bool
 SourceBufferDecoder::IsMediaSeekable()
 {
   MSE_DEBUG("SourceBufferDecoder(%p)::IsMediaSeekable UNIMPLEMENTED", this);
   return false;
 }
 
 void
 SourceBufferDecoder::MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
-                                    nsAutoPtr<MetadataTags> aTags)
+                                    nsAutoPtr<MetadataTags> aTags,
+                                    bool aRestoredFromDromant)
 {
   MSE_DEBUG("SourceBufferDecoder(%p)::MetadataLoaded UNIMPLEMENTED", this);
 }
 
 void
-SourceBufferDecoder::FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo)
+SourceBufferDecoder::FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo,
+                                      bool aRestoredFromDromant)
 {
   MSE_DEBUG("SourceBufferDecoder(%p)::FirstFrameLoaded UNIMPLEMENTED", this);
 }
 
 void
 SourceBufferDecoder::QueueMetadata(int64_t aTime,
                                    nsAutoPtr<MediaInfo> aInfo,
                                    nsAutoPtr<MetadataTags> aTags)
--- a/dom/media/mediasource/SourceBufferDecoder.h
+++ b/dom/media/mediasource/SourceBufferDecoder.h
@@ -44,18 +44,18 @@ public:
   virtual bool OnStateMachineThread() const MOZ_FINAL MOZ_OVERRIDE;
   virtual int64_t GetTimestampOffset() const MOZ_FINAL MOZ_OVERRIDE { return mTimestampOffset; }
   virtual int64_t GetMediaDuration() MOZ_FINAL MOZ_OVERRIDE;
   virtual layers::ImageContainer* GetImageContainer() MOZ_FINAL MOZ_OVERRIDE;
   virtual MediaDecoderOwner* GetOwner() MOZ_FINAL MOZ_OVERRIDE;
   virtual SourceBufferResource* GetResource() const MOZ_FINAL MOZ_OVERRIDE;
   virtual ReentrantMonitor& GetReentrantMonitor() MOZ_FINAL MOZ_OVERRIDE;
   virtual VideoFrameContainer* GetVideoFrameContainer() MOZ_FINAL MOZ_OVERRIDE;
-  virtual void MetadataLoaded(nsAutoPtr<MediaInfo> aInfo, nsAutoPtr<MetadataTags> aTags) MOZ_FINAL MOZ_OVERRIDE;
-  virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo) MOZ_FINAL MOZ_OVERRIDE;
+  virtual void MetadataLoaded(nsAutoPtr<MediaInfo> aInfo, nsAutoPtr<MetadataTags> aTags, bool aRestoredFromDromant) MOZ_FINAL MOZ_OVERRIDE;
+  virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo, bool aRestoredFromDromant) MOZ_FINAL MOZ_OVERRIDE;
   virtual void NotifyBytesConsumed(int64_t aBytes, int64_t aOffset) MOZ_FINAL MOZ_OVERRIDE;
   virtual void NotifyDataArrived(const char* aBuffer, uint32_t aLength, int64_t aOffset) MOZ_FINAL MOZ_OVERRIDE;
   virtual void NotifyDecodedFrames(uint32_t aParsed, uint32_t aDecoded) MOZ_FINAL MOZ_OVERRIDE;
   virtual void NotifyWaitingForResourcesStatusChanged() MOZ_FINAL MOZ_OVERRIDE;
   virtual void OnReadMetadataCompleted() MOZ_FINAL MOZ_OVERRIDE;
   virtual void QueueMetadata(int64_t aTime, nsAutoPtr<MediaInfo> aInfo, nsAutoPtr<MetadataTags> aTags) MOZ_FINAL MOZ_OVERRIDE;
   virtual void RemoveMediaTracks() MOZ_FINAL MOZ_OVERRIDE;
   virtual void SetMediaDuration(int64_t aDuration) MOZ_FINAL MOZ_OVERRIDE;
--- a/dom/media/mediasource/SourceBufferResource.cpp
+++ b/dom/media/mediasource/SourceBufferResource.cpp
@@ -200,16 +200,17 @@ SourceBufferResource::EvictAll()
 }
 
 void
 SourceBufferResource::AppendData(const uint8_t* aData, uint32_t aLength)
 {
   SBR_DEBUG("SourceBufferResource(%p)::AppendData(aData=%p, aLength=%u)", this, aData, aLength);
   ReentrantMonitorAutoEnter mon(mMonitor);
   mInputBuffer.AppendItem(aData, aLength);
+  mEnded = false;
   mon.NotifyAll();
 }
 
 void
 SourceBufferResource::Ended()
 {
   SBR_DEBUG("SourceBufferResource(%p)::Ended()", this);
   ReentrantMonitorAutoEnter mon(mMonitor);
--- a/dom/media/mediasource/TrackBuffer.cpp
+++ b/dom/media/mediasource/TrackBuffer.cpp
@@ -544,16 +544,25 @@ TrackBuffer::DiscardDecoder()
   ReentrantMonitorAutoEnter mon(mParentDecoder->GetReentrantMonitor());
   if (mCurrentDecoder) {
     mCurrentDecoder->GetResource()->Ended();
   }
   mCurrentDecoder = nullptr;
 }
 
 void
+TrackBuffer::EndCurrentDecoder()
+{
+  ReentrantMonitorAutoEnter mon(mParentDecoder->GetReentrantMonitor());
+  if (mCurrentDecoder) {
+    mCurrentDecoder->GetResource()->Ended();
+  }
+}
+
+void
 TrackBuffer::Detach()
 {
   MOZ_ASSERT(NS_IsMainThread());
   if (mCurrentDecoder) {
     DiscardDecoder();
   }
 }
 
@@ -606,16 +615,22 @@ TrackBuffer::BreakCycles()
 void
 TrackBuffer::ResetDecode()
 {
   for (uint32_t i = 0; i < mDecoders.Length(); ++i) {
     mDecoders[i]->GetReader()->ResetDecode();
   }
 }
 
+void
+TrackBuffer::ResetParserState()
+{
+  // TODO
+}
+
 const nsTArray<nsRefPtr<SourceBufferDecoder>>&
 TrackBuffer::Decoders()
 {
   // XXX assert OnDecodeThread
   return mInitializedDecoders;
 }
 
 #ifdef MOZ_EME
--- a/dom/media/mediasource/TrackBuffer.h
+++ b/dom/media/mediasource/TrackBuffer.h
@@ -56,16 +56,18 @@ public:
   // Returns the highest end time of all of the buffered ranges in the
   // decoders managed by this TrackBuffer, and returns the union of the
   // decoders buffered ranges in aRanges. This may be called on any thread.
   double Buffered(dom::TimeRanges* aRanges);
 
   // Mark the current decoder's resource as ended, clear mCurrentDecoder and
   // reset mLast{Start,End}Timestamp.
   void DiscardDecoder();
+  // Mark the current decoder's resource as ended.
+  void EndCurrentDecoder();
 
   void Detach();
 
   // Returns true if an init segment has been appended.
   bool HasInitSegment();
 
   // Returns true iff mParser->HasInitData() and the decoder using that init
   // segment has successfully initialized by setting mHas{Audio,Video}..
@@ -75,16 +77,21 @@ public:
   // contain aTime in their buffered ranges.
   bool ContainsTime(int64_t aTime);
 
   void BreakCycles();
 
   // Call ResetDecode() on each decoder in mDecoders.
   void ResetDecode();
 
+  // Run MSE Reset Parser State Algorithm.
+  // 3.5.2 Reset Parser State
+  // http://w3c.github.io/media-source/#sourcebuffer-reset-parser-state
+  void ResetParserState();
+
   // Returns a reference to mInitializedDecoders, used by MediaSourceReader
   // to select decoders.
   // TODO: Refactor to a cleaner interface between TrackBuffer and MediaSourceReader.
   const nsTArray<nsRefPtr<SourceBufferDecoder>>& Decoders();
 
 #ifdef MOZ_EME
   nsresult SetCDMProxy(CDMProxy* aProxy);
 #endif
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a237f2e91e47869fdc2e934608509eeca1756ae7
GIT binary patch
literal 24424
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
I|6kw#0Wj!TMF0Q*
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d1f5e6a0b01fbfc87299c7e8c4f7389791c69924
GIT binary patch
literal 18279
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
L|BpwW<KzDV<kr7u
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..57232fb359c71a71b96166dcc4e70a0be5939022
GIT binary patch
literal 24607
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f9b18713eebb56471919ec35a04d0cf8a2877604
GIT binary patch
literal 22676
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f2a876946c519f330036dd9ed038b1010d693fab
GIT binary patch
literal 9847
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
XM%wP|{{%9G04Us@_y3|4JTCtWhM#Xt
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..baa0d8578cf7f582aaa41defa8504453ca8819b7
GIT binary patch
literal 22205
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ed313e668ceafdc168ed2213cc5dc4281aa25e8d
GIT binary patch
literal 24013
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7709ac08c554d6883c9edcdd594bb93bcbe8eb41
GIT binary patch
literal 23112
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
IW~|`90G)uwZ2$lO
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6d36788e44dbea6e188d81f4d87fc10ad6545f29
GIT binary patch
literal 18367
zc$~Gm2V7Il_AZ<T1PHxI?^Wp_C<38(1w;j<geFC#2}mcQNs%flAS&1Z1q2%)APK!o
z5drC;BPgLs3)x>#-}8FT|J?7K@4NTT4|Z9ZnLT^0S<gIc%?5!$9R2|zzFz(=?jUkG
zJbU?j1d}hN{5@O_&xZvJ0;AGFu=rd5xCa@8fxw)D>A!Aky?lIJ$rp@XuI?_s>rjy8
z4guF3f64<6<&eMH9^ShI{Jeu*BA>x00<HymgFv+8HXsi2ebcWlj`)H=%+6$a)vtCC
zgJ0K2d=8)a_gG*Of5;#HEr($LkiYvw9{h)V>JNGLAM)Hk<k$a@fBIVvC65PjhCJlM
zcP;s&e%K%NEB}xu{UM+HL!S2U-wR^<OHNDf1C0A6KD-A{|JI4_Z~b!o)~_7-`cTW1
zzf}E)p24h#N7i3@{%HedvJDwPAU&*?i{oJ(R`JuCY|l9qSPrJ>v@lww<)vYhhxK3*
z6VwUhGaDrZ6EuGFOgD|m*rVI3jRUzy_(2#Dh@M@vN<bU{81z73Fgjv;@?ZXJ1M&b2
zyk&GQ#KXJqTX6UV86Br`iub|_Z+75aS5w^dNM5HJ_AcA1)s+?wlzk_Se3SCH63q9^
z`V{j*7G%wHB4*T=uy7?LlpzZhS1r2lOQ-|$JW=@a@=0Xf30d{|>bg20C=8GZ*Jl}z
z$M#Yv&)+ZZQ8V8Dcx<p+PyF4x<K-%b&1Gppr8Ru^F|rF*nY8CY{VqalMn*dY)$e29
z+`<J-=vxh4emfspc4jm_QRCXd7U@Xfy692k&gMt2u<k0QTO^1gx3F&&4%BLQAI8aE
zvO1}%l)<qagA(qhH|v>TURvp7kNCXCCay$tQNGUqLPd&NcGt1<HzM3W8<9qW2PS}p
z7tg`ViuC)FK?f|T^1=}$pt$-&yIa2U+r)G6#h`ip80paON)|B>)-qlo7xqfOHelK{
z;{sr7Vrb;4Z1syju7&TiuSGp`nfWdr7E$E)u9Snt=bkM(*~=_1WPRdE5VmJLR@G+h
zI5pN{6-T!%u*C0v>NT%{incSArN*gj3)4HI7tYXl^#x5oxZnAv)e7=P@y<&YdM^6g
z$CIhK7x$cn+uJ`h+m!PZdFZSsR=m-P7wV-Sx$)?l(t_ez_GAhDL3^eRuye_=(brz>
zXbI!9tZWrE99>P;=RIHt<`rQE9+{b5r}NLFK6Y_S?apy*=$#t(0iW&7NEj-f&DYKe
zAp%i8eXR~simu)ZOn^r8E^G8s1zx;OpRpQ(-X0p~-LCep=sQ5OXI4wMEm7(}8LIfG
z6WaR1{{Y2Ne}|*2El^cU<_5;c=GqU+^SYg9SfQ1I`P|Re@C+Y|7e4YWt9_f2xI4J%
z^U&e=j30EDYi3P_aW0eezJby~I$YEfH*wD`FTsK9$IQ+8^HtMx)*hZz``;{I#D{(!
zbh%uBtm8+1v{x`#NpuOso>DjaFz{~9vBJabAP|_M3O;9sVGQei@Ck|C%x4Na73?Mo
z3=W;B>&Bf<lQk6@djBb}jB|qZitvya%W)Ip^Zp$q-$7f6FkQzI(961Y3<Q~O0J{B0
z*f1SS&W<fr@>lq}55Ctj*jlave(A2a^eZUBF8OoB0GydCS`)Hv(zBn-xNX0p6TmZc
zc^CzCR2Z7ZhxgkXfWV~ErWzkDW$a3`uij$*AT;r1_43Q=@7VoUMO=ERBwtGQvJY_v
zUz$$fb&{PBp$(<GY~6%`ZnuZvBlsTzDu(CEp$5_MCt@BPv6IIfV>DP1ui{dCPnUr|
za~BxJE74)W@CP0MKmwmfsd3tT&qD(29D;J-C-u(v4a%=iDJh>@M6%5Lf+!m`XLge)
zo7v44m}K;~HsdEBf?T1}GhdPkQcVW@Nids>fTdC+jDk{?XYohI?&Pr@Y+&t%(cDY?
z4^T^=uxq=1CjelI#gq&PF!k6Z{vjPwheP%`9A)skCrf5_R53DU65Sy%)o-@pSpF@*
z-b@fx$8&<a)VCOPV#j(;Ay|^Yefm44hF?eih28g|n8b+@<x|3As7Aoe%KDrOBt+kZ
zMXz;si~fRYR&5ClEJe=K0a`cDt-{dhvt!|HMw2ye$jD((d_V#z1T}nI+;5<EZJRf<
z<mq0@qgBsM+d&aD>xUP|qK~H0FIWMMq*a>SDEZKws!KOt+5j~eZ8n@i9unCcwaX8H
za8R0bSc?~3<LA>Dr+$9{#_g?9G%!SWfej5(Ano(3P^3w1&{dlbmk}J--8G1geMmq;
zIg)I<7xm?f(Ip=*Fmv_0_3lerV_r8(^1`=!HtLt@f}Y3nqZzx!x<mt?-?^Uij_STt
zH^;Gion5+fpYTs@&wTQDaFE<H+>O`1gG%Ol7u@QS7^=G0v8ecR5quQjP|{*BaLL-@
z8Pc7jF~Ec_ipiVd0#7P_kyLzfs_kgJ3CO)l&+>|k=Z;>To=4;;wFSl1#!<l}NAm;T
zBxgFd%kuZjE63IZuc9td--{Z#`Z0W^(j)E-6PBt%4|LnO+h;PZK;wJm*V0!H9-Us~
z$8qYGaj|Uco$yWyNa+D_<s(#QOPU0V;;EJ|D$HtQ!~~eUjpdkFA2Sl&d8n2&7dxb-
zOV5SPGRseW?{Q%<8F#e{ObAVN37vasxVpp2<w5c0BnlVwap3@MSL^*H@#IscpbMbB
zY#vSkI(DA|MHgFRLhtD%>Y8#cw51T(Kkb&xg2}0lL}MfkrVw-<K3Bdv%|xg8)LpZc
zs9OXQ0`AFuNJzTz)Zl)2jng?sQE!{V`K*-h4zId{>Kz8{=)JOEzh*!7j?$;F`jKzQ
z4?P<xlH+=HnApk_)C#Q-T0=}@WY0z5gRpAEvmH|#pIK~~5(|x|Txm!hOX%tpEkI0y
zn}AZwD!}Za$EgT18~Zokn>4+II5Si>!G<-=QbW>beGHC#2Y|-r3E=$|Nn5i(yDQi=
zZII`BJHP@~avNGUycFF4{W6~8v9YoDz~Ar!%;3!$jI#11-)`hC0TQ|VaB}=WZ^$m_
za8X^|UY(2pfLU{GcX+#^2n(a;N~TcTWfHR`JlkM?i`n&vo!&V+AQ2$!q``W?By0ov
z{zmglh+8eg))x{;mpf0)2T6dYo$PM>x^=|PYVw@BLZc%B)UXxqfFJ%|pOe*N<P(O7
zK25c_6*(9=WTAQU^)e%x#dZ8tIB2Gi(vtG}t709K%HsLc^DD=yc(VkJ6eEhSb%kg>
z2V^f83Z8(RGI~o)9wV+%Ke$0>ugIaQ&3_$e9oFIa3xHtTpsr@r4t+r;b!%Mnt0_>Y
zWL{pcvUhjxCs~Yu!j?K*L3yp6wS&e%qJ!Jr!&Rgupw)6ym*J+&WuAEJvDM4#!=xYm
zA)YlyT`HUjlns)`BikgW`+^rh16Oa{7?>av9E@Cl-!Ubyw{*jMyRWLIYaiQnZ%AcB
zprs4=8xnN7HY&L-f+de@J!a@*+Kij#FCkNlyb%SXQ&fDc$1+rppHMin?bTCMT-&8s
zyx;EwfF72V4}5A_z4!IU^)bx0I{-LRG(2{I8O%jQ&;)-6HJ)W`?~FuoNwkY>A@@sP
zYtb^{5NR|=pKLgv;n7<?nsjXx;V&wwBtU8DGP}8>K4*%qRz4%liPL3u)q{9)Nq5Bt
z$89dZGR@Aub$WX7R^1DrQB~yT2;jkSdAzFljMU{daojQap6hOwx+m7Ja+>7sL?A>@
zmR}qzdKVEma9(c+y?A?<kRKyg=6=%H8aXs&%s0E|EvN`AnblLMnmRo3<*xcFR{Z+9
zqg`h?W(n7q80y?M>=K&inSJ(_NW#lXQ0QBuDbKHt#z8v;rD`S>17fLWqoS!i=P&hg
zWZ%8!+aSG$ydp~2=I29hDI--75*P6886R#vdHZGTaSwu1^@i$=ZvJt4Rl9+k7m$P-
zH|N!?E{UNj_cIFwt>~{)?6##82jp>oLS={+keVN#3|vXro0!JZUk}TWRe_oEa>&z}
z#Rsg8d(9u*^Y>q9DwnN@`HW25eR<MuVgFq1I{>2)E$LyNxsd)?MvGLi)Mtuh0hP!;
zf?o!4U<8jDt4iFuJa4Va$adQnN-Ekv=l7#BooUtNb#fsn2(j`s2<UX-8m^v*%*`oY
z&e@&W(d^3!OZOo_wJIGPZxW?K==&491rk!WSi5JX^RJj-CGCl{#3{mvmpW+$h=eGL
zW-IbTRc2q*%tVJ!8xncE#9|d+bz~shs)X?eidVkklUnaPZ~-)Ti`rmruSYN3gQ@kr
zG`70d8}>v0M3&v-Y7?xSm&#>+-`KaP>e2O}eLBuF5hXsZcX!e8vDr)=?xT~!>u*;r
zjt?C=Zy*YYm|#-|>o$B`Q~NpxvUj!2epJ>c`F*RC`l*o$m$Vc`U{b5j-m~JIuk!V5
z`k^;pz95r<{qL*Q#iT(3AwOZy1s1lr9elRpjfFD#7gY(65c2#15}1l*eAWsC)!?mS
zWu+#OP)+D=k~F0U?KrR<6kcnFNxvvYoTfDl3fR-%puT1h;o!OdVG@YV7YUubrNx#r
zY$D4tgycbqETrK9ybdV$Yg%~4txKE=W8J!+gPhM9D)Tj9#3m8Z9?ojd%M0MSHY;nu
zpahd{@k}ARq8_))9f2^p?81X8W~TQl1?xeYcZZ+ocor7V8>FUmRu^1~yV&Z(rA%<U
zv`^&&a=fxXs-Sk4dR{H3;W%gbtbX!&L1OY9mzIqFz6Zn1>Qp6zg=Z%BQIw&5<rHsq
zuK5^n@Vd@NwomQJeUo?Wc^~e+`T(*LkwM|jLc*k>YUEfrt6Z46(;g{~aw;g~Xqg%e
z9xx?2v8V?lpAB@MltcR_KbYhXG!<2GU|Rn6Chq&VuwD3x`bzusvaQ{dIVUBWl2GrI
zuQVJzI|KUuc3;AG)LZlN!d>r(D0(&Vae=Qu-HwaDkCI{$#adUNha@4?NYOkcaEO-?
zg0u|-8Ydmy#FmQgEx-K09|Yj>ASU~Jyar=42Tl8{FI5F#kyYD3>=&%Bmu1iuv0@!I
zS2R&XPVf5b-p)@KD|;f;ubi22hYW(1`d&mv^q%8F5i*OSg9BV+LHqmWl4juteEGul
z5!6!76L<8j2!yOAn|Qv}Sjj&9zNN=qer@WkTQB;I%{r+q&Y|&A-{@~*W1-h$CKxsz
zw_cc#npU(P#3G5J3Tgd{$SHV*t{0L<Qd!@H&TS%#T5;{^8SOhj?1N>St9_#gN*J&l
z9sT~n!KH5iezB>|&M9C%-bVmGRZ?}H2TM!w_~uJ;7z;y)g2$#Xc>qzJ6$GOIh#I%!
zV47(T5QYm#L)v>*66Dpebz%HhoCs75b}|b`(OL(?DAPeR_3`=ZLYB;a<SGsS6j%-g
zKGX0pi|uk1d@sMN!^UD4IAj;tY6@bax?)t3NoKAPVwC;J;66IGuMYl2{B#s{zziVZ
z*LbK-AcWlbfySOQm+NK#!ZziI6VOU(_C0ycnI42_$4nhbd=PO2;BR0zEz)8EO`o!q
zyCT*emiDCks+rnDT?F$yCek(y#~G<_8XlO3Lk`=Q#oe~*ppscbz0wXm9K~9{#|B;t
z-0ttI_Q;2niHxR7i=r<)Waz~|oFti!L_5>F#oE$%_(m$xJi4vE@kPiB4G<ZVqUN6i
zQyf&x5!>Ow-VJcQ2c_tV6ubZg_gK<lRsv0;O}KjGUTgO?U(5-j01IOkuYrGk(t8pk
zsPR!d!voq*P}m6vhg&WVNNIo6fS`~{Ofv&*FT|$ez6OFq+A+6{p>omkD{%a%9KmaB
zDj;<hiE-e9#k7tPH9<m5a1g9fb_b-XMC-)2)W8Tbq+&9m5-<md{Gh3KTJ1yuP<)6M
z#8rdJFi4F-;XQzpC)hUEL1f8wHaqPCH~QVSremF_baset50S*L)p%>O7H(WOUug{G
zW6zgWOBk?Hu7}8|5kNZUAm?kyme!W^9R=&~$MbW${{W|EVd~_c0stVCSO$<@qX`HI
z9OljsU>p!^S{P=bXHi1&3-Z3M_V>_4D9GUjhl*U{>p1FD44yq*^$jxPR8cv!MNIN4
z7ne~l8)zJKa;XF!L5#W1czz<Pg>y(RBY5+DIflv!V!El<=chrY80GFX&-ySn;9F(I
zaFij&XcFRLXgZgl9Fw065D?(#qS6~6j~!!{m+@lusxTK`h$4Vfp`?w-)_md{lhs%M
zVX1&D!?8w2*@cw>7$1ihtTL8TybuLgyYT%X@0{hAHNbfQzo8GwDzQ2b#Ac>C7Pxnt
zR2$~_0K{XEh>r>jdz?x0bx2rP2AW76WJa+xj6N8j+{ptAea5N^YrJvFS18Onm;gx3
z4#tD{XC1Bv=*#M;vFS=O^&9zB`pJ`R=+GOshEM?i6vlxbJd+_^2cq=&pXnE}12wwU
z+Wil?^<m)n$6ql(k}FCEd3rQmRScQh9EGnj)_k<oyqvEMqL7X%!G8kQFNRP}e!T>c
zkT4!|5F`7)^f-Tth^FSQpTq)nlc*iKZ(dx6Bf0wk5TBHdo9wB<9;T+K3I8vNB=BcJ
zJT)VEz`x5`APFEXlP`w8L~BXB8W#6ZDxak|BFVvXHqf>G);FuH_vP6rNt~7%-$^)e
zl0G(=J?TLh79g!3SOLpG9q<Bp9BFUH{Mf>RD)~zKIm0~1w=_F(InP@fKa2#7=D0PP
zakReIz&g$A;mwnTa)JH!RTS`vkVbq6tOCH;<o3i1EC8r{m%!b-YM_Ua@NrD$oo3Ug
zD+&#KbzL+$ptWf_B>-U6PqK)MfoIMKd&k2Cd~Zx1yJ^Tp>Q6VckCDwJVGrMA5=DBq
zl&0Y1b3EwfbsOcog0Y(yJ$hB-6?S0_p$!6KhL1922^8;CIY;Ji@Vew87H;-TtC4&d
z02%~n@L}E$nvz7(DAf97Sz8RsE))PVH&0zPPtaDLQ_8F_M`#qqSk_K(k5d#GPQM26
z^>V6Bc!OZ|F&XtsA|H`YjBk7o7R=j1XIXMm<pI>xAp5b)7oJ8U*jBp%fZCTL@^0R(
z9@7d3dT~h)Y#LFtv0I7yNMWk~=(%|Sh;vXsYMspUep=Ljy-OX)1qOmIL}E@}eOA?c
zt(^;-OBCRCw7h1`U}OUFJZ3hOt{H>{_J_omXQgPv1XR}eD;^q>Ep8$R9*-5Vx;chU
z9IBoK>b8LdAYmJe{t>SM0H25UuYCZdfqhcVCKlKNLa=B6NM?+0Kmz|<2zCGhJ@%ic
zkvq63$|35f;sI<kdJ-U2IRm=fc#B?kG0#_fr~v-1_YSKV`<(R9W`rb8Qt%~r|F(PW
zBrvyn*aQK({^t4<JvfIcFh(~lpm8OAZT}?bVkxST4oO~&2E@=?WhACumF>gI__US;
z$iDSUNOR8h*4LH?PxaQG%&^?PV!McJhX*p-QrlnnP^(8Ry*6{h_M@zfS=rAgTz(V5
z!6nJgCl_YT7nIl~8|C`WoBO>tuFvUXX^IXuOL)5}{C!@LVk7?!iA@|{Crddh;SAKB
zI3H~K!d{^dfhMie)JlxYnjnIMu`_V$y1XAcMk3|%w(s`7jE@8=q5z^rKI`d6rniL>
zDGH8Y7$StalaHRI$}SMC%>Yv?Iz)e9o!+EZeaxv<L;<fyUbPc^l|h>=7XuJQd=pdD
zvUn4)2(l+p%kis7gEv}-!T>-Fa!q&{V~5quw~4lfQ+)$`4mSg&!QipS6wy-lNR}-C
zU|QoQzus;n>QFZuXrK}M593ixA|i1A(RNU%;4~9Lg<OAH-x<8tNa5c74gISFHUJ>@
zq~;=l1MZnEMjmGrh&j>*hATe0cxfiks4(V1Ft7N2Ed~soJE>7+T5<``;yJ~D9T$js
z`4JV=%&fpgRm|9NRweVG>0PM54?v#ER>T$wLBX61@&oP&z#~zEkWdD))44k^rKaIz
zLkmZ_%eY~c<CSB}Gfm0QqINN=t{4fbcMR8P9wCs*IXg`%RmyT=zIuTPFy;P6JtE;s
zfy9F?quOlbTP*c`IS2f_RH=7isP;M;1j!Z=Oaf-N0rJDvBkP>4>5{#ufCyk$&6%2q
zy*}IAF<6kx3LRzs>HW?1PJZU^iw9xAyRo}B!QqoFz0S!_I8L18BI;y>A!M-nA-p?j
zE6A?Fq93-oM!HYqycp-kY^PROE--nU!mk{9mW`I{-H{2D_yHQ&&)lVUn)Ly$PQSbf
z2=OZdS;$!;UQNp4A;^iM&8&Y%fZZ`Sdt)9{ewmP31rw$nZc{GzX(@kdwlFo|l1f6(
z63$W67`)oZr@6(yF-VOeS$2O6y~+ALOlL16??PJ5f$7<_R>iz+Zx^pSwiBphpHh2N
zvd)uQbiB~S<fEx&W*fZnj0|hitWXBA6bx4ffgw5~|IRx7?AXCdslxH6-NMh>2~t^L
zg{brb4?2U?gv(RwbRJ>jVD;C`5zoHZ=3Ln`yKpwXjf+Ds>$o<gH|4%~K=UrQ6~+q{
z{A9&uXoC(^FPaPcaIsq0H%gQ1&F4=;`4FOf2hCzCD9)>Zvn@VRCBof$+TuNv@nfyk
z-S8H;4EFqVDyS)__!~MteWKhmRALn(?7l}e52%*aQx;<jF)g3InrWbsC79#}3_JFg
zN!i=P)d>94JtUxrDhduZz9rLxW2GDxJo=EZs+7WQNwKPZ72~iHEJ7Ep#W=uMbQvCD
zJqRC|vx<!<en^;FX0o1@|2oi-4AShmzPe;>zCc@nEr5)@vszeCR*4@j>clYjV685C
zeB$-n6(IWui42$ty2lq(wt)C9hy#y-U{z$)3ZBl5IFdJH$yViuc?S0B4TkD}0H2tg
z%6Sv&k6zw6jcv4v6Kyhigma{U_BDvQ@&rR<jo1@8I1fyx*a|f1$F*f8)Tt^N)+o;p
z7O&yOqbvn0svomwHOZ<;D)U>uEThTaR7o(YIsO5N;=_}^Q#w3lzHpo<0(j@-+#Dr}
z;pi@veEt>%hD+w^R+_P#_gHUyX?EzWhiFbd%`!=VD1ig*lW{MAqXReTCw<lrJjs*)
zbKY(ZcD=!Cb$nYDUCLk2eSVMZ287jr!FS>j^quLWf@%Ah|BUg>;G)JujQ`n3Gr6~=
z5T%N3pquPptAITREShFCbD{xr*(i?dVL^lIH*@WR=89lun!wk#uMMON8LH-`#E4HO
zfjt1vpNU2TWY%GCVrZSr+Map`r#te1ZS3rNBAv7uV+d6(nIZsWR#7VlInNxd$v5aD
z-<;hoeW}q`HO0h`!t^WV%`xviW+{`=s-<gnr<Cm?fin9y%%HZB^&>vLa?R@*s_bW(
zM<7(nh9{4~^ju^r?n>r$W@kwGMhRP3^jHy^y7Vb5y9Eemq*!38C%<-2Ks9Y=1YV?_
zJH8FMK#|e>!<y+N@(l_bfjvN9WQAI2pG<?^ylvK`|F)lA;IaCwV0Tlw{_LUBE|byt
z30<_*@+jmL!bH&9xe-d{b<~1l2j=KJIi35d=LR`|^8?FA=8+P*?O6{<s9<7ohiN`b
zhw|>Low#K(n_S~(I@Buq4(SlYw*eJ^c<PT8_`gDN@C(5i&OeA8na3TLtsjjr?PmRW
zTj<sLeq-HWIvVyFfj~<C;?tIAR3(Gocm@Gv1HSmxBzHyEg-Wmmz99ySRe}jUQX?dA
zOh&7x-qjY&GU6Qfjd_@0@s5%q=h=1^Ua`|XyoHC-d|t_tx`%XPK}d%@>B!*(6OcK1
z@Oud2`~EI#MmkdU0*P{rQvHg#XU(a4ub#a=A88!3_uTj@;l(B{FUj3oXuCgb`Sv4;
zE#pa}N*px{{ltFfEKv5VldWEybcNg)=<!!!L{<gUGUSL@;fjRgb>i6&Jqo}vTIlWD
z$L_|N8oh>6pN<P|$ZK9nyJ})QJZ^`_x>3gRg@o6s-kw0A08%x{tl2ecO6Vwel_u*Y
z=J*&|r{wSRuL0uEeTxfn@W;l*URqNrtHU}Ckx9bg8glZ?!}2o^Yba6j(H<N9*>4D1
zYt5R8s3~?gj%}+Rwd6hWQoG+A^O^=E>tj?isc;%ZX9yYb8XsN0ZIzyw&Fgs9$0*Lp
zuT+*XXffh_CC4Knv22g3=Z9ePoeVa~E>_u-JtTe+n6}snN|X;Y*DTv|Dhe!IMXLb7
zu=ey2H-NyxL~=GW=I{4?s_=tSvEXDGf$B}Iz1rknB%B|{-g-o>rU_<xmFakt#@oH(
zL*hP-oR@z}Qavs3(5aqtit9^5I{e*oKQY?*VfaLso)9+LQ47A6JUoFMqno^CA3zT}
zsJ#(_$=sycTlfVIB-CyQEk<Fi4WV_)r;D|%V0GtKIHcRlTZ8!oG91j?cXdeSqiQYG
z_9ER90A~6{70AQ`z#{hk1zmtRqAak30=EA1^rZnmr*NqM#a)P2<WW>Ppf>{<<McEU
zvQ{mTE}<a_PA<>P1=ws);qEIQK@$(BI*EfYuZ0t|7&|34b@5qpEv>+<?M8k)x*l}v
z*jXgF=CMh^KhWl|_Q7B<#wi77P?vT^=TpA$#pZJ{tb=b-Kg7n&Y4EZpAA%0~>GFA_
zm`if{(4v8Irq6^~*u;{}*Ryvoz5M<|JXw0M72TR8Lq;4j=&=fMxwc6NTcrfko%PUx
zXaPIH`OFdg=YZOg5m(!KOce0Y_e_I&+Ik)bjXl2>b$Bj0=GMYQiwYz~Z6EV|7O;uI
z*ng2rUFVt=T?_H=I~uUIX>5J?c}FZ6RGzZMNOiVFRfTiHx<JJ$!VvYj=FLS9oldD_
z1vd_snS#4pH+h4Joo$!~79I`IvRTJsiiyY4y*wqaV!v{^*{;OEk~wYYDKa5x3h!*B
z^zT+Pi+w4l5DC8yo|_YcBwc+*rewg}uGLGkL+1xby#KJ<j?9kp_y24(Pr+G1xXRz=
zp8jdSg9yhr*;>(4RQ`lD+54ck&C06dGa|@(13Ss-pCs^C>GqW4=7E_)8hEJX+_P9-
zg_7W=(wQbcpKh%_^Oc(J{T`lxu))%s!N!j;%Oc`9)Yx>b!mQYZG)NkCSpfO1{t6lo
z%igle_K)lEMh8L9Z(H{ge1%_v?#yk5yV7m>6efE@v)&P_hLl-h@6FZ*lIzU=nx`Aq
z17oMF=^n>k3J4kuKlu%jTjUpdi6;Ib@rRQ;Z#rYQ%xmrCtcP#Jv+ehp9q>03NIud!
zm)CbzRkDW2%~vIkvmV3fKkZ5mt@wnY%~j&_%J1deH@BdOj<$xv!DY{V+yhUS=NcY)
zmM^TyWL+IV(`T0GyzeK4V8qIYw=gUr8=QO*q5YQzdN6|__y}^J6Ta$xM(IBKLJQqW
z)4~B9J1vAIqQ3V-5wacT$)J%QD>|>ju(T$Iv32KAs205goFwUVBQ5pS5+0iI&ykl7
z2?yZ`zCFy_a#>3cxAcsHlM6jVWNiUN1LBQMpr2Ll=2jSy@tZ21_H<e~)i;-oh2>w%
z1`+$iCw>#JbB1rzgCVk9<0BZ`LD(rAn*=7{7r-jZdyud3UfhXwMg*N`fi|hz>3Ld5
zLXbb3lB3oQ3TP0TkNFvIvPB|@w`)1lD=-DKzt!rbd4=xyVP-`FT+#isz9I1qg=#QE
zZ?Ufk!ylo_Uu)fe7i~&_pBwxYZT<v{YBlRrFmK7jUCd2a&|C^IFdFls?AJ_d<kPc^
zE?SG7D=!M$7;`nJeBE_bWu>bxbyY4R((!(`g|-QYOWxc}tkPSpFJZliXe*w=#TWoZ
z6khlFIl21qY@NQQg`=2H1+K)~?{){-o>NWGq1g1omor>L=i0XpD=j^0!qeSegcLJT
zOgz!bh@summEZubp)agHpuGN2P3~~JA@%b|<{rK;{3h40+g7c72?T%=^91Pg3qMZl
zwrozogfc5$z*W4z?ts&a);7m$dHAc|P6j1N@36YPQU%9c@~PxM7uK0A$9f=1&<x&5
ztj|INvm(BZexA_VtGEX=+MMnpN|;YP4y^JY1UDShn7v7dd4LQulsw~&mTID-s^<{n
zb3Yc*t!K6TIWbQh<K8<RjuJykI4=Q>t0p%fd4`1zo(|@Touz9r49fsXc-EfdnbMvm
zTVW!CA+zDSI9KL}LzT?!+jHz$E;Jsba%PA?eOcCg^+;dLZCmT>?A8w_+9at?$UQ1E
z>QRb8`f-0C9{rbnNwjqw{|(d37o3y)H@Fhs2z)oANti;&qQa)25`;I^iVf6m8C|Ib
z?zY`o0`t2ndr^^aj*>!*f&mi%`blkmmHD@f*4?1#sz>KfFBz-DB#gW#Prl#3nmupv
zWcZX_I7Qu5!h`^^)r=fOCYI$m<Y!x6ygiSX{sjCh&H&v9-yr@R4Gu!k2j=;wo%P;7
zV#%~MYU!9?^YgfPY8jbcd1il?BWdNKNEJ=%iHp;SN+M+kVp=ky_7B)`P4>Gy<o-C)
zVZ>=VW#_K=sP+}l`772hWL;e-chRvQ4IfH-tzVQCUhSM)oA8l6WI_{-4RMA7u7+He
zApZrWjC(Pr@E2!;8LJot40Mt}`IpbL;#QA>U<40$ut;gG*`lA-!5l#m!hMDwlILG8
zcY19H3X$GHNt}^Vis>P99?@GplV@WRZqcVoIWTxhiKAyGc<K%@jlxk#f+~1{lldtS
zdHM2nfUw!r`=U5f!K^E0gUXCupD1-#_t1oWWH7q@RCG>-uz!hFiJ}UjJIxw!=A2hK
zM13=?3~I2Gv)Z~#w}Sss!K$PfymLS8;8~p2vg%pj5ILLBUrG@bl?}o0k$biSP9er0
zBnR3TGXKJ%P1pF5$=EK)g-rRL?DdcwTE^`2k#8P`8vyOUG^nym2l1(2+|+YvzsC>4
zop`s$3Vywu7h7UlfR2v{k{$VBvx~*a(ZkIlY=f1v^ZRIr>@%VSiv;<alsEuC`7gM$
zBLmz({uk>V2>d+ppGk@{fN7*j#-vsnRLki$b#jB*6jm&ZMU=hJe=(FPwW%vJ$*h{N
zi%WgT>pPU$U9Se;QFnwAStr_z-Xphw2BaA2XNU6p$tNg@u)u2dw3+^I!c%y@t(#yr
z#dJyaldQyw@k9-f_MW`mAP{rD>B7Zp5r<y2<3#lt*KkUY1!pbuO<~I(5}r~<U>nyy
zwqo<;y=Z5`uK#7Sx>*e=Z8&o8(L>=KhEBAt<=-ShamKUE=00p2gJ7Jpna)7g;_|-3
zM6RZ6*3nH(wN5OsEDYc7n@NU7iKtN#Z%W=REfuMq&uAwrCxDD61)?!h#cgmfJW@nc
z-d*XatHg(7r%+ehNWEDG9fw#`z8=$7)T{a@1&5<-iYU_@4!*0T6VS!mQmkrzC6n{e
zwbu`15g-7d{$#1ax6KF4l101Kq|ezJ1s($*0s4Q~hIk}ge)~V0#!hfv{@;Z^Cn+Ac
z*kGOyj%$4|r<de+c##WFJnkx4UEXH<4Ak(FDpi|57jFT^?PzYT{>@F=@t0V*lGV=9
z&PXHgaJ$EHU+}2jSXlI$T%n|BI{vl1<(Q$sv~E{nQmh5*<l4r|{Yikl3^YK5fL(Rq
zuTkVzz#I~E_<HGYdp8B>*hvs6&%bmzNyMM(HanXvm29-mpVH&o=D&=S`A|-{QhCh@
zy$Ag(drf}tJV-M9`(rv-_tTn)J3be#TJhSoD4B~4)S-Ci*Y|$b$aWomtW|3LWte^3
z=b(ZAJR^Fn%(EhTz^~Z_WTEMr>Z1aJIMlaIZQgQ=<YFB6fiMA9yWs`E4<QM2GccpG
z!Z~%tT62+4gbfF_h9u9O^=1Wf6bF3Zh|RFZ)b)6ss*UChXgR*FN!I*2+26C9tkNfe
z4)|%15Yp<SX>xY2O079FR0kS;4iq#;E6rwxJLb)!mFZ80ULYZnh<+1dn4M53VgO3D
z$l<_bkJ@O(J1!{4Gn!*rSOkH?S0xDpD#H~O*7c0EXzd+X$jz0V%`R4Z*n3nM(UjP8
zZU2`xvXYo^JWlfY%lc}wy+4S}vJb3mFTuuB69MK@B_C82qqhpQQr&hfWDoflMkw8a
zUqE7<7;v_Fo21K0U$KN+x5s-3##ddf5zf|666^GJzPT@ZsFVHZ@7ead)CUpe0pI^T
z>x971JO4-2GD(w!d8H`R+Z?3TqcDe=#L1ersXN89<_m}%Z;Oy+zp?t8necn^NbASZ
z4S-V&4^!SD6Gw6#q&lq#jb;FWaGyF4_!As<mg)wDF;|m4M)}$mU#8AkP2DePll5l#
zC^{v`v3P89npLT?HA%^^@y&#79_lCb^te{)zm>ervl2{9ZrIW0I$M3DCg_d1jN;Ak
zZrQot=s@DI)Sbp~_z7WzEk<^T&tppJ;esjt`CYdf20CUtxVrmwpyk&q@yh)IrsEnu
zN?_~aBEFy-M-xE2-Z!(3(RT$yzvx^(@xD^61|Y3Vz%hB6tndf>6cC#(eBZ~xLkf~a
zhKxe#7^$1R0t~QZP<*@Z%G9tQcuKFELCKz9Ffb0CHVQqe44aG@zpiOcr*pdDlz5tU
zCTAp;9L?Hu?5m8n=oqPZIO$B$FU2UF=HKo-)cBq732;OTTW@pjH`#_rd<8|CEvZov
z5GViC)hYP8)f2Un_y3)HK-2{nPW~J2!3{LqIa69;PK!`ZM+l$4Pf@r07$ouixwlFv
zb+*Qxr+{QfGnTvGc0HHMqQ2Z5%G#H|mHysjG7F0ah`$k`d!;$cZ@8>6=vrkvTq_{h
zN{IH65Uy3=g6Pv_)stq|NwPVZx7}Qrnn;8TU!3WW8w|tj6(_{b^6k}Y%s8$oS=0+c
zozBp|dAGxTJTh;?o{>B>GQ7iq_EpmF(Pj>WGD<PUM~mR@Q#=cYyt_SnJPLHBYV$tO
zXcda1WVf1V!_ZOlKHZ6UP2mhVhEP!magWZvn-`kf`|ZWS``m@AoDIHr9@*sS+cw1W
zw4J>lR#M1c-%$dtd7k=5Qf78dJC^!YiB^8v)m8A5l-q6kB~DOc@P^qdT|=!Gn_9ZJ
z15dt`*)0_>Z_@k1asQ!b>*<L6!Puh_TxH?@CxZjl9vG=)b<WftCT4&QC6%*4d>iPC
z*2#+-lsZOLr+Uu8ZA`QAa{#OU`kX43K%dy5Z?4Io{`|}vI@K?QrpO<-7M!Y=n%jPY
z{HrOtt-SIb4HR7sA>2su^=#*?3a}l`bOPLZdrVqhL5|C3HAptu8s5S1s;Z7FAKs9X
z5pwn3i8npFxfE{-Ht9^rxZlN--P+io4^kZ};8_h9uTc|p1048j>J>;oAU!r4^^zGr
z#z2Glj52j`;nowHg@t|n=ex7)UwRJiDGby2yp!EK@B6j;W5{7@XNC-v_h&_yv+u*S
z^j$1eNZ(2FzAWY%J_$dEP|*L~=f;z~;}h#ZgC!4TwuYc}Ez9SHyu^n-d@lJR&#32|
z<i@ghQ-i^E;`zh+7&_eUQw3v+`SI~iS-d#tO7X(f&qm0*C(QjKF%coa&#Vufomid*
zt0rC0rH$ft|8fR9*=2&ncG^MDJYbYp58a`!jAl+x`{fPm_d>czwP$hcH7oEyU<v^Q
zriOfv+F@2<o-Co7K<y%b)|x-$7eW65j3int{=Z2UgEql0=>920%gQut6n^D<D(q*+
zKpEn!#IX}b^((#3me0#&zxNrdpZ1EdsiLMljkw)OTX^@=eyWqU^VhUs^xqkrt=YG6
zx$$0sO{SkJTa_2yy+5<zExns1en=?~f}O-IYGB}Ru4}{d@-$qfw0<8<45?UD4P&Gy
z7Y$$8k3Tv)*Xr6?1}qO=1|d(`%S`5TSP-8Y<i}8*FFz4DENG((8{u(C5DK9l`~-2E
zVts$)78iwYdalHgF0VmQ-&b@Xyl-#f<=iAtc99w^(S(Sj=QJ~D(!cx4sMdGrZXT`3
z?{KT=c(k-k0wM-yLK_>anQBo}&a_fWkL~)Q>1_Q8#Qa(1hC*wRN-p1rs95S<(0zK$
zJ@eZq2r?Eqt8(78)YsP_>=O#^i9CTd8oPC52t1OGz*tj*MXq%VT&RcB+E}lxV#c%W
zSIuC`!iQQp2J!WDFs3#66?^@e<F5~D<o_>Lu}^}FTK_KG$|FQEzOpEx>i6a-;T0n_
zu@^#*u=5NAa2iyfcD)~PcGI}~SLW}q?B)(9w5RGMv(1-G$t8RVNyMbR<kHQa7Q5u%
zaA4acF|wld9fo+UsY~zNu%4@SijaQh!sO5J3X_mWGDB|ze?iObe2=KxLW-0{{dE!|
zo&-*AwwjRi+q$|fqW(6ki1k@{L;F3mu=P9fIrYmAL59ibiuGOO^6%#DJG#Es)Xk9m
zjjI@r?TC=6o6$79Xcx}#tzJJbF2xq1qb59$Tw7v4KqW?*pI^O_l45xynSqQ&?|$WU
zX7`fnO)c`py4<Ord~}3}2pQ2s2~go?&cgW;PN<-|h%<@8W}Ca4eMPJED(4J+1)_ie
zM8eOQ_i|twO+Xx9BRt38C$TsIa6>H>`|V2QtEN3FQ}p}|_NqfHN1o>?gE8m^6KGeC
zC9Zzp)lE%H2M#1rWUE_$Yn&<<!~jq`sOmp^UmVa8nF~Sc4Fa8HYmQ8qRZR+FI1Dm_
z>OxF0luscKUSK_Gk2Q5=(>b#Eh{n0xIBBxu#MyE*NHXrR?WWbq7l+Gk6d8yf!9;xU
zn@=T#KzF-^L13`qo|k^Vd3slS=tc47NV54DsG%fb>olgGnXcQr&oo#V;SXqu4nO+j
zXDHiLeo)Mru`mILY=Vho>5w&r>Pz@-Cs`tP{g>qrW9)youhhu@U(j|L@C&nlf(bH#
zx{>;rv8W9k_jLznI5g!i{HaTaMf7MC=mmZPw!-4`n>^7q=EylPKCildx_<1neo2!3
zjx$kqM}S@Liouj|(Jd(Y08L11$NuaZ;W+Nv2O3U23{B6TRD}<*>2egHsjS5OhRV~!
zAN%IG<@}DPoXsjhZyl1UES@_E7yJH^`~8-<R*5x}vAuq^8UV(VM4sjw!o4Lbh%n)2
zDF|vR0KW)+(zjVQlzXw@vQ?Qq2XHXKCM(}XQFt4Y8u}>hV0<#pm;K?nkOtj|Cyl%-
z--)%Nxa<$6RpNuN$pV(r$lV}dwf#LcO?7@!ROjoZi~SJrmEj`4&aO<nbK+%n7CUwA
zU#VdyGQd1nj}~=h!WoD3Ejp8CWrULn><^2;?qAKX$$#?ONtH!-Z=;E#T{6pOI>9PS
zNgox_nnl!fv#SZMb>fG4ow}d6A=~-?7cn3lf=fpKCfeFyAZ)wE={bn)J(&Ot59Nj7
zqoJ7G)Ae<g1cI{we^zD_xy^5&`BCTUsX6>PK^M}%A0@_TawlespzUaS&jx8$cQ;B$
zE2gXHXZ|<3_qp!PMnQcB3Z3E)d2tDOlWAG~Kew6~nOOc{KE&a$IX8!7UX1q8;P8M>
zj4CW8G8kf&)wlN0s&(>!DaGNM2C6fK%2CtgHb8gk&n)mo*0IyoUaZ2jT!DG4UUcu;
z{6cNnWWqN)3ZlM%PAQdEDXR;mq1RcKluc%<OPqQ@jLjMKR`-&ipH4wJ?##c)I=a16
ziPN>gfHc87fjD2K8x&{xv|BSfXYLx7P%ejoz#uq*98cpNKmxGz3r8y<!5}!;Alg8;
z0SD5gRWq5C+XD!@YD|(xa=VHjSdo|oOh*m6zM9HR5_CI4;?Aq)p4<Cci@G$_Aa>+Q
zVot_}$uZPCVEnSm>Z73`h1tuP+@H`z#BH$BAcR2m_+m%(Q82vf#)l;zwU81eS{RNd
zus{iG9<SDqVE+LzjPPuNxtb5_X*<H;#u8MY{mzFXm{58u@%z5ozHDbB%Ecxx?C)gP
zlF-Q9X7o;Yua4h_!F)iU8}Vn3DC&&?MVK77zVOm<cR$XO<7+8Xspux-p(f1l509RS
zSP2vnPSE+P2@!+#@!||Onttbfn!<i5J&T0eMgF|{-{KkIB=C!je@+GaIX$UzhR91M
z{!j|J>M?@;9AWfVE=Klf?i-1<8wA$I%=1?anb@y<IdJBT8IRh^=Raqj8QWudP-{dd
zi8(Vo%t^<21r0*|v3Yb~pbBpPs_?8!L{-#>y=o%ZRHG^{>G9iVwplsz>$5*6(`Ijj
zuj1=mh&&U+2UX={xhKjO5UA?B(V&k}_CszhGYw10Zf85-Dqg%Yf$dqmY)PPL3_^s1
zK!9p)oRb2rWoS}LfSN%Z`A}An69!=pP6EjVW<QI?#WPKnL)AbF7{o0KT-!s?Wekrz
zNki=zxc`1RO4VLx0*OEa4YhPAsdHw-S)*%y&wO2FZ_5aHPgmQ%rFs7j0E$`N=_Wcv
zU@d3YiEurc5sp%3W;Z)|_aaD3^u@|oY0DU!``*45Tf+J%dj+q(Bd_19jIPV&uT8^Z
z@1@sthUmSfYw@vJ%|ZihU$qT5Z1<^DMjjweFTza~oBSXF=TKdTOO6Z~oL=Zfi#N~I
zOdm#X8vnaMBPsaR;(q}&;=h2Vk#=Ze2h^b^^*xyoeR0-b`1!pfikI6?g|C-iFgT6z
z*6bkso!Hq&D=INscXP8f(`@~(GQlZTF}vA|eEmc*k>g8uSy|XWOhx0RKdn5<{}pZJ
z0_zfjzL2}?FpG0*Q?SX|o)2{S_w;1ub?)gskJW?=+i8%(02;v}VBxqpcK<Jsaa?u%
z=frW8Fe+9&(>gPSt$TX9|8>wHTG0E!_PRXV7qR9`eojOa+^LV(SUx*sE>Rm;ekfn4
zEUu_M5nQiJ$4~pXN5gfOj2Kgf1CcdIIa5+d*Yr?>y>d+>qjsbm?9@7X==WoDb)9dr
z7rH;<&sHu=z(QX|yoK$J0IrVN{lYahamh<KefcMue5tQi8JJ{z@&JZhh)l-b3b9pj
zcR}$cii-gOZBYIaAVD9lfSDzo%B;&IrLp97Zvgmp+hbk+$cG{ICn4dTjqZ^GV*8lf
zVxmSg<HVseiW6E|lbCRBz1P}~ih*Ig0;k0Ag%bJS95f$LV<b4wpW!&wfdO+cUjm)I
zFflmQ#xdgSYhtPdqmH?cacJMMy_Jx*ei)dM2$$5NE7HL`dg$}}u(>8VoH8O+f3WZx
z^xKJhF>TsH)}KVyDw=Y!habiv$;k6u*Xril<QnpDS7wcWjqjHl=E!(s_Va3&Ji0$N
zI)9hw)g5Qj)PM7t<BL!KOjn!%cq2{fVFLIDi>jP%`(0(o(aXazw+(|z_kTq?ghmIo
zm48VAmy_NVov~bPNOKVx%Oisf+wxyq)Qwf&Fg`c~n<v90b(wy_Bscs^>vAT`laS0$
z8D^bV<x7iST><-mP;YKeCbQ6GdDY(`>44Oo-W3e3$lx>~>-S-&(IWt?@o`ekubnA;
zg1D7)(>GTFJ8g|=ZPt`{+c?S5p)`<5Kf^#}KiyFo0z2ZEc0P@$5unAunswti@@1j5
z_}Z?ums$@e{5Y=cq96aUS;W!h^E-sQ+^EJ0IbX4m+&IA$jl!?KrJ$RU{AL%t&;ULr
zo^&UP5!O|VD(0YI=j9rR3y6YNXm0~!(HD_ysI54t%citZWGc1-aW@I4srKG>!w1-F
z2lMTz`C)uL7{Gwu^SdQw90rdUujL5*{>-uXbhMQHssAHT0{$VmeDU8v$ySowt8A7)
z(e^@}XSnk(G##BVZ@$cr^;Y2bRlTZEk~$1At%Cfy<9*<`C*o^==7?wfX0NDOVZK}w
z=ITyx7<qGgC=aRQ4Y+BN*WC*o%`QNRVK$4}IajtyqNranuzMdAO)S8J^pjLy2V=1n
z1P~*Lb@Btyl!@WFBm(t|If3ClmjE@-Guh}u@_bt3t^mo|wk+Bwn#Fb`%tIOsPw~&~
zz6m9Y_->>DgtTs<EFqFOSTAI!+#+VJP43f9qyRb}&BFZVte4p{W(i$X29jSsU-w4u
zmtFK<%IdX&$m!~<=krSbfU-6}<_@UVWG=lLv$`bB8p6(WBr){FRaUr2)F6~<D2}%S
z-atFlY_PBqA-RQLW7K;$dtS`7amlP67Qn=XXUY0Ururf73FB9Ra{)T86|qD7y`QT;
zq`g{w(wW!gVOCf`-Q*b1)EeiEFltpv9f(itUOKmTmX-1ITCeWukQ0OlOlSb&^JVq#
zjP?_4c8TG>s-^cT`xv>3XN<=q=gZ}6MrbWsUEp9%*KL&{5X2#>ZAV=s=i}OI{o}b1
zCiG{b-iCF7Qh&*1gTsJ{wCM!T@B;@&yd6mYjSHnN|2J{rD!7>Ke}pkn;YSr9O<gq*
zeJrC@0MCYuH60PM*%dP=;b;stqVt`|S~!yX7e*jGc}n%;=&HEOHN!s(Y}6{afZoWO
z^%CVK0X+UF129=q489mER~tA4z_;-+MoSxDL-8r&O=MPsa7`Nh*wN*`0OUrp*}L4o
z62%BhMT3y@JL1O_Xh&l=1Q`<XeCsn&Hxk$85Va$#H)b{|eEn`PJ8nMAeua2~BWOU?
zqMs19tLJ{w8A400oQnQi2@fqd=hms2=uyI(OI0^`^}4SOJbKg-$+2N{5FGy94NlK0
zn6`N@oKZ`*b!Rn~X?-@5<GyyD()|leL4G@n)5K`1EEKTgfX5T?!XW#(O8_o|vk|E(
zcGiRux58VxV>XrZV6WE|bBrwz`jOCV0fLtHU7Pps!~*N=podz^n0%jJ3Fb*C?({zP
z`OnRWLu@EH|9=h}!oe$caPGhDzJ@wHlCWJ0&i=-4&t^e?1W&S8u^jny97A2GX*{pW
zJU18Y=1I`yN0WShw^0<axP1n9hQTTS36p9rHJ6?|jg2SWC??$ne=EmDR=RMrp4Ei;
z7-irCsqJWn{h_E8IO5UP93W@8P}p$gh3;I^h#Q`2Fpnq<7$mk&nL+L{;A%^B+sc~C
zG|m2^5$oYE;)Y*Ask1fIx5S_v<u_Cp<0GszM5;OZ;@na}!m}4Wzsy{V<bsVPF>(|*
z2R(~@VsUXY1u1*@1<22N{<bKyT$gfCID6_DU(uC&>{DN_Tr|iLkm?w%ql^(V<j;HX
z`3zTjUNp$>RdnnQovX{5)}nCxJ(bk;#`RMVV5j4K*UX#c9zM^n`0cV2zF%UsLCt(^
zE(R`7*BvjovaqBjr|YAZ5=e1hlNX?q*R#5xAAZ_0Nfj%_%XH}yy{_xs2AG!uxBmLK
z;Q``L4+VqAUj+!QMV=yw|JoHI3IBp>B6j^Bo4(}#|HUUGf*`1-JJ0|1qrl<u{{ec=
By$}EZ
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..64f475c7008ffc4aff8338cbec0c3184005c4815
GIT binary patch
literal 24455
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