Merge mozilla-central and inbound
authorEd Morley <emorley@mozilla.com>
Fri, 25 Oct 2013 12:24:13 +0100
changeset 166907 85ade1df059788ab9fd68611302688ea2fcdb9e3
parent 166894 9f8233fcce1d3f0676bc720303dc7bbd7e246c13 (current diff)
parent 166906 b09700a25a86effcb5722353c2251d9f1cdf76cd (diff)
child 166983 e6cf7d359b5a4e8a8868f1d9f7f3c0ca04cdd5fe
child 167007 30d696088b00d44f2867ecd8ffe60b28d8ddf16c
push id428
push userbbajaj@mozilla.com
push dateTue, 28 Jan 2014 00:16:25 +0000
treeherdermozilla-release@cd72a7ff3a75 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone27.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central and inbound
--- a/content/base/src/Element.cpp
+++ b/content/base/src/Element.cpp
@@ -497,18 +497,18 @@ Element::GetScrollFrame(nsIFrame **aStyl
     *aStyledFrame = frame;
   }
   if (!frame) {
     return nullptr;
   }
 
   // menu frames implement GetScrollTargetFrame but we don't want
   // to use it here.  Similar for comboboxes.
-  if (frame->GetType() != nsGkAtoms::menuFrame &&
-      frame->GetType() != nsGkAtoms::comboboxControlFrame) {
+  nsIAtom* type = frame->GetType();
+  if (type != nsGkAtoms::menuFrame && type != nsGkAtoms::comboboxControlFrame) {
     nsIScrollableFrame *scrollFrame = frame->GetScrollTargetFrame();
     if (scrollFrame)
       return scrollFrame;
   }
 
   nsIDocument* doc = OwnerDoc();
   bool quirksMode = doc->GetCompatibilityMode() == eCompatibility_NavQuirks;
   Element* elementWithRootScrollInfo =
--- a/content/html/content/public/HTMLMediaElement.h
+++ b/content/html/content/public/HTMLMediaElement.h
@@ -527,19 +527,19 @@ public:
                                            const nsAString& aLanguage);
 
   void AddTextTrack(TextTrack* aTextTrack) {
     if (mTextTrackManager) {
       mTextTrackManager->AddTextTrack(aTextTrack);
     }
   }
 
-  void RemoveTextTrack(TextTrack* aTextTrack) {
+  void RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly = false) {
     if (mTextTrackManager) {
-      mTextTrackManager->RemoveTextTrack(aTextTrack);
+      mTextTrackManager->RemoveTextTrack(aTextTrack, aPendingListOnly);
     }
   }
 
   /**
    * A public wrapper for FinishDecoderSetup()
    */
   nsresult FinishDecoderSetup(MediaDecoder* aDecoder, MediaResource* aStream) {
     return FinishDecoderSetup(aDecoder, aStream, nullptr, nullptr);
@@ -857,16 +857,21 @@ protected:
   bool CheckAudioChannelPermissions(const nsAString& aType);
 
   // This method does the check for muting/fading/unmuting the audio channel.
   nsresult UpdateChannelMuteState(mozilla::dom::AudioChannelState aCanPlay);
 
   // Update the audio channel playing state
   virtual void UpdateAudioChannelPlayingState();
 
+  // Adds to the element's list of pending text tracks each text track
+  // in the element's list of text tracks whose text track mode is not disabled
+  // and whose text track readiness state is loading.
+  void PopulatePendingTextTrackList();
+
   // The current decoder. Load() has been called on this decoder.
   // At most one of mDecoder and mSrcStream can be non-null.
   nsRefPtr<MediaDecoder> mDecoder;
 
   // A reference to the VideoFrameContainer which contains the current frame
   // of video to display.
   nsRefPtr<VideoFrameContainer> mVideoFrameContainer;
 
--- a/content/html/content/src/HTMLMediaElement.cpp
+++ b/content/html/content/src/HTMLMediaElement.cpp
@@ -3915,10 +3915,18 @@ HTMLMediaElement::AddTextTrack(TextTrack
                                const nsAString& aLabel,
                                const nsAString& aLanguage)
 {
   return mTextTrackManager ? mTextTrackManager->AddTextTrack(aKind, aLabel,
                                                              aLanguage)
                            : nullptr;
 }
 
+void
+HTMLMediaElement::PopulatePendingTextTrackList()
+{
+  if (mTextTrackManager) {
+    mTextTrackManager->PopulatePendingList();
+  }
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/content/html/content/src/HTMLTrackElement.cpp
+++ b/content/html/content/src/HTMLTrackElement.cpp
@@ -62,17 +62,16 @@ namespace mozilla {
 namespace dom {
 
 // The default value for kKindTable is "subtitles"
 static const char* kKindTableDefaultString = kKindTable->tag;
 
 /** HTMLTrackElement */
 HTMLTrackElement::HTMLTrackElement(already_AddRefed<nsINodeInfo> aNodeInfo)
   : nsGenericHTMLElement(aNodeInfo)
-  , mReadyState(NONE)
 {
 #ifdef PR_LOGGING
   if (!gTrackElementLog) {
     gTrackElementLog = PR_NewLogModule("nsTrackElement");
   }
 #endif
 }
 
@@ -300,10 +299,20 @@ HTMLTrackElement::UnbindFromTree(bool aD
     if (aNullParent) {
       mMediaParent = nullptr;
     }
   }
 
   nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent);
 }
 
+uint16_t
+HTMLTrackElement::ReadyState() const
+{
+  if (!mTrack) {
+    return NONE;
+  }
+
+  return mTrack->ReadyState();
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/content/html/content/src/HTMLTrackElement.h
+++ b/content/html/content/src/HTMLTrackElement.h
@@ -97,20 +97,17 @@ public:
 
   // Constants for numeric readyState property values.
   enum {
     NONE = 0U,
     LOADING = 1U,
     LOADED = 2U,
     ERROR = 3U
   };
-  uint16_t ReadyState() const
-  {
-    return mReadyState;
-  }
+  uint16_t ReadyState() const;
 
   TextTrack* Track();
 
   virtual nsresult Clone(nsINodeInfo* aNodeInfo, nsINode** aResult) const MOZ_OVERRIDE;
 
   // For Track, ItemValue reflects the src attribute
   virtual void GetItemValueText(nsAString& aText) MOZ_OVERRIDE
   {
@@ -152,17 +149,16 @@ protected:
 
   friend class TextTrackCue;
   friend class WebVTTListener;
 
   nsRefPtr<TextTrack> mTrack;
   nsCOMPtr<nsIChannel> mChannel;
   nsRefPtr<HTMLMediaElement> mMediaParent;
   nsRefPtr<WebVTTListener> mListener;
-  uint16_t mReadyState;
 
   void CreateTextTrack();
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_HTMLTrackElement_h
--- a/content/html/content/src/TextTrackManager.cpp
+++ b/content/html/content/src/TextTrackManager.cpp
@@ -2,29 +2,32 @@
 /* vim:set tw=80 expandtab softtabstop=2 ts=2 sw=2: */
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/dom/TextTrackManager.h"
 #include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/HTMLTrackElement.h"
 
 namespace mozilla {
 namespace dom {
 
-NS_IMPL_CYCLE_COLLECTION_1(TextTrackManager, mTextTracks)
+NS_IMPL_CYCLE_COLLECTION_2(TextTrackManager, mTextTracks, mPendingTextTracks)
 NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(TextTrackManager, AddRef)
 NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(TextTrackManager, Release)
 
 TextTrackManager::TextTrackManager(HTMLMediaElement *aMediaElement)
   : mMediaElement(aMediaElement)
 {
   MOZ_COUNT_CTOR(TextTrackManager);
   mTextTracks = new TextTrackList(mMediaElement->OwnerDoc()->GetParentObject());
+  mPendingTextTracks =
+    new TextTrackList(mMediaElement->OwnerDoc()->GetParentObject());
 }
 
 TextTrackManager::~TextTrackManager()
 {
   MOZ_COUNT_DTOR(TextTrackManager);
 }
 
 TextTrackList*
@@ -32,37 +35,59 @@ TextTrackManager::TextTracks() const
 {
   return mTextTracks;
 }
 
 already_AddRefed<TextTrack>
 TextTrackManager::AddTextTrack(TextTrackKind aKind, const nsAString& aLabel,
                                const nsAString& aLanguage)
 {
-  return mTextTracks->AddTextTrack(mMediaElement, aKind, aLabel, aLanguage);
+  nsRefPtr<TextTrack> ttrack =
+    mTextTracks->AddTextTrack(mMediaElement, aKind, aLabel, aLanguage);
+  ttrack->SetReadyState(HTMLTrackElement::LOADED);
+  return ttrack.forget();
 }
 
 void
 TextTrackManager::AddTextTrack(TextTrack* aTextTrack)
 {
   mTextTracks->AddTextTrack(aTextTrack);
 }
 
 void
-TextTrackManager::RemoveTextTrack(TextTrack* aTextTrack)
+TextTrackManager::RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly)
 {
+  mPendingTextTracks->RemoveTextTrack(aTextTrack);
+  if (aPendingListOnly) {
+    return;
+  }
+
   mTextTracks->RemoveTextTrack(aTextTrack);
 }
 
 void
 TextTrackManager::DidSeek()
 {
   mTextTracks->DidSeek();
 }
 
 void
 TextTrackManager::Update(double aTime)
 {
   mTextTracks->Update(aTime);
 }
 
+void
+TextTrackManager::PopulatePendingList()
+{
+  uint32_t len = mTextTracks->Length();
+  bool dummy;
+  for (uint32_t index = 0; index < len; ++index) {
+    TextTrack* ttrack = mTextTracks->IndexedGetter(index, dummy);
+    if (ttrack && ttrack->Mode() != TextTrackMode::Disabled &&
+        ttrack->ReadyState() == HTMLTrackElement::LOADING) {
+      mPendingTextTracks->AddTextTrack(ttrack);
+    }
+  }
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/content/html/content/src/TextTrackManager.h
+++ b/content/html/content/src/TextTrackManager.h
@@ -25,29 +25,33 @@ public:
   TextTrackManager(HTMLMediaElement *aMediaElement);
   ~TextTrackManager();
 
   TextTrackList* TextTracks() const;
   already_AddRefed<TextTrack> AddTextTrack(TextTrackKind aKind,
                                            const nsAString& aLabel,
                                            const nsAString& aLanguage);
   void AddTextTrack(TextTrack* aTextTrack);
-  void RemoveTextTrack(TextTrack* aTextTrack);
+  void RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly);
   void DidSeek();
 
   // Update the display of cues on the video as per the current play back time
   // of aTime.
   void Update(double aTime);
 
+  void PopulatePendingList();
+
 private:
   // The HTMLMediaElement that this TextTrackManager manages the TextTracks of.
   // This is a weak reference as the life time of TextTrackManager is dependent
   // on the HTMLMediaElement, so it should not be trying to hold the
   // HTMLMediaElement alive.
   HTMLMediaElement* mMediaElement;
   // List of the TextTrackManager's owning HTMLMediaElement's TextTracks.
   nsRefPtr<TextTrackList> mTextTracks;
+  // List of text track objects awaiting loading.
+  nsRefPtr<TextTrackList> mPendingTextTracks;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_TextTrackManager_h
--- a/content/media/TextTrack.cpp
+++ b/content/media/TextTrack.cpp
@@ -6,16 +6,17 @@
 
 #include "mozilla/dom/TextTrack.h"
 #include "mozilla/dom/TextTrackBinding.h"
 #include "mozilla/dom/TextTrackCue.h"
 #include "mozilla/dom/TextTrackCueList.h"
 #include "mozilla/dom/TextTrackRegion.h"
 #include "mozilla/dom/TextTrackRegionList.h"
 #include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/HTMLTrackElement.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED_5(TextTrack,
                                      nsDOMEventTargetHelper,
                                      mParent,
                                      mMediaElement,
@@ -63,16 +64,17 @@ TextTrack::SetDefaultSettings()
 {
   mKind = TextTrackKind::Subtitles;
   mMode = TextTrackMode::Hidden;
   mCueList = new TextTrackCueList(mParent);
   mActiveCueList = new TextTrackCueList(mParent);
   mRegionList = new TextTrackRegionList(mParent);
   mCuePos = 0;
   mDirty = false;
+  mReadyState = HTMLTrackElement::NONE;
 }
 
 void
 TextTrack::Update(double aTime)
 {
   mCueList->Update(aTime);
 }
 
@@ -165,10 +167,26 @@ TextTrack::GetActiveCues()
     if (cue->StartTime() > playbackTime || cue->EndTime() < playbackTime) {
       break;
     }
     mActiveCueList->AddCue(*cue);
   }
   return mActiveCueList;
 }
 
+uint16_t
+TextTrack::ReadyState() const
+{
+  return mReadyState;
+}
+
+void
+TextTrack::SetReadyState(uint16_t aState)
+{
+  mReadyState = aState;
+  if (mReadyState == HTMLTrackElement::LOADED ||
+      mReadyState == HTMLTrackElement::ERROR) {
+    mMediaElement->RemoveTextTrack(this, true);
+  }
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/content/media/TextTrack.h
+++ b/content/media/TextTrack.h
@@ -87,16 +87,19 @@ public:
   TextTrackRegionList* GetRegions() const
   {
     if (mMode != TextTrackMode::Disabled) {
       return mRegionList;
     }
     return nullptr;
   }
 
+  uint16_t ReadyState() const;
+  void SetReadyState(uint16_t aState);
+
   void AddRegion(TextTrackRegion& aRegion);
   void RemoveRegion(const TextTrackRegion& aRegion, ErrorResult& aRv);
 
   // Time is in seconds.
   void Update(double aTime);
 
   void AddCue(TextTrackCue& aCue);
   void RemoveCue(TextTrackCue& aCue, ErrorResult& aRv);
@@ -116,15 +119,16 @@ private:
   nsString mId;
   TextTrackMode mMode;
 
   nsRefPtr<TextTrackCueList> mCueList;
   nsRefPtr<TextTrackCueList> mActiveCueList;
   nsRefPtr<TextTrackRegionList> mRegionList;
 
   uint32_t mCuePos;
+  uint16_t mReadyState;
   bool mDirty;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_TextTrack_h
--- a/content/media/WebVTTListener.cpp
+++ b/content/media/WebVTTListener.cpp
@@ -73,17 +73,17 @@ WebVTTListener::LoadResource()
 
   nsPIDOMWindow* window = mElement->OwnerDoc()->GetWindow();
   rv = mParserWrapper->LoadParser(window);
   NS_ENSURE_SUCCESS(rv, rv);
 
   rv = mParserWrapper->Watch(this);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  mElement->mReadyState = HTMLTrackElement::LOADING;
+  mElement->mTrack->SetReadyState(HTMLTrackElement::LOADING);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 WebVTTListener::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
                                        nsIChannel* aNewChannel,
                                        uint32_t aFlags,
                                        nsIAsyncVerifyRedirectCallback* cb)
@@ -101,18 +101,18 @@ WebVTTListener::OnStartRequest(nsIReques
   return NS_OK;
 }
 
 NS_IMETHODIMP
 WebVTTListener::OnStopRequest(nsIRequest* aRequest,
                               nsISupports* aContext,
                               nsresult aStatus)
 {
-  if (mElement->mReadyState != HTMLTrackElement::ERROR) {
-    mElement->mReadyState = HTMLTrackElement::LOADED;
+  if (mElement->ReadyState() != HTMLTrackElement::ERROR) {
+    mElement->mTrack->SetReadyState(HTMLTrackElement::LOADED);
   }
   // Attempt to parse any final data the parser might still have.
   mParserWrapper->Flush();
   return NS_OK;
 }
 
 NS_METHOD
 WebVTTListener::ParseChunk(nsIInputStream* aInStream, void* aClosure,
--- a/dom/base/BarProps.cpp
+++ b/dom/base/BarProps.cpp
@@ -12,19 +12,20 @@
 #include "nsIWebBrowserChrome.h"
 
 namespace mozilla {
 namespace dom {
 
 //
 //  Basic (virtual) BarProp class implementation
 //
-BarProp::BarProp(nsGlobalWindow *aWindow)
+BarProp::BarProp(nsGlobalWindow* aWindow)
   : mDOMWindow(aWindow)
 {
+  MOZ_ASSERT(aWindow->IsInnerWindow());
   SetIsDOMBinding();
 }
 
 BarProp::~BarProp()
 {
 }
 
 nsPIDOMWindow*
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -3660,17 +3660,17 @@ nsGlobalWindow::GetPrompter(nsIPrompt** 
 
   NS_ADDREF(*aPrompt = prompter);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetMenubar(nsISupports** aMenubar)
 {
-  FORWARD_TO_OUTER(GetMenubar, (aMenubar), NS_ERROR_NOT_INITIALIZED);
+  FORWARD_TO_INNER(GetMenubar, (aMenubar), NS_ERROR_NOT_INITIALIZED);
 
   *aMenubar = nullptr;
 
   if (!mMenubar) {
     mMenubar = new MenubarProp(this);
     if (!mMenubar) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
@@ -3679,17 +3679,17 @@ nsGlobalWindow::GetMenubar(nsISupports**
   NS_ADDREF(*aMenubar = mMenubar);
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetToolbar(nsISupports** aToolbar)
 {
-  FORWARD_TO_OUTER(GetToolbar, (aToolbar), NS_ERROR_NOT_INITIALIZED);
+  FORWARD_TO_INNER(GetToolbar, (aToolbar), NS_ERROR_NOT_INITIALIZED);
 
   *aToolbar = nullptr;
 
   if (!mToolbar) {
     mToolbar = new ToolbarProp(this);
     if (!mToolbar) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
@@ -3698,17 +3698,17 @@ nsGlobalWindow::GetToolbar(nsISupports**
   NS_ADDREF(*aToolbar = mToolbar);
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetLocationbar(nsISupports** aLocationbar)
 {
-  FORWARD_TO_OUTER(GetLocationbar, (aLocationbar), NS_ERROR_NOT_INITIALIZED);
+  FORWARD_TO_INNER(GetLocationbar, (aLocationbar), NS_ERROR_NOT_INITIALIZED);
 
   *aLocationbar = nullptr;
 
   if (!mLocationbar) {
     mLocationbar = new LocationbarProp(this);
     if (!mLocationbar) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
@@ -3717,17 +3717,17 @@ nsGlobalWindow::GetLocationbar(nsISuppor
   NS_ADDREF(*aLocationbar = mLocationbar);
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetPersonalbar(nsISupports** aPersonalbar)
 {
-  FORWARD_TO_OUTER(GetPersonalbar, (aPersonalbar), NS_ERROR_NOT_INITIALIZED);
+  FORWARD_TO_INNER(GetPersonalbar, (aPersonalbar), NS_ERROR_NOT_INITIALIZED);
 
   *aPersonalbar = nullptr;
 
   if (!mPersonalbar) {
     mPersonalbar = new PersonalbarProp(this);
     if (!mPersonalbar) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
@@ -3736,48 +3736,47 @@ nsGlobalWindow::GetPersonalbar(nsISuppor
   NS_ADDREF(*aPersonalbar = mPersonalbar);
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetStatusbar(nsISupports** aStatusbar)
 {
-  FORWARD_TO_OUTER(GetStatusbar, (aStatusbar), NS_ERROR_NOT_INITIALIZED);
+  FORWARD_TO_INNER(GetStatusbar, (aStatusbar), NS_ERROR_NOT_INITIALIZED);
 
   *aStatusbar = nullptr;
 
   if (!mStatusbar) {
     mStatusbar = new StatusbarProp(this);
     if (!mStatusbar) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
   }
 
   NS_ADDREF(*aStatusbar = mStatusbar);
 
   return NS_OK;
 }
 
 mozilla::dom::BarProp*
-nsGlobalWindow::Scrollbars()
-{
+nsGlobalWindow::GetScrollbars()
+{
+  FORWARD_TO_INNER(GetScrollbars, (), nullptr);
   if (!mScrollbars) {
     mScrollbars = new ScrollbarsProp(this);
   }
 
   return mScrollbars;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetScrollbars(nsISupports** aScrollbars)
 {
-  FORWARD_TO_OUTER(GetScrollbars, (aScrollbars), NS_ERROR_NOT_INITIALIZED);
-
-  NS_ADDREF(*aScrollbars = Scrollbars());
+  NS_IF_ADDREF(*aScrollbars = GetScrollbars());
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsGlobalWindow::GetClosed(bool* aClosed)
 {
   FORWARD_TO_OUTER(GetClosed, (aClosed), NS_ERROR_NOT_INITIALIZED);
 
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -760,17 +760,17 @@ public:
 #undef BEFOREUNLOAD_EVENT
 #undef ERROR_EVENT
 #undef EVENT
 
 #ifdef MOZ_WEBSPEECH
   mozilla::dom::SpeechSynthesis* GetSpeechSynthesisInternal();
 #endif
 
-  mozilla::dom::BarProp* Scrollbars();
+  mozilla::dom::BarProp* GetScrollbars();
 
 protected:
   // Array of idle observers that are notified of idle events.
   nsTObserverArray<IdleObserverHolder> mIdleObservers;
 
   // Idle timer used for function callbacks to notify idle observers.
   nsCOMPtr<nsITimer> mIdleTimer;
 
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/bug877936-2.js
@@ -0,0 +1,5 @@
+rex = RegExp("()()()()()()()()()()(z)?(y)");
+a = ["sub"];
+a[230] = '' + "a"
+f = Function.apply(null, a);
+"xyz".replace(rex, f);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/bug877936.js
@@ -0,0 +1,44 @@
+try{} catch(e){}
+
+function test(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a) {
+  return 0;
+}
+
+
+test();
+test();
+
+/////////////////////
+
+function test2() {
+  return 0;
+}
+
+var a = 1;
+test2(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a);
+test2(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a);
+
+/////////////////////
+
+function test4() {
+  test3()
+}
+
+function test3(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a) {
+  return 0;
+}
+
+test4();
+
+/////////////////////
+
+function test6() {
+  test5.apply({}, [])
+}
+
+function test5() {
+  return 0;
+}
+
+test6();
+test6();
--- a/js/src/jit/CompileInfo.h
+++ b/js/src/jit/CompileInfo.h
@@ -19,26 +19,29 @@ StartArgSlot(JSScript *script, JSFunctio
 {
     // Reserved slots:
     // Slot 0: Scope chain.
     // Slot 1: Return value.
 
     // When needed:
     // Slot 2: Argumentsobject.
 
+    // Note: when updating this, please also update the assert in SnapshotWriter::startFrame
     return 2 + (script->argumentsHasVarBinding() ? 1 : 0);
 }
 
 inline unsigned
 CountArgSlots(JSScript *script, JSFunction *fun)
 {
     // Slot x + 0: This value.
     // Slot x + 1: Argument 1.
     // ...
     // Slot x + n: Argument n.
+
+    // Note: when updating this, please also update the assert in SnapshotWriter::startFrame
     return StartArgSlot(script, fun) + (fun ? fun->nargs + 1 : 0);
 }
 
 // Contains information about the compilation source for IR being generated.
 class CompileInfo
 {
   public:
     CompileInfo(JSScript *script, JSFunction *fun, jsbytecode *osrPc, bool constructing,
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -1652,22 +1652,16 @@ IonCompile(JSContext *cx, JSScript *scri
     bool success = codegen->link(cx, builder->constraints());
 
     IonSpewEndFunction();
 
     return success ? AbortReason_NoAbort : AbortReason_Disable;
 }
 
 static bool
-TooManyArguments(unsigned nargs)
-{
-    return (nargs >= SNAPSHOT_MAX_NARGS || nargs > js_IonOptions.maxStackArgs);
-}
-
-static bool
 CheckFrame(BaselineFrame *frame)
 {
     JS_ASSERT(!frame->isGeneratorFrame());
     JS_ASSERT(!frame->isDebuggerFrame());
 
     // This check is to not overrun the stack.
     if (frame->isFunctionFrame() && TooManyArguments(frame->numActualArgs())) {
         IonSpew(IonSpew_Abort, "too many actual args");
@@ -1897,16 +1891,22 @@ jit::CanEnter(JSContext *cx, RunState &s
         InvokeState &invoke = *state.asInvoke();
 
         if (TooManyArguments(invoke.args().length())) {
             IonSpew(IonSpew_Abort, "too many actual args");
             ForbidCompilation(cx, script);
             return Method_CantCompile;
         }
 
+        if (TooManyArguments(invoke.args().callee().as<JSFunction>().nargs)) {
+            IonSpew(IonSpew_Abort, "too many args");
+            ForbidCompilation(cx, script);
+            return Method_CantCompile;
+        }
+
         if (invoke.constructing() && invoke.args().thisv().isPrimitive()) {
             RootedScript scriptRoot(cx, script);
             RootedObject callee(cx, &invoke.args().callee());
             RootedObject obj(cx, CreateThisForFunction(cx, callee,
                                                        invoke.useNewType()
                                                        ? SingletonObject
                                                        : GenericObject));
             if (!obj || !jit::IsIonEnabled(cx)) // Note: OOM under CreateThis can disable TI.
--- a/js/src/jit/Ion.h
+++ b/js/src/jit/Ion.h
@@ -379,16 +379,22 @@ IsIonEnabled(JSContext *cx)
 inline bool
 IsIonInlinablePC(jsbytecode *pc) {
     // CALL, FUNCALL, FUNAPPLY, EVAL, NEW (Normal Callsites)
     // GETPROP, CALLPROP, and LENGTH. (Inlined Getters)
     // SETPROP, SETNAME, SETGNAME (Inlined Setters)
     return IsCallPC(pc) || IsGetPropPC(pc) || IsSetPropPC(pc);
 }
 
+inline bool
+TooManyArguments(unsigned nargs)
+{
+    return (nargs >= SNAPSHOT_MAX_NARGS || nargs > js_IonOptions.maxStackArgs);
+}
+
 void ForbidCompilation(JSContext *cx, JSScript *script);
 void ForbidCompilation(JSContext *cx, JSScript *script, ExecutionMode mode);
 uint32_t UsesBeforeIonRecompile(JSScript *script, jsbytecode *pc);
 
 void PurgeCaches(JSScript *script, JS::Zone *zone);
 size_t SizeOfIonData(JSScript *script, mozilla::MallocSizeOf mallocSizeOf);
 void DestroyIonScripts(FreeOp *fop, JSScript *script);
 void TraceIonScripts(JSTracer* trc, JSScript *script);
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -261,17 +261,17 @@ IonBuilder::canEnterInlinedFunction(JSFu
     types::TypeObjectKey *targetType = types::TypeObjectKey::get(target);
     if (targetType->unknownProperties())
         return false;
 
     return true;
 }
 
 bool
-IonBuilder::canInlineTarget(JSFunction *target, bool constructing)
+IonBuilder::canInlineTarget(JSFunction *target, CallInfo &callInfo)
 {
     if (!target->isInterpreted()) {
         IonSpew(IonSpew_Inlining, "Cannot inline due to non-interpreted");
         return false;
     }
 
     if (target->getParent() != &script()->global()) {
         IonSpew(IonSpew_Inlining, "Cannot inline due to scope mismatch");
@@ -292,17 +292,17 @@ IonBuilder::canInlineTarget(JSFunction *
         }
     }
 
     if (!target->hasScript()) {
         IonSpew(IonSpew_Inlining, "Cannot inline due to lack of Non-Lazy script");
         return false;
     }
 
-    if (constructing && !target->isInterpretedConstructor()) {
+    if (callInfo.constructing() && !target->isInterpretedConstructor()) {
         IonSpew(IonSpew_Inlining, "Cannot inline because callee is not a constructor");
         return false;
     }
 
     JSScript *inlineScript = target->nonLazyScript();
     ExecutionMode executionMode = info().executionMode();
     if (!CanIonCompile(inlineScript, executionMode)) {
         IonSpew(IonSpew_Inlining, "%s:%d Cannot inline due to disable Ion compilation",
@@ -312,16 +312,28 @@ IonBuilder::canInlineTarget(JSFunction *
 
     // Don't inline functions which don't have baseline scripts.
     if (!inlineScript->hasBaselineScript()) {
         IonSpew(IonSpew_Inlining, "%s:%d Cannot inline target with no baseline jitcode",
                                   inlineScript->filename(), inlineScript->lineno);
         return false;
     }
 
+    if (TooManyArguments(target->nargs)) {
+        IonSpew(IonSpew_Inlining, "%s:%d Cannot inline too many args",
+                                  inlineScript->filename(), inlineScript->lineno);
+        return false;
+    }
+
+    if (TooManyArguments(callInfo.argc())) {
+        IonSpew(IonSpew_Inlining, "%s:%d Cannot inline too many args",
+                                  inlineScript->filename(), inlineScript->lineno);
+        return false;
+    }
+
     // Allow inlining of recursive calls, but only one level deep.
     IonBuilder *builder = callerBuilder_;
     while (builder) {
         if (builder->script() == inlineScript) {
             IonSpew(IonSpew_Inlining, "%s:%d Not inlining recursive call",
                                        inlineScript->filename(), inlineScript->lineno);
             return false;
         }
@@ -3942,17 +3954,17 @@ IonBuilder::makeInliningDecision(JSFunct
     if (target == nullptr)
         return false;
 
     // Native functions provide their own detection in inlineNativeCall().
     if (target->isNative())
         return true;
 
     // Determine whether inlining is possible at callee site
-    if (!canInlineTarget(target, callInfo.constructing()))
+    if (!canInlineTarget(target, callInfo))
         return false;
 
     // Heuristics!
     JSScript *targetScript = target->nonLazyScript();
 
     // Skip heuristics if we have an explicit hint to inline.
     if (!targetScript->shouldInline) {
         // Cap the inlining depth.
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -226,17 +226,17 @@ class IonBuilder : public MIRGenerator
 
     static bool inliningEnabled() {
         return js_IonOptions.inlining;
     }
 
     JSFunction *getSingleCallTarget(types::TemporaryTypeSet *calleeTypes);
     bool getPolyCallTargets(types::TemporaryTypeSet *calleeTypes, bool constructing,
                             ObjectVector &targets, uint32_t maxTargets, bool *gotLambda);
-    bool canInlineTarget(JSFunction *target, bool constructing);
+    bool canInlineTarget(JSFunction *target, CallInfo &callInfo);
 
     void popCfgStack();
     DeferredEdge *filterDeadDeferredEdges(DeferredEdge *edge);
     bool processDeferredContinues(CFGState &state);
     ControlStatus processControlEnd();
     ControlStatus processCfgStack();
     ControlStatus processCfgEntry(CFGState &state);
     ControlStatus processIfEnd(CFGState &state);
--- a/js/src/jit/IonSpewer.cpp
+++ b/js/src/jit/IonSpewer.cpp
@@ -78,25 +78,29 @@ jit::EnableIonDebugLogging()
     ionspewer.init();
 }
 
 void
 jit::IonSpewNewFunction(MIRGraph *graph, HandleScript func)
 {
     if (!OffThreadIonCompilationEnabled(GetIonContext()->runtime)) {
         ionspewer.beginFunction(graph, func);
+        return;
+    }
+
+    if (!IonSpewEnabled(IonSpew_Logs))
+        return;
+
+    // Ionspewer isn't threads-safe. Therefore logging is disabled for
+    // off-thread spewing. Throw informative message when trying.
+    if (func) {
+        IonSpew(IonSpew_Logs, "Can't log script %s:%d. (Compiled on background thread.)",
+                              func->filename(), func->lineno);
     } else {
-        if (func) {
-            IonSpew(IonSpew_Logs,
-                    "Can't log script %s:%d. (Compiled on background thread.)",
-                    func->filename(), func->lineno);
-        } else {
-            IonSpew(IonSpew_Logs,
-                    "Can't log asm.js compilation. (Compiled on background thread.)");
-        }
+        IonSpew(IonSpew_Logs, "Can't log asm.js compilation. (Compiled on background thread.)");
     }
 }
 
 void
 jit::IonSpewPass(const char *pass)
 {
     if (!OffThreadIonCompilationEnabled(GetIonContext()->runtime))
         ionspewer.spewPass(pass);
@@ -337,19 +341,16 @@ jit::CheckLogging()
         EnableChannel(IonSpew_BaselineScripts);
         EnableChannel(IonSpew_BaselineOp);
         EnableChannel(IonSpew_BaselineIC);
         EnableChannel(IonSpew_BaselineICFallback);
         EnableChannel(IonSpew_BaselineOSR);
         EnableChannel(IonSpew_BaselineBailouts);
     }
 
-    if (LoggingBits != 0)
-        EnableIonDebugLogging();
-
     IonSpewFile = stderr;
 }
 
 void
 jit::IonSpewStartVA(IonSpewChannel channel, const char *fmt, va_list ap)
 {
     if (!IonSpewEnabled(channel))
         return;
--- a/js/src/jit/Snapshots.cpp
+++ b/js/src/jit/Snapshots.cpp
@@ -296,17 +296,20 @@ SnapshotWriter::startSnapshot(uint32_t f
 
     writer_.writeUnsigned(bits);
     return lastStart_;
 }
 
 void
 SnapshotWriter::startFrame(JSFunction *fun, JSScript *script, jsbytecode *pc, uint32_t exprStack)
 {
-    JS_ASSERT(CountArgSlots(script, fun) < SNAPSHOT_MAX_NARGS);
+    // Test if we honor the maximum of arguments at all times.
+    // This is a sanity check and not an algorithm limit. So check might be a bit too loose.
+    // +4 to account for scope chain, return value, this value and maybe arguments_object.
+    JS_ASSERT(CountArgSlots(script, fun) < SNAPSHOT_MAX_NARGS + 4);
 
     uint32_t implicit = StartArgSlot(script, fun);
     uint32_t formalArgs = CountArgSlots(script, fun);
 
     nslots_ = formalArgs + script->nfixed + exprStack;
     slotsWritten_ = 0;
 
     IonSpew(IonSpew_Snapshots, "Starting frame; implicit %u, formals %u, fixed %u, exprs %u",
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -3045,75 +3045,90 @@ nsCSSFrameConstructor::ConstructFieldSet
                                               FrameConstructionItem&   aItem,
                                               nsIFrame*                aParentFrame,
                                               const nsStyleDisplay*    aStyleDisplay,
                                               nsFrameItems&            aFrameItems)
 {
   nsIContent* const content = aItem.mContent;
   nsStyleContext* const styleContext = aItem.mStyleContext;
 
-  nsIFrame* newFrame = NS_NewFieldSetFrame(mPresShell, styleContext);
+  nsIFrame* fieldsetFrame = NS_NewFieldSetFrame(mPresShell, styleContext);
 
   // Initialize it
   InitAndRestoreFrame(aState, content,
                       aState.GetGeometricParent(aStyleDisplay, aParentFrame),
-                      newFrame);
+                      fieldsetFrame);
 
   // Resolve style and initialize the frame
   nsRefPtr<nsStyleContext> fieldsetContentStyle;
   fieldsetContentStyle = mPresShell->StyleSet()->
     ResolveAnonymousBoxStyle(nsCSSAnonBoxes::fieldsetContent, styleContext);
 
+  const nsStyleDisplay* fieldsetContentDisplay = fieldsetContentStyle->StyleDisplay();
+  bool isScrollable = fieldsetContentDisplay->IsScrollableOverflow();
+  nsIFrame* scrollFrame = nullptr;
+  if (isScrollable) {
+    fieldsetContentStyle =
+      BeginBuildingScrollFrame(aState, content, fieldsetContentStyle,
+                               fieldsetFrame, nsCSSAnonBoxes::scrolledContent,
+                               false, scrollFrame);
+  }
+
   nsIFrame* blockFrame = NS_NewBlockFrame(mPresShell, fieldsetContentStyle,
                                           NS_BLOCK_FLOAT_MGR |
                                           NS_BLOCK_MARGIN_ROOT);
-  InitAndRestoreFrame(aState, content, newFrame, blockFrame);
-
-  aState.AddChild(newFrame, aFrameItems, content, styleContext, aParentFrame);
+  InitAndRestoreFrame(aState, content,
+    scrollFrame ? scrollFrame : fieldsetFrame, blockFrame);
+
+  aState.AddChild(fieldsetFrame, aFrameItems, content, styleContext, aParentFrame);
   
   // Process children
   nsFrameConstructorSaveState absoluteSaveState;
   nsFrameItems                childItems;
 
-  newFrame->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
-  if (newFrame->IsPositioned()) {
-    aState.PushAbsoluteContainingBlock(newFrame, newFrame, absoluteSaveState);
+  blockFrame->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
+  if (fieldsetFrame->IsPositioned()) {
+    aState.PushAbsoluteContainingBlock(blockFrame, fieldsetFrame, absoluteSaveState);
   }
 
   ProcessChildren(aState, content, styleContext, blockFrame, true,
                   childItems, true, aItem.mPendingBinding);
 
   nsFrameItems fieldsetKids;
-  fieldsetKids.AddChild(blockFrame);
+  fieldsetKids.AddChild(scrollFrame ? scrollFrame : blockFrame);
 
   for (nsFrameList::Enumerator e(childItems); !e.AtEnd(); e.Next()) {
     nsIFrame* child = e.get();
     if (child->GetContentInsertionFrame()->GetType() == nsGkAtoms::legendFrame) {
       // We want the legend to be the first frame in the fieldset child list.
       // That way the EventStateManager will do the right thing when tabbing
       // from a selection point within the legend (bug 236071), which is
       // used for implementing legend access keys (bug 81481).
       // GetAdjustedParentFrame() below depends on this frame order.
       childItems.RemoveFrame(child);
       // Make sure to reparent the legend so it has the fieldset as the parent.
-      fieldsetKids.InsertFrame(newFrame, nullptr, child);
+      fieldsetKids.InsertFrame(fieldsetFrame, nullptr, child);
       break;
     }
   }
 
+  if (isScrollable) {
+    FinishBuildingScrollFrame(scrollFrame, blockFrame);
+  }
+
   // Set the inner frame's initial child lists
   blockFrame->SetInitialChildList(kPrincipalList, childItems);
 
   // Set the outer frame's initial child list
-  newFrame->SetInitialChildList(kPrincipalList, fieldsetKids);
-
-  newFrame->AddStateBits(NS_FRAME_MAY_HAVE_GENERATED_CONTENT);
+  fieldsetFrame->SetInitialChildList(kPrincipalList, fieldsetKids);
+
+  fieldsetFrame->AddStateBits(NS_FRAME_MAY_HAVE_GENERATED_CONTENT);
 
   // Our new frame returned is the outer frame, which is the fieldset frame.
-  return newFrame; 
+  return fieldsetFrame; 
 }
 
 static nsIFrame*
 FindAncestorWithGeneratedContentPseudo(nsIFrame* aFrame)
 {
   for (nsIFrame* f = aFrame->GetParent(); f; f = f->GetParent()) {
     NS_ASSERTION(f->IsGeneratedContentFrame(),
                  "should not have exited generated content");
@@ -3257,16 +3272,27 @@ nsCSSFrameConstructor::FindDataByTag(nsI
 
 #define SIMPLE_TAG_CREATE(_tag, _func)          \
   { &nsGkAtoms::_tag, SIMPLE_FCDATA(_func) }
 #define SIMPLE_TAG_CHAIN(_tag, _func)                                   \
   { &nsGkAtoms::_tag, FCDATA_DECL(FCDATA_FUNC_IS_DATA_GETTER,  _func) }
 #define COMPLEX_TAG_CREATE(_tag, _func)             \
   { &nsGkAtoms::_tag, FULL_CTOR_FCDATA(0, _func) }
 
+static bool
+IsFrameForFieldSet(nsIFrame* aFrame, nsIAtom* aFrameType)
+{
+  nsIAtom* pseudo = aFrame->StyleContext()->GetPseudo();
+  if (pseudo == nsCSSAnonBoxes::fieldsetContent ||
+      pseudo == nsCSSAnonBoxes::scrolledContent) {
+    return IsFrameForFieldSet(aFrame->GetParent(), aFrame->GetParent()->GetType());
+  }
+  return aFrameType == nsGkAtoms::fieldSetFrame;
+}
+
 /* static */
 const nsCSSFrameConstructor::FrameConstructionData*
 nsCSSFrameConstructor::FindHTMLData(Element* aElement,
                                     nsIAtom* aTag,
                                     int32_t aNameSpaceID,
                                     nsIFrame* aParentFrame,
                                     nsStyleContext* aStyleContext)
 {
@@ -3279,19 +3305,17 @@ nsCSSFrameConstructor::FindHTMLData(Elem
 
   NS_ASSERTION(!aParentFrame ||
                aParentFrame->StyleContext()->GetPseudo() !=
                  nsCSSAnonBoxes::fieldsetContent ||
                aParentFrame->GetParent()->GetType() == nsGkAtoms::fieldSetFrame,
                "Unexpected parent for fieldset content anon box");
   if (aTag == nsGkAtoms::legend &&
       (!aParentFrame ||
-       (aParentFrame->GetType() != nsGkAtoms::fieldSetFrame &&
-        aParentFrame->StyleContext()->GetPseudo() !=
-          nsCSSAnonBoxes::fieldsetContent) ||
+       !IsFrameForFieldSet(aParentFrame, aParentFrame->GetType()) ||
        !aElement->GetParent() ||
        !aElement->GetParent()->IsHTML(nsGkAtoms::fieldset) ||
        aStyleContext->StyleDisplay()->IsFloatingStyle() ||
        aStyleContext->StyleDisplay()->IsAbsolutelyPositionedStyle())) {
     // <legend> is only special inside fieldset, check both the frame tree
     // parent and content tree parent due to XBL issues. For floated or
     // absolutely positioned legends we want to construct by display type and
     // not do special legend stuff.
@@ -5914,23 +5938,18 @@ nsCSSFrameConstructor::AppendFramesToPar
 // content perspective, they are not considered siblings in the frame tree.
 bool
 nsCSSFrameConstructor::IsValidSibling(nsIFrame*              aSibling,
                                       nsIContent*            aContent,
                                       uint8_t&               aDisplay)
 {
   nsIFrame* parentFrame = aSibling->GetParent();
   nsIAtom* parentType = nullptr;
-  nsIAtom* grandparentType = nullptr;
   if (parentFrame) {
     parentType = parentFrame->GetType();
-    nsIFrame* grandparentFrame = parentFrame->GetParent();
-    if (grandparentFrame) {
-      grandparentType = grandparentFrame->GetType();
-    }
   }
 
   uint8_t siblingDisplay = aSibling->GetDisplay();
   if ((NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP == siblingDisplay) ||
       (NS_STYLE_DISPLAY_TABLE_COLUMN       == siblingDisplay) ||
       (NS_STYLE_DISPLAY_TABLE_CAPTION      == siblingDisplay) ||
       (NS_STYLE_DISPLAY_TABLE_HEADER_GROUP == siblingDisplay) ||
       (NS_STYLE_DISPLAY_TABLE_ROW_GROUP    == siblingDisplay) ||
@@ -5979,19 +5998,17 @@ nsCSSFrameConstructor::IsValidSibling(ns
          aDisplay == NS_STYLE_DISPLAY_TABLE_COLUMN)) {
       // One's a column or column group and the other is not.  Not valid
       // siblings.
       return false;
     }
 
     return true;
   }
-  else if (nsGkAtoms::fieldSetFrame == parentType ||
-           (nsGkAtoms::fieldSetFrame == grandparentType &&
-            nsGkAtoms::blockFrame == parentType)) {
+  else if (IsFrameForFieldSet(parentFrame, parentType)) {
     // Legends can be sibling of legends but not of other content in the fieldset
     nsIAtom* sibType = aSibling->GetContentInsertionFrame()->GetType();
     bool legendContent = aContent->IsHTML(nsGkAtoms::legend);
 
     if ((legendContent  && (nsGkAtoms::legendFrame != sibType)) ||
         (!legendContent && (nsGkAtoms::legendFrame == sibType)))
       return false;
   }
@@ -7078,17 +7095,17 @@ nsCSSFrameConstructor::ContentRangeInser
     return NS_OK;
   }
   LAYOUT_PHASE_TEMP_REENTER();
 
   // We should only get here with fieldsets when doing a single insert, because
   // fieldsets have multiple insertion points.
   NS_ASSERTION(isSingleInsert || frameType != nsGkAtoms::fieldSetFrame,
                "Unexpected parent");
-  if (frameType == nsGkAtoms::fieldSetFrame &&
+  if (IsFrameForFieldSet(parentFrame, frameType) &&
       aStartChild->Tag() == nsGkAtoms::legend) {
     // Just reframe the parent, since figuring out whether this
     // should be the new legend and then handling it is too complex.
     // We could do a little better here --- check if the fieldset already
     // has a legend which occurs earlier in its child list than this node,
     // and if so, proceed. But we'd have to extend nsFieldSetFrame
     // to locate this legend in the inserted frames and extract it.
     LAYOUT_PHASE_TEMP_EXIT();
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -3917,18 +3917,25 @@ nsDisplayTransform::GetDeltaToTransformO
   NS_PRECONDITION(aFrame->IsTransformed(),
                   "Shouldn't get a delta for an untransformed frame!");
 
   /* For both of the coordinates, if the value of -moz-transform is a
    * percentage, it's relative to the size of the frame.  Otherwise, if it's
    * a distance, it's already computed for us!
    */
   const nsStyleDisplay* display = aFrame->StyleDisplay();
-  nsRect boundingRect = (aBoundsOverride ? *aBoundsOverride :
-                         nsDisplayTransform::GetFrameBoundsForTransform(aFrame));
+  nsRect boundingRect;
+  if (aBoundsOverride) {
+    boundingRect = *aBoundsOverride;
+  } else if (display->mTransformOrigin[0].GetUnit() != eStyleUnit_Coord ||
+             display->mTransformOrigin[1].GetUnit() != eStyleUnit_Coord) {
+    // GetFrameBoundsForTransform is expensive for SVG frames and we don't need
+    // it if the origin is coords (which it is by default for SVG).
+    boundingRect = nsDisplayTransform::GetFrameBoundsForTransform(aFrame);
+  }
 
   /* Allows us to access named variables by index. */
   float coords[2];
   nscoord boundingOffsets[2] = {boundingRect.x, boundingRect.y};
   nscoord boundingDimensions[2] = {boundingRect.width, boundingRect.height};
   nscoord frameOffsets[2] = {aFrame->GetPosition().x, aFrame->GetPosition().y};
 
   for (uint8_t index = 0; index < 2; ++index) {
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -2820,17 +2820,18 @@ GetIntrinsicCoord(const nsStyleCoord& aS
 
 #ifdef DEBUG_INTRINSIC_WIDTH
 static int32_t gNoiseIndent = 0;
 #endif
 
 /* static */ nscoord
 nsLayoutUtils::IntrinsicForContainer(nsRenderingContext *aRenderingContext,
                                      nsIFrame *aFrame,
-                                     IntrinsicWidthType aType)
+                                     IntrinsicWidthType aType,
+                                     uint32_t aFlags)
 {
   NS_PRECONDITION(aFrame, "null frame");
   NS_PRECONDITION(aType == MIN_WIDTH || aType == PREF_WIDTH, "bad type");
 
 #ifdef DEBUG_INTRINSIC_WIDTH
   nsFrame::IndentBy(stdout, gNoiseIndent);
   static_cast<nsFrame*>(aFrame)->ListTag(stdout);
   printf(" %s intrinsic width for container:\n",
@@ -2914,25 +2915,27 @@ nsLayoutUtils::IntrinsicForContainer(nsR
         switch (boxSizing) {
         case NS_STYLE_BOX_SIZING_BORDER: {
           const nsStyleBorder* styleBorder = aFrame->StyleBorder();
           heightTakenByBoxSizing +=
             styleBorder->GetComputedBorder().TopBottom();
           // fall through
         }
         case NS_STYLE_BOX_SIZING_PADDING: {
-          const nsStylePadding* stylePadding = aFrame->StylePadding();
-          nscoord pad;
-          if (GetAbsoluteCoord(stylePadding->mPadding.GetTop(), pad) ||
-              GetPercentHeight(stylePadding->mPadding.GetTop(), aFrame, pad)) {
-            heightTakenByBoxSizing += pad;
-          }
-          if (GetAbsoluteCoord(stylePadding->mPadding.GetBottom(), pad) ||
-              GetPercentHeight(stylePadding->mPadding.GetBottom(), aFrame, pad)) {
-            heightTakenByBoxSizing += pad;
+          if (!(aFlags & IGNORE_PADDING)) {
+            const nsStylePadding* stylePadding = aFrame->StylePadding();
+            nscoord pad;
+            if (GetAbsoluteCoord(stylePadding->mPadding.GetTop(), pad) ||
+                GetPercentHeight(stylePadding->mPadding.GetTop(), aFrame, pad)) {
+              heightTakenByBoxSizing += pad;
+            }
+            if (GetAbsoluteCoord(stylePadding->mPadding.GetBottom(), pad) ||
+                GetPercentHeight(stylePadding->mPadding.GetBottom(), aFrame, pad)) {
+              heightTakenByBoxSizing += pad;
+            }
           }
           // fall through
         }
         case NS_STYLE_BOX_SIZING_CONTENT:
         default:
           break;
         }
 
@@ -2973,28 +2976,32 @@ nsLayoutUtils::IntrinsicForContainer(nsR
 
   // We also need to track what has been added on outside of the box
   // (controlled by 'box-sizing') where 'width', 'min-width' and
   // 'max-width' are applied.  We have to account for these properties
   // after getting all the offsets (margin, border, padding) because
   // percentages do not operate linearly.
   // Doing this is ok because although percentages aren't handled
   // linearly, they are handled monotonically.
-  nscoord coordOutsideWidth = offsets.hPadding;
-  float pctOutsideWidth = offsets.hPctPadding;
-
+  nscoord coordOutsideWidth = 0;
+  float pctOutsideWidth = 0;
   float pctTotal = 0.0f;
 
-  if (boxSizing == NS_STYLE_BOX_SIZING_PADDING) {
-    min += coordOutsideWidth;
-    result = NSCoordSaturatingAdd(result, coordOutsideWidth);
-    pctTotal += pctOutsideWidth;
-
-    coordOutsideWidth = 0;
-    pctOutsideWidth = 0.0f;
+  if (!(aFlags & IGNORE_PADDING)) {
+    coordOutsideWidth += offsets.hPadding;
+    pctOutsideWidth += offsets.hPctPadding;
+
+    if (boxSizing == NS_STYLE_BOX_SIZING_PADDING) {
+      min += coordOutsideWidth;
+      result = NSCoordSaturatingAdd(result, coordOutsideWidth);
+      pctTotal += pctOutsideWidth;
+
+      coordOutsideWidth = 0;
+      pctOutsideWidth = 0.0f;
+    }
   }
 
   coordOutsideWidth += offsets.hBorder;
 
   if (boxSizing == NS_STYLE_BOX_SIZING_BORDER) {
     min += coordOutsideWidth;
     result = NSCoordSaturatingAdd(result, coordOutsideWidth);
     pctTotal += pctOutsideWidth;
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -983,19 +983,23 @@ public:
 
   /**
    * Get the contribution of aFrame to its containing block's intrinsic
    * width.  This considers the child's intrinsic width, its 'width',
    * 'min-width', and 'max-width' properties, and its padding, border,
    * and margin.
    */
   enum IntrinsicWidthType { MIN_WIDTH, PREF_WIDTH };
+  enum {
+    IGNORE_PADDING = 0x01
+  };
   static nscoord IntrinsicForContainer(nsRenderingContext* aRenderingContext,
                                        nsIFrame* aFrame,
-                                       IntrinsicWidthType aType);
+                                       IntrinsicWidthType aType,
+                                       uint32_t aFlags = 0);
 
   /*
    * Convert nsStyleCoord to nscoord when percentages depend on the
    * containing block size.
    * @param aPercentBasis The width or height of the containing block
    * (whichever the client wants to use for resolving percentages).
    */
   static nscoord ComputeCBDependentValue(nscoord aPercentBasis,
--- a/layout/forms/nsFieldSetFrame.cpp
+++ b/layout/forms/nsFieldSetFrame.cpp
@@ -10,16 +10,17 @@
 #include <algorithm>
 #include "nsIFrame.h"
 #include "nsPresContext.h"
 #include "RestyleManager.h"
 #include "nsGkAtoms.h"
 #include "nsStyleConsts.h"
 #include "nsDisplayList.h"
 #include "nsRenderingContext.h"
+#include "nsIScrollableFrame.h"
 #include "mozilla/Likely.h"
 
 using namespace mozilla;
 using namespace mozilla::layout;
 
 class nsFieldSetFrame MOZ_FINAL : public nsContainerFrame {
 public:
   NS_DECL_FRAMEARENA_HELPERS
@@ -73,16 +74,20 @@ public:
                          nsIFrame*      aOldFrame);
 
   virtual nsIAtom* GetType() const;
   virtual bool IsFrameOfType(uint32_t aFlags) const
   {
     return nsContainerFrame::IsFrameOfType(aFlags &
              ~nsIFrame::eCanContainOverflowContainers);
   }
+  virtual nsIScrollableFrame* GetScrollTargetFrame() MOZ_OVERRIDE
+  {
+    return do_QueryFrame(GetInner());
+  }
 
 #ifdef ACCESSIBILITY  
   virtual mozilla::a11y::AccType AccessibleType() MOZ_OVERRIDE;
 #endif
 
 #ifdef DEBUG
   NS_IMETHOD SetInitialChildList(ChildListID    aListID,
                                  nsFrameList&   aChildList);
@@ -351,20 +356,24 @@ nsFieldSetFrame::GetIntrinsicWidth(nsRen
   nscoord legendWidth = 0;
   nscoord contentWidth = 0;
   if (nsIFrame* legend = GetLegend()) {
     legendWidth =
       nsLayoutUtils::IntrinsicForContainer(aRenderingContext, legend, aType);
   }
 
   if (nsIFrame* inner = GetInner()) {
+    // Ignore padding on the inner, since the padding will be applied to the
+    // outer instead, and the padding computed for the inner is wrong
+    // for percentage padding.
     contentWidth =
-      nsLayoutUtils::IntrinsicForContainer(aRenderingContext, inner, aType);
+      nsLayoutUtils::IntrinsicForContainer(aRenderingContext, inner, aType,
+                                           nsLayoutUtils::IGNORE_PADDING);
   }
-      
+
   return std::max(legendWidth, contentWidth);
 }
 
 
 nscoord
 nsFieldSetFrame::GetMinWidth(nsRenderingContext* aRenderingContext)
 {
   nscoord result = 0;
@@ -439,33 +448,35 @@ nsFieldSetFrame::Reflow(nsPresContext*  
     reflowLegend = legend != nullptr;
   } else {
     reflowInner = inner && NS_SUBTREE_DIRTY(inner);
     reflowLegend = legend && NS_SUBTREE_DIRTY(legend);
   }
 
   // We don't allow fieldsets to break vertically. If we did, we'd
   // need logic here to push and pull overflow frames.
-  nsSize availSize(aReflowState.ComputedWidth(), NS_UNCONSTRAINEDSIZE);
+  // Since we're not applying our padding in this frame, we need to add it here
+  // to compute the available width for our children.
+  nsSize availSize(aReflowState.ComputedWidth() + aReflowState.mComputedPadding.LeftRight(),
+                   NS_UNCONSTRAINEDSIZE);
   NS_ASSERTION(!inner ||
       nsLayoutUtils::IntrinsicForContainer(aReflowState.rendContext,
                                            inner,
                                            nsLayoutUtils::MIN_WIDTH) <=
                availSize.width,
                "Bogus availSize.width; should be bigger");
   NS_ASSERTION(!legend ||
       nsLayoutUtils::IntrinsicForContainer(aReflowState.rendContext,
                                            legend,
                                            nsLayoutUtils::MIN_WIDTH) <=
                availSize.width,
                "Bogus availSize.width; should be bigger");
 
   // get our border and padding
-  const nsMargin &borderPadding = aReflowState.mComputedBorderPadding;
-  nsMargin border = borderPadding - aReflowState.mComputedPadding;  
+  nsMargin border = aReflowState.mComputedBorderPadding - aReflowState.mComputedPadding;
 
   // Figure out how big the legend is if there is one. 
   // get the legend's margin
   nsMargin legendMargin(0,0,0,0);
   // reflow the legend only if needed
   if (reflowLegend) {
     nsHTMLReflowState legendReflowState(aPresContext, aReflowState,
                                         legend, availSize);
@@ -476,17 +487,17 @@ nsFieldSetFrame::Reflow(nsPresContext*  
                 0, 0, NS_FRAME_NO_MOVE_FRAME, aStatus);
 #ifdef NOISY_REFLOW
     printf("  returned (%d, %d)\n", legendDesiredSize.width, legendDesiredSize.height);
 #endif
     // figure out the legend's rectangle
     legendMargin = legend->GetUsedMargin();
     mLegendRect.width  = legendDesiredSize.width + legendMargin.left + legendMargin.right;
     mLegendRect.height = legendDesiredSize.height + legendMargin.top + legendMargin.bottom;
-    mLegendRect.x = borderPadding.left;
+    mLegendRect.x = 0;
     mLegendRect.y = 0;
 
     nscoord oldSpace = mLegendSpace;
     mLegendSpace = 0;
     if (mLegendRect.height > border.top) {
       // center the border on the legend
       mLegendSpace = mLegendRect.height - border.top;
     } else {
@@ -508,76 +519,90 @@ nsFieldSetFrame::Reflow(nsPresContext*  
     // mLegendSpace and mLegendRect haven't changed, but we need
     // the used margin when placing the legend.
     legendMargin = legend->GetUsedMargin();
   }
 
   // reflow the content frame only if needed
   if (reflowInner) {
     nsHTMLReflowState kidReflowState(aPresContext, aReflowState, inner,
-                                     availSize);
+                                     availSize, -1, -1, nsHTMLReflowState::CALLER_WILL_INIT);
+    // Override computed padding, in case it's percentage padding
+    kidReflowState.Init(aPresContext, -1, -1, nullptr,
+                        &aReflowState.mComputedPadding);
     // Our child is "height:100%" but we actually want its height to be reduced
     // by the amount of content-height the legend is eating up, unless our
     // height is unconstrained (in which case the child's will be too).
     if (aReflowState.ComputedHeight() != NS_UNCONSTRAINEDSIZE) {
-      kidReflowState.SetComputedHeight(std::max(0, aReflowState.ComputedHeight() - mLegendSpace));
+      kidReflowState.SetComputedHeight(
+         std::max(0, aReflowState.ComputedHeight() - mLegendSpace));
     }
 
-    kidReflowState.mComputedMinHeight =
-      std::max(0, aReflowState.mComputedMinHeight - mLegendSpace);
+    if (aReflowState.mComputedMinHeight > 0) {
+      kidReflowState.mComputedMinHeight =
+        std::max(0, aReflowState.mComputedMinHeight - mLegendSpace);
+    }
 
     if (aReflowState.mComputedMaxHeight != NS_UNCONSTRAINEDSIZE) {
       kidReflowState.mComputedMaxHeight =
         std::max(0, aReflowState.mComputedMaxHeight - mLegendSpace);
     }
 
     nsHTMLReflowMetrics kidDesiredSize(aDesiredSize.mFlags);
     // Reflow the frame
     NS_ASSERTION(kidReflowState.mComputedMargin == nsMargin(0,0,0,0),
                  "Margins on anonymous fieldset child not supported!");
-    nsPoint pt(borderPadding.left, borderPadding.top + mLegendSpace);
+    nsPoint pt(border.left, border.top + mLegendSpace);
     ReflowChild(inner, aPresContext, kidDesiredSize, kidReflowState,
                 pt.x, pt.y, 0, aStatus);
 
     FinishReflowChild(inner, aPresContext, &kidReflowState, 
                       kidDesiredSize, pt.x, pt.y, 0);
     NS_FRAME_TRACE_REFLOW_OUT("FieldSet::Reflow", aStatus);
   }
 
-  nsRect contentRect(0,0,0,0);
+  nsRect contentRect;
   if (inner) {
-    // We don't support margins on inner, so our "content rect" is just
-    // its rect.
+    // We don't support margins on inner, so our content rect is just the
+    // inner's border-box.
     contentRect = inner->GetRect();
   }
 
-  // use the computed width if the inner content does not fill it
-  if (aReflowState.ComputedWidth() > contentRect.width) {
-    contentRect.width = aReflowState.ComputedWidth();
+  // Our content rect must fill up the available width
+  if (availSize.width > contentRect.width) {
+    contentRect.width = availSize.width;
   }
 
   if (legend) {
-    // if the content rect is larger then the  legend we can align the legend
-    if (contentRect.width > mLegendRect.width) {
+    // the legend is postioned horizontally within the inner's content rect
+    // (so that padding on the fieldset affects the legend position).
+    nsRect innerContentRect = contentRect;
+    innerContentRect.Deflate(aReflowState.mComputedPadding);
+    // if the inner content rect is larger than the legend, we can align the legend
+    if (innerContentRect.width > mLegendRect.width) {
       int32_t align = static_cast<nsLegendFrame*>
         (legend->GetContentInsertionFrame())->GetAlign();
 
-      switch(align) {
+      switch (align) {
         case NS_STYLE_TEXT_ALIGN_RIGHT:
-          mLegendRect.x = contentRect.width - mLegendRect.width + borderPadding.left;
+          mLegendRect.x = innerContentRect.XMost() - mLegendRect.width;
           break;
         case NS_STYLE_TEXT_ALIGN_CENTER:
           // Note: rounding removed; there doesn't seem to be any need
-          mLegendRect.x = contentRect.width / 2 - mLegendRect.width / 2 + borderPadding.left;
+          mLegendRect.x = innerContentRect.width / 2 - mLegendRect.width / 2 + innerContentRect.x;
+          break;
+        default:
+          mLegendRect.x = innerContentRect.x;
           break;
       }
-  
     } else {
       // otherwise make place for the legend
-      contentRect.width = mLegendRect.width;
+      mLegendRect.x = innerContentRect.x;
+      innerContentRect.width = mLegendRect.width;
+      contentRect.width = mLegendRect.width + aReflowState.mComputedPadding.LeftRight();
     }
     // place the legend
     nsRect actualLegendRect(mLegendRect);
     actualLegendRect.Deflate(legendMargin);
 
     nsPoint curOrigin = legend->GetPosition();
 
     // only if the origin changed
@@ -589,26 +614,26 @@ nsFieldSetFrame::Reflow(nsPresContext*  
       // children since we're moving the frame after Reflow.
       nsContainerFrame::PositionChildViews(legend);
     }
   }
 
   // Return our size and our result
   if (aReflowState.ComputedHeight() == NS_INTRINSICSIZE) {
     aDesiredSize.height = mLegendSpace + 
-                          borderPadding.TopBottom() +
-                          contentRect.height;
+                          border.TopBottom() +
+                          (inner ? inner->GetRect().height : 0);
   } else {
-    nscoord min = borderPadding.TopBottom() + mLegendRect.height;
+    nscoord min = border.TopBottom() + mLegendRect.height;
     aDesiredSize.height =
-      aReflowState.ComputedHeight() + borderPadding.TopBottom();
+      aReflowState.ComputedHeight() + aReflowState.mComputedBorderPadding.TopBottom();
     if (aDesiredSize.height < min)
       aDesiredSize.height = min;
   }
-  aDesiredSize.width = contentRect.width + borderPadding.LeftRight();
+  aDesiredSize.width = contentRect.width + border.LeftRight();
   aDesiredSize.SetOverflowAreasToDesiredBounds();
   if (legend)
     ConsiderChildOverflow(aDesiredSize.mOverflowAreas, legend);
   if (inner)
     ConsiderChildOverflow(aDesiredSize.mOverflowAreas, inner);
 
   // Merge overflow container bounds and status.
   aDesiredSize.mOverflowAreas.UnionWith(ocBounds);
@@ -676,14 +701,11 @@ nsFieldSetFrame::ReparentFrameList(const
     e.get()->SetParent(inner);
     restyleManager->ReparentStyleContext(e.get());
   }
 }
 
 nscoord
 nsFieldSetFrame::GetBaseline() const
 {
-  // We know inner is a block, so calling GetBaseline() on it will do
-  // the right thing (that being to return the baseline of the last line).
   nsIFrame* inner = GetInner();
-  NS_ASSERTION(nsLayoutUtils::GetAsBlock(inner), "Unexpected inner");
   return inner->GetPosition().y + inner->GetBaseline();
 }
--- a/layout/reftests/bugs/478811-1.html
+++ b/layout/reftests/bugs/478811-1.html
@@ -1,19 +1,21 @@
 <!DOCTYPE html>
-<html style="height: 100%">
+<html class="reftest-wait" style="height: 100%">
   <head>
     <script>
       function doIt() {
         var d = document.createElement("div");
         d.setAttribute("style",
                        "position: absolute; left: 0; right: 0; top: 0; " +
                        "bottom: 0; background: green");
         document.getElementById("x").appendChild(d);
+        document.documentElement.removeAttribute("class");
       }
+      window.addEventListener("MozReftestInvalidate", doIt);
     </script>
   </head>
-  <body style="height: 100%" onload="doIt()">
+  <body style="height: 100%">
     <fieldset id="x" style="position: relative; display: table; width: 50%;
                             height: 50%; top: 25%; left: 25%">
     </fieldset>
   </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/dynamic-legend-scroll-1-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<style>
+fieldset { 
+  background:pink;
+  overflow:hidden;
+  height:100px;
+}
+legend::after { content:"legend"; }
+p {
+  background:lime;
+  height:20px;
+}
+</style>
+</head>
+<body>
+<fieldset id="f1"><legend></legend><p></p></fieldset>
+<br>
+<fieldset id="f2"><legend></legend><p></p></fieldset>
+<br>
+<fieldset id="f3"><legend></legend></fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/dynamic-legend-scroll-1.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<head>
+<style>
+fieldset { 
+  background:pink;
+  overflow:hidden;
+  height:100px;
+}
+legend::after { content:"legend"; }
+p {
+  background:lime;
+  height:20px;
+}
+</style>
+</head>
+<body>
+<fieldset id="f1"><p></p></fieldset>
+<br>
+<fieldset id="f2"><p></p></fieldset>
+<br>
+<fieldset id="f3"></fieldset>
+<script>
+function doTest() {
+  f1.appendChild(document.createElement('legend'));
+  f2.insertBefore(document.createElement('legend'), f2.firstChild);
+  f3.appendChild(document.createElement('legend'));
+  document.documentElement.removeAttribute("class");
+}
+window.addEventListener("MozReftestInvalidate", doTest);
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-hidden-1-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="width:200px; height:200px; padding:0">
+  <legend>Legend</legend>
+  <div style="overflow:hidden; height:100%;">
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+  </div>
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-hidden-1.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="overflow:hidden; width:200px; height:200px; padding:0">
+  <legend>Legend</legend>
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-intrinsic-width-1-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="width:0; padding:0;">
+  <div style="width:400px; height:200px;"></div>
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-intrinsic-width-1.html
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="padding:50px; float:left;">
+  <div style="width:300px; height:100px;"></div>
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-overflow-auto-1-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html><head>
+    <meta charset="utf-8">
+    <title>Testcase for bug 261037</title>
+    <style type="text/css">
+fieldset, div { 
+  background:pink;
+  overflow:auto;
+  height:100px;
+  margin:0; padding:0; border:0;
+}
+p {
+  background:blue;
+  height:100px;
+  margin:0; padding:0;
+}
+.overflow {
+  height:110px;
+}
+.abs {
+  position:absolute;
+  width:100px;
+  top:250px;
+}
+p.abs {
+  top:0;left:0;
+}
+.b { border:10px solid black; }
+.p { padding: 7px 0; }
+.p p { height:114px; }
+    </style>
+</head>
+<body>
+
+<div><p></p></div>
+<br>
+<div><p class="overflow"></p></div>
+<br>
+<div class="abs"><p class="abs"></p></div>
+<br>
+<div class="abs" style="left:120px"><p class="abs overflow"></p></div>
+<br>
+<div class="abs b" style="left:240px"><p class="abs"></p></div>
+<br>
+<div class="abs b" style="left:370px"><p class="abs overflow"></p></div>
+<br>
+<div class="abs b p" style="left:510px"><p class="abs"></p></div>
+<br>
+<div class="abs b p" style="left:640px"><p class="abs overflow"></p></div>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-overflow-auto-1.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html><head>
+    <meta charset="utf-8">
+    <title>Testcase for bug 261037</title>
+    <style type="text/css">
+fieldset, div { 
+  background:pink;
+  overflow:auto;
+  height:100px;
+  margin:0; padding:0; border:0;
+}
+p {
+  background:blue;
+  height:100px;
+  margin:0; padding:0;
+}
+.overflow {
+  height:110px;
+}
+.abs {
+  position:absolute;
+  width:100px;
+  top:250px;
+}
+p.abs {
+  top:0;left:0;
+}
+.b { border:10px solid black; }
+.p { padding: 7px 0; }
+.p p { height:114px; }
+    </style>
+</head>
+<body>
+
+<fieldset><p></p></fieldset>
+<br>
+<fieldset><p class="overflow"></p></fieldset>
+<br>
+<fieldset class="abs"><p class="abs"></p></fieldset>
+<br>
+<fieldset class="abs" style="left:120px"><p class="abs overflow"></p></fieldset>
+<br>
+<fieldset class="abs b" style="left:240px"><p class="abs"></p></fieldset>
+<br>
+<fieldset class="abs b" style="left:370px"><p class="abs overflow"></p></fieldset>
+<br>
+<fieldset class="abs b p" style="left:510px"><p class="abs"></p></fieldset>
+<br>
+<fieldset class="abs b p" style="left:640px"><p class="abs overflow"></p></fieldset>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-percentage-padding-1-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<div style="width:700px; border:2px solid green; overflow:hidden">
+  <fieldset style="padding:140px; width:400px;">
+    <legend>Legend</legend>
+    TextTextTextTextTextText
+  </fieldset>
+  <fieldset style="padding:140px; display:inline;">
+    <legend>Legend</legend>
+    TextTextTextTextTextText
+  </fieldset>
+  <fieldset style="padding:140px; float:left;">
+    <legend>Legend</legend>
+    TextTextTextTextTextText
+  </fieldset>
+</div>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-percentage-padding-1.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<div style="width:700px; border:2px solid green; overflow:hidden">
+  <fieldset style="padding:20%; width:400px;">
+    <legend>Legend</legend>
+    TextTextTextTextTextText
+  </fieldset>
+  <fieldset style="padding:20%; display:inline;">
+    <legend>Legend</legend>
+    TextTextTextTextTextText
+  </fieldset>
+  <fieldset style="padding:20%; float:left;">
+    <legend>Legend</legend>
+    TextTextTextTextTextText
+  </fieldset>
+</div>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-scroll-1-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="width:200px; height:200px; padding:0">
+  <legend>Legend</legend>
+  <div style="overflow:scroll; height:100%">
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-scroll-1.html
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="overflow:scroll; width:200px; height:200px; padding:0">
+  <legend>Legend</legend>
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-scrolled-1-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="width:200px; height:200px; padding:0">
+  <legend style="overflow:hidden">Legend</legend>
+  <div id="d" style="overflow:hidden; height:100%;">
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+    <p>Hello Kitty
+  </div>
+</fieldset>
+<script>
+d.scrollTop = 20;
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/fieldset-scrolled-1.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<body>
+<fieldset id="f" style="overflow:hidden; width:200px; height:200px; padding:0">
+  <legend style="overflow:hidden">Legend</legend>
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+  <p>Hello Kitty
+</fieldset>
+<script>
+f.scrollTop = 0;
+function doTest() {
+  f.scrollTop = 20;
+  document.documentElement.removeAttribute("class");
+}
+window.addEventListener("MozReftestInvalidate", doTest);
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/positioned-container-1-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset style="position:relative; overflow:hidden; width:500px; height:500px;">
+  <legend>Legend</legend>
+  <div style="height:1000px;">
+    <div style="position:absolute; left:20px; top:20px; background:yellow;">Abs-pos</div>
+  </div>
+</fieldset>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/positioned-container-1.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<fieldset id="f" style="position:relative; overflow:hidden; width:500px; height:500px;">
+  <legend>Legend</legend>
+  <div style="height:1000px;">
+    <div style="position:absolute; left:20px; top:50px; background:yellow;">Abs-pos</div>
+  </div>
+</fieldset>
+<script>
+f.scrollTop = 30;
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/forms/fieldset/reftest.list
@@ -0,0 +1,8 @@
+== dynamic-legend-scroll-1.html dynamic-legend-scroll-1-ref.html
+== fieldset-hidden-1.html fieldset-hidden-1-ref.html
+== fieldset-intrinsic-width-1.html fieldset-intrinsic-width-1-ref.html
+== fieldset-percentage-padding-1.html fieldset-percentage-padding-1-ref.html
+== fieldset-scroll-1.html fieldset-scroll-1-ref.html
+== fieldset-scrolled-1.html fieldset-scrolled-1-ref.html
+== fieldset-overflow-auto-1.html fieldset-overflow-auto-1-ref.html
+== positioned-container-1.html positioned-container-1-ref.html
--- a/layout/reftests/forms/reftest.list
+++ b/layout/reftests/forms/reftest.list
@@ -1,16 +1,19 @@
 skip-if(B2G) fails-if(Android) HTTP(..) == text-control-baseline-1.html text-control-baseline-1-ref.html
 
 # button element
 include button/reftest.list
 
 # legend element
 include legend/reftest.list
 
+# fieldset element
+include fieldset/reftest.list
+
 # placeholder
 include placeholder/reftest.list
 
 # input
 include input/reftest.list
 
 # meter element
 include meter/reftest.list
--- a/layout/reftests/text-svgglyphs/reftest.list
+++ b/layout/reftests/text-svgglyphs/reftest.list
@@ -15,8 +15,9 @@ pref(gfx.font_rendering.opentype_svg.ena
 pref(gfx.font_rendering.opentype_svg.enabled,true)    fuzzy(1,12) == svg-glyph-objectopacity.svg svg-glyph-objectopacity-ref.svg # see bug 871961#c5
 pref(gfx.font_rendering.opentype_svg.enabled,true)    == svg-glyph-objectopacity2.svg svg-glyph-objectopacity2-ref.svg
 pref(gfx.font_rendering.opentype_svg.enabled,true)    == svg-glyph-paintnone.svg svg-glyph-paintnone-ref.svg
 pref(gfx.font_rendering.opentype_svg.enabled,true)    == svg-glyph-cachedopacity.svg svg-glyph-cachedopacity-ref.svg
 pref(gfx.font_rendering.opentype_svg.enabled,true)    fuzzy-if(cocoaWidget,255,100) == svg-glyph-objectvalue.svg svg-glyph-objectvalue-ref.svg
 pref(gfx.font_rendering.opentype_svg.enabled,true)    fails == svg-glyph-mask.svg svg-glyph-mask-ref.svg # bug 872483
 pref(gfx.font_rendering.opentype_svg.enabled,true)    == svg-glyph-paint-server.svg svg-glyph-paint-server-ref.svg
 pref(gfx.font_rendering.opentype_svg.enabled,true)    == svg-glyph-transform.svg svg-glyph-transform-ref.svg
+pref(gfx.font_rendering.opentype_svg.enabled,true)    == svg-glyph-extents.html svg-glyph-extents-ref.html
--- a/layout/reftests/text-svgglyphs/resources/README
+++ b/layout/reftests/text-svgglyphs/resources/README
@@ -31,8 +31,31 @@ The tools used here are insertsvg.py fro
 svg.woff can be recreated with:
 
 woff2sfnt nosvg.woff > nosvg.ttf
 insertsvg.py nosvg.ttf svg.ttf glyphs-*.svg
 sfnt2woff svg.ttf
 
 [1] https://github.com/edf825/SVG-OpenType-Utils
 [2] http://people.mozilla.com/~jkew/woff/
+
+
+
+Additional test fonts:
+======================
+
+svg-glyph-extents.otf
+---------------------
+
+This is a copy of Fira Sans with a simple SVG table added using the tool from
+https://github.com/rocallahan/svg-opentype-workshop. The SVG table defines four
+glyphs, corresponding to 'A' through 'D':
+
+ <svg xmlns='http://www.w3.org/2000/svg'>
+   <rect id='glyph36' x='0' y='-1000' width='1000' height='1500' fill='red'/>
+   <rect id='glyph37' x='0' y='-1000' width='1000' height='1500' fill='green' transform='scale(2)'/>
+   <g id='glyph38'>
+     <rect x='0' y='-1000' width='1000' height='1500' fill='red'/>
+   </g>
+   <g id='glyph39'>
+     <rect x='0' y='-1000' width='1000' height='1500' fill='green' transform='scale(2)'/>
+   </g>
+ </svg>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1083f397f6469f878f4babe6a04c3d0f689c0e73
GIT binary patch
literal 183892
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
Ot$?*wh}~DfiT?(i4y-r;
new file mode 100644
--- /dev/null
+++ b/layout/reftests/text-svgglyphs/svg-glyph-extents-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<head>
+<style type="text/css">
+@font-face {
+  font-family: foo;
+  src: url(resources/svg-glyph-extents.otf);
+}
+body {
+  font-family: foo;
+  font-size: 10px;
+}
+div {
+  display: inline-block;
+  height: 100px;
+  width: 100px;
+}
+</style>
+</head>
+<body>
+<div>A</div>
+<div>B</div>
+<div>C</div>
+<div>D</div>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/text-svgglyphs/svg-glyph-extents.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<head>
+<style type="text/css">
+@font-face {
+  font-family: foo;
+  src: url(resources/svg-glyph-extents.otf);
+}
+body {
+  font-family: foo;
+  font-size: 10px;
+}
+@keyframes test {
+  from {
+    font-size: 100px;
+  }
+  to {
+    font-size: 10px;
+  }
+}
+div {
+  display: inline-block;
+  height: 100px;
+  width: 100px;
+  animation-duration: 3s;
+  animation-name: test;
+}
+</style>
+<script type="text/javascript">
+function setup() {
+  var e = document.getElementById("watchme");
+  e.addEventListener("animationend", listener, false);
+}
+function listener() {
+  document.documentElement.className = "";
+}
+</script>
+</head>
+<body onload="setup()">
+<div>A</div>
+<div id="watchme">B</div>
+<div>C</div>
+<div>D</div>
+</body>
+</html>
--- a/layout/style/forms.css
+++ b/layout/style/forms.css
@@ -9,16 +9,19 @@
 
 @namespace url(http://www.w3.org/1999/xhtml); /* set default namespace to HTML */
 @namespace xul url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
 
 *|*::-moz-fieldset-content {
   display: block;
   unicode-bidi: inherit;
   text-overflow: inherit;
+  overflow: inherit;
+  padding: inherit;
+  position: inherit;
   height: 100%;   /* Need this so percentage heights of kids work right */
 }
 
 /* miscellaneous form elements */
 
 fieldset > legend {
   padding-left: 2px;
   padding-right: 2px;
--- a/layout/svg/nsSVGUtils.cpp
+++ b/layout/svg/nsSVGUtils.cpp
@@ -1857,17 +1857,25 @@ nsSVGUtils::GetSVGGlyphExtents(Element* 
                                const gfxMatrix& aSVGToAppSpace,
                                gfxRect* aResult)
 {
   nsIFrame* frame = aElement->GetPrimaryFrame();
   nsISVGChildFrame* svgFrame = do_QueryFrame(frame);
   if (!svgFrame) {
     return false;
   }
-  *aResult = svgFrame->GetBBoxContribution(aSVGToAppSpace,
+
+  gfxMatrix transform(aSVGToAppSpace);
+  nsIContent* content = frame->GetContent();
+  if (content->IsSVG()) {
+    transform = static_cast<nsSVGElement*>(content)->
+                  PrependLocalTransformsTo(aSVGToAppSpace);
+  }
+
+  *aResult = svgFrame->GetBBoxContribution(transform,
     nsSVGUtils::eBBoxIncludeFill | nsSVGUtils::eBBoxIncludeFillGeometry |
     nsSVGUtils::eBBoxIncludeStroke | nsSVGUtils::eBBoxIncludeStrokeGeometry |
     nsSVGUtils::eBBoxIncludeMarkers);
   return true;
 }
 
 nsRect
 nsSVGUtils::ToCanvasBounds(const gfxRect &aUserspaceRect,
--- a/toolkit/components/aboutmemory/content/aboutMemory.css
+++ b/toolkit/components/aboutmemory/content/aboutMemory.css
@@ -57,23 +57,34 @@ div.opsRowLabel {
 div.non-verbose pre.entries {
   overflow-x: hidden;
   text-overflow: ellipsis;
 }
 
 h1 {
   padding: 0;
   margin: 0;
+  display: inline;  /* allow subsequent text to the right of the heading */
 }
 
 h2 {
   background: #ddd;
   padding-left: .1em;
 }
 
+h3 {
+  display: inline;  /* allow subsequent text to the right of the heading */
+}
+
+a.upDownArrow {
+  font-size: 130%;
+  text-decoration: none;
+  -moz-user-select: none;  /* no need to include this when cutting+pasting */
+}
+
 .accuracyWarning {
   color: #d22;
 }
 
 .badInputWarning {
   color: #f00;
 }
 
--- a/toolkit/components/aboutmemory/content/aboutMemory.js
+++ b/toolkit/components/aboutmemory/content/aboutMemory.js
@@ -880,17 +880,17 @@ function appendAboutMemoryMain(aProcessR
     return 0;
   });
 
   // Generate output for each process.
   for (let i = 0; i < processes.length; i++) {
     let process = processes[i];
     let section = appendElement(gMain, 'div', 'section');
 
-    appendProcessAboutMemoryElements(section, process,
+    appendProcessAboutMemoryElements(section, i, process,
                                      pcollsByProcess[process]._trees,
                                      pcollsByProcess[process]._degenerates,
                                      pcollsByProcess[process]._heapTotal,
                                      aHasMozMallocUsableSize);
   }
 }
 
 /**
@@ -1303,30 +1303,56 @@ function appendWarningElements(aP, aHasK
   }
 }
 
 /**
  * Appends the about:memory elements for a single process.
  *
  * @param aP
  *        The parent DOM node.
+ * @param aN
+ *        The number of the process, starting at 0.
  * @param aProcess
  *        The name of the process.
  * @param aTrees
  *        The table of non-degenerate trees for this process.
  * @param aDegenerates
  *        The table of degenerate trees for this process.
  * @param aHasMozMallocUsableSize
  *        Boolean indicating if moz_malloc_usable_size works.
  * @return The generated text.
  */
-function appendProcessAboutMemoryElements(aP, aProcess, aTrees, aDegenerates,
-                                          aHeapTotal, aHasMozMallocUsableSize)
+function appendProcessAboutMemoryElements(aP, aN, aProcess, aTrees,
+                                          aDegenerates, aHeapTotal,
+                                          aHasMozMallocUsableSize)
 {
-  appendElementWithText(aP, "h1", "", aProcess + "\n\n");
+  const kUpwardsArrow   = "\u2191",
+        kDownwardsArrow = "\u2193";
+
+  let appendLink = function(aHere, aThere, aArrow) {
+    let link = appendElementWithText(aP, "a", "upDownArrow", aArrow);
+    link.href = "#" + aThere + aN;
+    link.id = aHere + aN;
+    link.title = "Go to the " + aThere + " of " + aProcess;
+    link.style = "text-decoration: none";
+
+    // This jumps to the anchor without the page location getting the anchor
+    // name tacked onto its end, which is what happens with a vanilla link.
+    link.addEventListener("click", function(event) {
+      document.documentElement.scrollTop =
+        document.querySelector(event.target.href).offsetTop;
+      event.preventDefault();
+    }, false);
+
+    // This gives nice spacing when we copy and paste.
+    appendElementWithText(aP, "span", "", "\n");
+  }
+
+  appendElementWithText(aP, "h1", "", aProcess);
+  appendLink("start", "end", kDownwardsArrow);
 
   // We'll fill this in later.
   let warningsDiv = appendElement(aP, "div", "accuracyWarning");
 
   // The explicit tree.
   let hasKnownHeapAllocated;
   {
     let treeName = "explicit";
@@ -1342,17 +1368,17 @@ function appendProcessAboutMemoryElement
       hasKnownHeapAllocated =
         aDegenerates &&
         addHeapUnclassifiedNode(t, aDegenerates["heap-allocated"], aHeapTotal);
       sortTreeAndInsertAggregateNodes(t._amount, t);
       t._description = explicitTreeDescription;
       appendTreeElements(pre, t, aProcess, "");
       delete aTrees[treeName];
     }
-    appendTextNode(aP, "\n");  // gives nice spacing when we cut and paste
+    appendTextNode(aP, "\n");  // gives nice spacing when we copy and paste
   }
 
   // Fill in and sort all the non-degenerate other trees.
   let otherTrees = [];
   for (let unsafeName in aTrees) {
     let t = aTrees[unsafeName];
     assert(!t._isDegenerate, "tree is degenerate");
     fillInTree(t);
@@ -1383,23 +1409,26 @@ function appendProcessAboutMemoryElement
     appendTreeElements(pre, t, aProcess, "");
     appendTextNode(pre, "\n");  // blank lines after non-degenerate trees
   }
   for (let i = 0; i < otherDegenerates.length; i++) {
     let t = otherDegenerates[i];
     let padText = pad("", maxStringLength - t.toString().length, ' ');
     appendTreeElements(pre, t, aProcess, padText);
   }
-  appendTextNode(aP, "\n");  // gives nice spacing when we cut and paste
+  appendTextNode(aP, "\n");  // gives nice spacing when we copy and paste
 
   // Add any warnings about inaccuracies due to platform limitations.
   // These must be computed after generating all the text.  The newlines give
-  // nice spacing if we cut+paste into a text buffer.
+  // nice spacing if we copy+paste into a text buffer.
   appendWarningElements(warningsDiv, hasKnownHeapAllocated,
                         aHasMozMallocUsableSize);
+
+  appendElementWithText(aP, "h3", "", "End of " + aProcess);
+  appendLink("end", "start", kUpwardsArrow);
 }
 
 /**
  * Determines if a number has a negative sign when converted to a string.
  * Works even for -0.
  *
  * @param aN
  *        The number.
@@ -1512,17 +1541,17 @@ function pad(aS, aN, aC)
   for (let i = 0; i < n2; i++) {
     padding += aC;
   }
   return padding + aS;
 }
 
 // There's a subset of the Unicode "light" box-drawing chars that is widely
 // implemented in terminals, and this code sticks to that subset to maximize
-// the chance that cutting and pasting about:memory output to a terminal will
+// the chance that copying and pasting about:memory output to a terminal will
 // work correctly.
 const kHorizontal                   = "\u2500",
       kVertical                     = "\u2502",
       kUpAndRight                   = "\u2514",
       kUpAndRight_Right_Right       = "\u2514\u2500\u2500",
       kVerticalAndRight             = "\u251c",
       kVerticalAndRight_Right_Right = "\u251c\u2500\u2500",
       kVertical_Space_Space         = "\u2502  ";
--- a/toolkit/components/aboutmemory/tests/test_aboutmemory.xul
+++ b/toolkit/components/aboutmemory/tests/test_aboutmemory.xul
@@ -274,16 +274,17 @@ 888.00 MB ── explicit\n\
 500.00 MB ── heap-allocated\n\
 100.00 MB ── heap-unallocated\n\
 222.00 MB ── other2\n\
       777 ── other3\n\
       888 ── other4 [2]\n\
    45.67% ── perc1\n\
   100.00% ── perc2\n\
 \n\
+End of Main Process\n\
 4th\n\
 \n\
 WARNING: the following values are negative or unreasonably large.\n\
 \n\
     explicit/js/compartment(http://too-big.com/)/stuff\n\
     explicit/(2 tiny)\n\
     explicit/(2 tiny)/neg1\n\
     explicit/(2 tiny)/heap-unclassified\n\
@@ -309,47 +310,50 @@ Other Measurements\n\
   -0.00 MB ── other1 [?!]\n\
 -222.00 MB ── other2 [?!]\n\
       -333 ── other3 [?!]\n\
       -444 ── other4 [?!]\n\
     -5.55% ── other5 [?!]\n\
    666.66% ── other6\n\
  200.00 MB ── resident\n\
 \n\
+End of 4th\n\
 3rd\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 777.00 MB (100.0%) -- explicit\n\
 └──777.00 MB (100.0%) -- a\n\
    ├──444.00 MB (57.14%) ── c\n\
    └──333.00 MB (42.86%) ── b\n\
 \n\
 Other Measurements\n\
 \n\
   1.00 MB ── other1\n\
 100.00 MB ── resident\n\
 \n\
+End of 3rd\n\
 2nd\n\
 Explicit Allocations\n\
 \n\
 1,000.00 MB (100.0%) -- explicit\n\
 ├────499.00 MB (49.90%) ── a/b/c [3]\n\
 ├────200.00 MB (20.00%) ── compartment(compartment-url)\n\
 ├────200.00 MB (20.00%) ── flip/the/backslashes\n\
 └────101.00 MB (10.10%) ── heap-unclassified\n\
 \n\
 Other Measurements\n\
 \n\
 1,000.00 MB ── heap-allocated\n\
   100.00 MB ── heap-unallocated\n\
   666.00 MB ── other0\n\
   111.00 MB ── other1\n\
 \n\
+End of 2nd\n\
 5th\n\
 \n\
 WARNING: the following values are negative or unreasonably large.\n\
 \n\
     explicit/(3 tiny)/a/neg2\n\
     explicit/(3 tiny)/a/neg1\n\
     explicit/(3 tiny)/b/c\n\
     explicit/(3 tiny)/b/c/d\n\
@@ -372,16 +376,17 @@ 99.95 MB (100.0%) -- explicit\n\
        └──-0.04 MB (-0.04%) -- d [?!]\n\
           ├───0.02 MB (00.02%) ── e\n\
           └──-0.06 MB (-0.06%) ── f [?!]\n\
 \n\
 Other Measurements\n\
 \n\
 100.00 MB ── heap-allocated\n\
 \n\
+End of 5th\n\
 ";
 
   let amvExpectedText =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 653,876,224 B (100.0%) -- explicit\n\
@@ -441,16 +446,17 @@ 931,135,488 B ── explicit\n\
 524,288,000 B ── heap-allocated\n\
 104,857,600 B ── heap-unallocated\n\
 232,783,872 B ── other2\n\
           777 ── other3\n\
           888 ── other4 [2]\n\
        45.67% ── perc1\n\
       100.00% ── perc2\n\
 \n\
+End of Main Process\n\
 4th\n\
 \n\
 WARNING: the following values are negative or unreasonably large.\n\
 \n\
     explicit/js/compartment(http://too-big.com/)/stuff\n\
     explicit/neg1\n\
     explicit/heap-unclassified\n\
     other1\n\
@@ -474,47 +480,50 @@ Other Measurements\n\
         -111 B ── other1 [?!]\n\
 -232,783,872 B ── other2 [?!]\n\
           -333 ── other3 [?!]\n\
           -444 ── other4 [?!]\n\
         -5.55% ── other5 [?!]\n\
        666.66% ── other6\n\
  209,715,200 B ── resident\n\
 \n\
+End of 4th\n\
 3rd\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 814,743,552 B (100.0%) -- explicit\n\
 └──814,743,552 B (100.0%) -- a\n\
    ├──465,567,744 B (57.14%) ── c\n\
    └──349,175,808 B (42.86%) ── b\n\
 \n\
 Other Measurements\n\
 \n\
   1,048,576 B ── other1\n\
 104,857,600 B ── resident\n\
 \n\
+End of 3rd\n\
 2nd\n\
 Explicit Allocations\n\
 \n\
 1,048,576,000 B (100.0%) -- explicit\n\
 ├────523,239,424 B (49.90%) ── a/b/c [3]\n\
 ├────209,715,200 B (20.00%) ── compartment(compartment-url)\n\
 ├────209,715,200 B (20.00%) ── flip/the/backslashes\n\
 └────105,906,176 B (10.10%) ── heap-unclassified\n\
 \n\
 Other Measurements\n\
 \n\
 1,048,576,000 B ── heap-allocated\n\
   104,857,600 B ── heap-unallocated\n\
   698,351,616 B ── other0\n\
   116,391,936 B ── other1\n\
 \n\
+End of 2nd\n\
 5th\n\
 \n\
 WARNING: the following values are negative or unreasonably large.\n\
 \n\
     explicit/a/neg2\n\
     explicit/a/neg1\n\
     explicit/b/c\n\
     explicit/b/c/d\n\
@@ -536,17 +545,18 @@ 104,801,280 B (100.0%) -- explicit\n\
        └──-40,960 B (-0.04%) -- d [?!]\n\
           ├───20,480 B (00.02%) ── e\n\
           └──-61,440 B (-0.06%) ── f [?!]\n\
 \n\
 Other Measurements\n\
 \n\
 104,857,600 B ── heap-allocated\n\
 \n\
-"
+End of 5th\n\
+";
 
   function finish()
   {
     // Unregister fake reporters and re-register the real reporters, just in
     // case subsequent tests rely on them.
     for (let i = 0; i < fakeReporters.length; i++) {
       mgr.unregisterReporter(fakeReporters[i]);
     }
@@ -562,17 +572,17 @@ 104,857,600 B ── heap-allocated\n\
   // expect.  This tests the output in general and also that the cutting and
   // pasting works as expected.
   function test(aFrameId, aVerbose, aExpected, aNext) {
     SimpleTest.executeSoon(function() {
       ok(document.title === "about:memory", "document.title is correct");
       let mostRecentActual;
       let frame = document.getElementById(aFrameId);
       frame.focus();
-        
+
       // Set the verbose checkbox value and click the go button.
       let doc = frame.contentWindow.document;
       let measureButton = doc.getElementById("measureButton");
       let verbose = doc.getElementById("verbose");
       verbose.checked = aVerbose;
       measureButton.click();
 
       SimpleTest.waitForClipboard(
@@ -583,19 +593,19 @@ 104,857,600 B ── heap-allocated\n\
         function() {
           synthesizeKey("A", {accelKey: true});
           synthesizeKey("C", {accelKey: true});
         },
         aNext,
         function() {
           ok(false, "pasted text doesn't match for " + aFrameId);
           dump("******EXPECTED******\n");
-          dump(aExpected);
+          dump("<<<" + aExpected + ">>>\n");
           dump("*******ACTUAL*******\n");
-          dump(mostRecentActual);
+          dump("<<<" + mostRecentActual + ">>>\n");
           dump("********************\n");
           finish();
         }
       );
     });
   }
 
   SimpleTest.waitForFocus(function() {
--- a/toolkit/components/aboutmemory/tests/test_aboutmemory2.xul
+++ b/toolkit/components/aboutmemory/tests/test_aboutmemory2.xul
@@ -172,16 +172,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── i2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ j\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let acCollapsedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -196,16 +197,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── i2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ j\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let alExpandedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -222,16 +224,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── i2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ j\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let aCollapsedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -242,16 +245,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── i2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ j\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let hCollapsedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -260,16 +264,17 @@ 250.00 MB (100.0%) -- explicit\n\
 ├───19.00 MB (07.60%) ++ h\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ j\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let jExpandedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -280,16 +285,17 @@ 250.00 MB (100.0%) -- explicit\n\
 └────0.80 MB (00.32%) -- j\n\
      ├──0.50 MB (00.20%) ── k\n\
      └──0.30 MB (00.12%) ── k2\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   // The important thing here is that two values have been swapped.
   // explicit/h/i should remain collapsed, and explicit/j/k should remain
   // expanded.  See bug 724863.
   let updatedExpected =
 "\
 Main Process\n\
@@ -303,16 +309,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── k2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ h\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let aExpandedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -329,16 +336,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── k2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ h\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let acExpandedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -357,16 +365,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── k2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ h\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   let alCollapsedExpected =
 "\
 Main Process\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
@@ -383,16 +392,17 @@ 250.00 MB (100.0%) -- explicit\n\
 │   └───9.00 MB (03.60%) ── k2\n\
 ├───10.00 MB (04.00%) ── heap-unclassified\n\
 └────0.80 MB (00.32%) ++ h\n\
 \n\
 Other Measurements\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process\n\
 ";
 
   // Test the following cases:
   // - explicit/a/c is significant, we collapse it, it's unchanged upon
   //   update, we re-expand it
   // - explicit/a/l is insignificant, we expand it, it's unchanged upon
   //   update, we re-collapse it
   // - explicit/a is significant, we collapse it (which hides its
--- a/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul
+++ b/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul
@@ -154,17 +154,17 @@
     // Because the file load is async, we don't know when it will finish and
     // the output will show up.  So we poll.
     function copyPasteAndCheck() {
       // Copy and paste frame contents, and filter out non-deterministic
       // differences.
       synthesizeKey("A", {accelKey: true});
       synthesizeKey("C", {accelKey: true});
       let actual = SpecialPowers.getClipboardData("text/unicode");
-      actual = actual.replace(/\(pid \d+\)/, "(pid NNN)");
+      actual = actual.replace(/\(pid \d+\)/g, "(pid NNN)");
 
       if (actual === aExpected) {
         SimpleTest.ok(true, "Clipboard has the expected contents");
         aNext();
       } else {
         numFailures++;
         if (numFailures === maxFailures) {
           ok(false, "pasted text doesn't match");
@@ -199,16 +199,17 @@ Explicit-only process\n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 100,000 B (100.0%) -- explicit\n\
 └──100,000 B (100.0%) ── a/b\n\
 \n\
 Other Measurements\n\
 \n\
+End of Explicit-only process\n\
 Main Process (pid NNN)\n\
 Explicit Allocations\n\
 \n\
 262,144,000 B (100.0%) -- explicit\n\
 ├──209,715,200 B (80.00%) ── heap-unclassified\n\
 └───52,428,800 B (20.00%) ── a/b\n\
 \n\
 Other Measurements\n\
@@ -232,29 +233,31 @@ 1,024 B (100.0%) -- rss\n\
 1,024 B (100.0%) -- size\n\
 └──1,024 B (100.0%) ── a\n\
 \n\
 1,024 B (100.0%) -- swap\n\
 └──1,024 B (100.0%) ── a\n\
 \n\
 262,144,000 B ── heap-allocated\n\
 \n\
+End of Main Process (pid NNN)\n\
 Other-only process\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 Other Measurements\n\
 \n\
 200,000 B (100.0%) -- a\n\
 ├──100,000 B (50.00%) ── b\n\
 └──100,000 B (50.00%) ── c\n\
 \n\
 500,000 B ── heap-allocated\n\
 \n\
+End of Other-only process\n\
 ";
 
   let expectedGood2 =
 "\
 Main Process (pid NNN)\n\
 Explicit Allocations\n\
 \n\
 262,144,000 B (100.0%) -- explicit\n\
@@ -264,22 +267,24 @@ 262,144,000 B (100.0%) -- explicit\n\
 Other Measurements\n\
 \n\
 314,572 B (100.0%) -- other\n\
 ├──209,715 B (66.67%) ── a\n\
 └──104,857 B (33.33%) ── b\n\
 \n\
 262,144,000 B ── heap-allocated\n\
 \n\
+End of Main Process (pid NNN)\n\
 ";
 
   // This is the output for a malformed data file.
   let expectedBad =
 "\
-Invalid memory report(s): missing 'hasMozMallocUsableSize' property";
+Invalid memory report(s): missing 'hasMozMallocUsableSize' property\
+";
 
   // This is the output for a diff.
   let expectedDiff =
 "\
 P\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
@@ -289,43 +294,47 @@ Explicit Allocations\n\
 ├───────-6 B (00.06%) ── spell-check [2]\n\
 └────────1 B (-0.01%) ── xpcom/category-manager\n\
 \n\
 Other Measurements\n\
 \n\
 3,000 B ── canvas-2d-pixel-bytes [2] [+]\n\
  -100 B ── foobar [-]\n\
 \n\
+End of P\n\
 P2 (pid NNN)\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 Other Measurements\n\
 \n\
 11 B ── z 0xNNN\n\
 \n\
+End of P2 (pid NNN)\n\
 P3\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 Other Measurements\n\
 \n\
 -55 B ── p3 [-]\n\
 \n\
+End of P3\n\
 P4\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 Other Measurements\n\
 \n\
 66 B ── p4 [+]\n\
 \n\
+End of P4\n\
 ";
 
   let frames = [
     // This loads a pre-existing file that is valid.
     { filename: "memory-reports-good.json", expected: expectedGood, dumpFirst: false },
 
     // This dumps to a file and then reads it back in.
     { filename: "memory-reports-dumped.json.gz", expected: expectedGood2, dumpFirst: true },
--- a/toolkit/components/aboutmemory/tests/test_aboutmemory4.xul
+++ b/toolkit/components/aboutmemory/tests/test_aboutmemory4.xul
@@ -94,16 +94,17 @@ Explicit-only process\n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 0.10 MB (100.0%) -- explicit\n\
 └──0.10 MB (100.0%) ── a/b\n\
 \n\
 Other Measurements\n\
 \n\
+End of Explicit-only process\n\
 Main Process (pid NNN)\n\
 Explicit Allocations\n\
 \n\
 250.00 MB (100.0%) -- explicit\n\
 ├──200.00 MB (80.00%) ── heap-unclassified\n\
 └───50.00 MB (20.00%) ── a/b\n\
 \n\
 Other Measurements\n\
@@ -127,29 +128,31 @@ 0.00 MB (100.0%) -- rss\n\
 0.00 MB (100.0%) -- size\n\
 └──0.00 MB (100.0%) ── a\n\
 \n\
 0.00 MB (100.0%) -- swap\n\
 └──0.00 MB (100.0%) ── a\n\
 \n\
 250.00 MB ── heap-allocated\n\
 \n\
+End of Main Process (pid NNN)\n\
 Other-only process\n\
 \n\
 WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\
 Explicit Allocations\n\
 \n\
 Other Measurements\n\
 \n\
 0.19 MB (100.0%) -- a\n\
 ├──0.10 MB (50.00%) ── b\n\
 └──0.10 MB (50.00%) ── c\n\
 \n\
 0.48 MB ── heap-allocated\n\
 \n\
+End of Other-only process\n\
 ";
 
   // This is the output for a malformed data file.
   let expectedBad =
 "\
 Invalid memory report(s): missing 'hasMozMallocUsableSize' property";
 
   let frames = [
--- a/xpfe/appshell/src/nsXULWindow.cpp
+++ b/xpfe/appshell/src/nsXULWindow.cpp
@@ -1958,17 +1958,17 @@ void nsXULWindow::PlaceWindowLayersBehin
   }
 }
 
 void nsXULWindow::SetContentScrollbarVisibility(bool aVisible)
 {
   nsCOMPtr<nsPIDOMWindow> contentWin(do_GetInterface(mPrimaryContentShell));
   if (contentWin) {
     nsRefPtr<nsGlobalWindow> window = static_cast<nsGlobalWindow*>(contentWin.get());
-    nsRefPtr<mozilla::dom::BarProp> scrollbars = window->Scrollbars();
+    nsRefPtr<mozilla::dom::BarProp> scrollbars = window->GetScrollbars();
     if (scrollbars) {
       mozilla::ErrorResult rv;
       scrollbars->SetVisible(aVisible, rv);
     }
   }
 }
 
 bool nsXULWindow::GetContentScrollbarVisibility()