Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Feb 2018 00:59:04 +0000 (UTC)
From:      Jan Beich <jbeich@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r461193 - in head/www/waterfox: . files
Message-ID:  <201802080059.w180x4Xc042075@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jbeich
Date: Thu Feb  8 00:59:04 2018
New Revision: 461193
URL: https://svnweb.freebsd.org/changeset/ports/461193

Log:
  www/waterfox: apply some FF57/FF59 fixes

Added:
  head/www/waterfox/files/patch-bug1261175   (contents, props changed)
  head/www/waterfox/files/patch-bug1275062   (contents, props changed)
  head/www/waterfox/files/patch-bug1321960   (contents, props changed)
  head/www/waterfox/files/patch-bug1347984   (contents, props changed)
  head/www/waterfox/files/patch-bug1370791   (contents, props changed)
  head/www/waterfox/files/patch-bug1383501   (contents, props changed)
  head/www/waterfox/files/patch-bug1397114   (contents, props changed)
  head/www/waterfox/files/patch-bug1399939   (contents, props changed)
  head/www/waterfox/files/patch-bug1402025   (contents, props changed)
  head/www/waterfox/files/patch-bug1402218   (contents, props changed)
  head/www/waterfox/files/patch-bug1402377   (contents, props changed)
  head/www/waterfox/files/patch-bug1402766   (contents, props changed)
  head/www/waterfox/files/patch-bug1402951   (contents, props changed)
  head/www/waterfox/files/patch-bug1402981   (contents, props changed)
  head/www/waterfox/files/patch-bug1403721   (contents, props changed)
  head/www/waterfox/files/patch-bug1403998   (contents, props changed)
  head/www/waterfox/files/patch-bug1404057   (contents, props changed)
  head/www/waterfox/files/patch-bug1404180   (contents, props changed)
  head/www/waterfox/files/patch-bug1404323   (contents, props changed)
  head/www/waterfox/files/patch-bug1404714   (contents, props changed)
  head/www/waterfox/files/patch-bug1404760   (contents, props changed)
  head/www/waterfox/files/patch-bug1405267   (contents, props changed)
  head/www/waterfox/files/patch-bug1405377   (contents, props changed)
  head/www/waterfox/files/patch-bug1405635   (contents, props changed)
  head/www/waterfox/files/patch-bug1405720   (contents, props changed)
  head/www/waterfox/files/patch-bug1416523   (contents, props changed)
  head/www/waterfox/files/patch-bug1418757   (contents, props changed)
  head/www/waterfox/files/patch-bug1422036   (contents, props changed)
  head/www/waterfox/files/patch-bug1424469   (contents, props changed)
  head/www/waterfox/files/patch-bug1426087   (contents, props changed)
  head/www/waterfox/files/patch-bug1431192   (contents, props changed)
  head/www/waterfox/files/patch-bug1431370   (contents, props changed)
  head/www/waterfox/files/patch-bug1432870   (contents, props changed)
  head/www/waterfox/files/patch-bug1432915   (contents, props changed)
  head/www/waterfox/files/patch-bug1433671   (contents, props changed)
  head/www/waterfox/files/patch-bug1435098   (contents, props changed)
  head/www/waterfox/files/patch-bug1435286   (contents, props changed)
Modified:
  head/www/waterfox/Makefile   (contents, props changed)

Modified: head/www/waterfox/Makefile
==============================================================================
--- head/www/waterfox/Makefile	Thu Feb  8 00:58:39 2018	(r461192)
+++ head/www/waterfox/Makefile	Thu Feb  8 00:59:04 2018	(r461193)
@@ -2,7 +2,7 @@
 
 PORTNAME=	waterfox
 DISTVERSION=	56.0.4
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	www ipv6
 
 MAINTAINER=	jbeich@FreeBSD.org

Added: head/www/waterfox/files/patch-bug1261175
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1261175	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,31 @@
+commit 315fe73694f9
+Author: Matt Woodrow <mwoodrow@mozilla.com>
+Date:   Tue Nov 14 10:31:36 2017 +1300
+
+    Bug 1261175. r=bobowen a=gchang
+    
+    MozReview-Commit-ID: B9yAN0F01rj
+    
+    --HG--
+    extra : amend_source : 7585df8257930896070ddcb64c93a28a39fbbee7
+---
+ layout/base/nsDocumentViewer.cpp | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git layout/base/nsDocumentViewer.cpp layout/base/nsDocumentViewer.cpp
+index be33cf990d91..4fe03d3f7f88 100644
+--- layout/base/nsDocumentViewer.cpp
++++ layout/base/nsDocumentViewer.cpp
+@@ -549,6 +549,12 @@ nsDocumentViewer::~nsDocumentViewer()
+     mDocument->Destroy();
+   }
+ 
++  if (mPrintEngine) {
++    mPrintEngine->Destroy();
++    mPrintEngine = nullptr;
++  }
++
++  MOZ_RELEASE_ASSERT(mDestroyRefCount == 0);
+   NS_ASSERTION(!mPresShell && !mPresContext,
+                "User did not call nsIContentViewer::Destroy");
+   if (mPresShell || mPresContext) {

Added: head/www/waterfox/files/patch-bug1275062
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1275062	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,344 @@
+commit 7b030826befa
+Author: Andrea Marchesini <amarchesini@mozilla.com>
+Date:   Sat Jan 27 13:40:58 2018 +0100
+
+    Bug 1275062 - Introduce a size check of IPC messages for IndexedDB. r=asuth, a=lizzard
+    
+    --HG--
+    extra : source : ca73f9471eded208cbf1206f22e0fe9f10550497
+---
+ dom/indexedDB/ActorsParent.cpp         | 78 +++++++++++++++++++++++++++-------
+ dom/indexedDB/IndexedDatabase.h        |  4 ++
+ dom/indexedDB/IndexedDatabaseInlines.h | 14 ++++++
+ 3 files changed, 80 insertions(+), 16 deletions(-)
+
+diff --git dom/indexedDB/ActorsParent.cpp dom/indexedDB/ActorsParent.cpp
+index b9eb1744b8b6..aef19c8379be 100644
+--- dom/indexedDB/ActorsParent.cpp
++++ dom/indexedDB/ActorsParent.cpp
+@@ -8173,7 +8173,7 @@ protected:
+ 
+   // Subclasses use this override to set the IPDL response value.
+   virtual void
+-  GetResponse(RequestResponse& aResponse) = 0;
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) = 0;
+ 
+ private:
+   nsresult
+@@ -8237,7 +8237,7 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override;
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override;
+ 
+   void
+   Cleanup() override;
+@@ -8359,7 +8359,7 @@ private:
+   GetPreprocessParams(PreprocessParams& aParams) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override;
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override;
+ };
+ 
+ class ObjectStoreGetKeyRequestOp final
+@@ -8385,7 +8385,7 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override;
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override;
+ };
+ 
+ class ObjectStoreDeleteRequestOp final
+@@ -8407,9 +8407,10 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override
+   {
+     aResponse = Move(mResponse);
++    *aResponseSize = 0;
+   }
+ };
+ 
+@@ -8432,9 +8433,10 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override
+   {
+     aResponse = Move(mResponse);
++    *aResponseSize = 0;
+   }
+ };
+ 
+@@ -8459,9 +8461,10 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override
+   {
+     aResponse = Move(mResponse);
++    *aResponseSize = sizeof(uint64_t);
+   }
+ };
+ 
+@@ -8511,7 +8514,7 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override;
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override;
+ };
+ 
+ class IndexGetKeyRequestOp final
+@@ -8536,7 +8539,7 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override;
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override;
+ };
+ 
+ class IndexCountRequestOp final
+@@ -8561,9 +8564,10 @@ private:
+   DoDatabaseWork(DatabaseConnection* aConnection) override;
+ 
+   void
+-  GetResponse(RequestResponse& aResponse) override
++  GetResponse(RequestResponse& aResponse, size_t* aResponseSize) override
+   {
+     aResponse = Move(mResponse);
++    *aResponseSize = sizeof(uint64_t);
+   }
+ };
+ 
+@@ -25726,8 +25730,22 @@ NormalTransactionOp::SendSuccessResult()
+   AssertIsOnOwningThread();
+ 
+   if (!IsActorDestroyed()) {
++    static const size_t kMaxIDBMsgOverhead = 1024 * 1024 * 10; // 10MB
++    const uint32_t maximalSizeFromPref =
++      IndexedDatabaseManager::MaxSerializedMsgSize();
++    MOZ_ASSERT(maximalSizeFromPref > kMaxIDBMsgOverhead);
++    const size_t kMaxMessageSize = maximalSizeFromPref - kMaxIDBMsgOverhead;
++
+     RequestResponse response;
+-    GetResponse(response);
++    size_t responseSize = kMaxMessageSize;
++    GetResponse(response, &responseSize);
++
++    if (responseSize >= kMaxMessageSize) {
++      nsPrintfCString("The serialized value is too large"
++                      " (size=%zu bytes, max=%zu bytes).",
++                      responseSize, kMaxMessageSize);
++      return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
++    }
+ 
+     MOZ_ASSERT(response.type() != RequestResponse::T__None);
+ 
+@@ -26387,14 +26405,17 @@ ObjectStoreAddOrPutRequestOp::DoDatabaseWork(DatabaseConnection* aConnection)
+ }
+ 
+ void
+-ObjectStoreAddOrPutRequestOp::GetResponse(RequestResponse& aResponse)
++ObjectStoreAddOrPutRequestOp::GetResponse(RequestResponse& aResponse,
++                                          size_t* aResponseSize)
+ {
+   AssertIsOnOwningThread();
+ 
+   if (mOverwrite) {
+     aResponse = ObjectStorePutResponse(mResponse);
++    *aResponseSize = mResponse.GetBuffer().Length();
+   } else {
+     aResponse = ObjectStoreAddResponse(mResponse);
++    *aResponseSize = mResponse.GetBuffer().Length();
+   }
+ }
+ 
+@@ -26688,12 +26709,14 @@ ObjectStoreGetRequestOp::GetPreprocessParams(PreprocessParams& aParams)
+ }
+ 
+ void
+-ObjectStoreGetRequestOp::GetResponse(RequestResponse& aResponse)
++ObjectStoreGetRequestOp::GetResponse(RequestResponse& aResponse,
++                                     size_t* aResponseSize)
+ {
+   MOZ_ASSERT_IF(mLimit, mResponse.Length() <= mLimit);
+ 
+   if (mGetAll) {
+     aResponse = ObjectStoreGetAllResponse();
++    *aResponseSize = 0;
+ 
+     if (!mResponse.IsEmpty()) {
+       FallibleTArray<SerializedStructuredCloneReadInfo> fallibleCloneInfos;
+@@ -26706,6 +26729,7 @@ ObjectStoreGetRequestOp::GetResponse(RequestResponse& aResponse)
+       for (uint32_t count = mResponse.Length(), index = 0;
+            index < count;
+            index++) {
++        *aResponseSize += mResponse[index].Size();
+         nsresult rv =
+           ConvertResponse<false>(mResponse[index], fallibleCloneInfos[index]);
+         if (NS_WARN_IF(NS_FAILED(rv))) {
+@@ -26724,11 +26748,13 @@ ObjectStoreGetRequestOp::GetResponse(RequestResponse& aResponse)
+   }
+ 
+   aResponse = ObjectStoreGetResponse();
++  *aResponseSize = 0;
+ 
+   if (!mResponse.IsEmpty()) {
+     SerializedStructuredCloneReadInfo& serializedInfo =
+       aResponse.get_ObjectStoreGetResponse().cloneInfo();
+ 
++    *aResponseSize += mResponse[0].Size();
+     nsresult rv = ConvertResponse<false>(mResponse[0], serializedInfo);
+     if (NS_WARN_IF(NS_FAILED(rv))) {
+       aResponse = rv;
+@@ -26834,25 +26860,33 @@ ObjectStoreGetKeyRequestOp::DoDatabaseWork(DatabaseConnection* aConnection)
+ }
+ 
+ void
+-ObjectStoreGetKeyRequestOp::GetResponse(RequestResponse& aResponse)
++ObjectStoreGetKeyRequestOp::GetResponse(RequestResponse& aResponse,
++                                        size_t* aResponseSize)
+ {
+   MOZ_ASSERT_IF(mLimit, mResponse.Length() <= mLimit);
+ 
+   if (mGetAll) {
+     aResponse = ObjectStoreGetAllKeysResponse();
++    *aResponseSize = 0;
+ 
+     if (!mResponse.IsEmpty()) {
+       nsTArray<Key>& response =
+         aResponse.get_ObjectStoreGetAllKeysResponse().keys();
++
+       mResponse.SwapElements(response);
++      for (uint32_t i = 0; i < mResponse.Length(); ++i) {
++        *aResponseSize += mResponse[i].GetBuffer().Length();
++      }
+     }
+ 
+     return;
+   }
+ 
+   aResponse = ObjectStoreGetKeyResponse();
++  *aResponseSize = 0;
+ 
+   if (!mResponse.IsEmpty()) {
++    *aResponseSize = mResponse[0].GetBuffer().Length();
+     aResponse.get_ObjectStoreGetKeyResponse().key() = Move(mResponse[0]);
+   }
+ }
+@@ -27284,12 +27318,14 @@ IndexGetRequestOp::DoDatabaseWork(DatabaseConnection* aConnection)
+ }
+ 
+ void
+-IndexGetRequestOp::GetResponse(RequestResponse& aResponse)
++IndexGetRequestOp::GetResponse(RequestResponse& aResponse,
++                               size_t* aResponseSize)
+ {
+   MOZ_ASSERT_IF(!mGetAll, mResponse.Length() <= 1);
+ 
+   if (mGetAll) {
+     aResponse = IndexGetAllResponse();
++    *aResponseSize = 0;
+ 
+     if (!mResponse.IsEmpty()) {
+       FallibleTArray<SerializedStructuredCloneReadInfo> fallibleCloneInfos;
+@@ -27303,6 +27339,7 @@ IndexGetRequestOp::GetResponse(RequestResponse& aResponse)
+            index < count;
+            index++) {
+         StructuredCloneReadInfo& info = mResponse[index];
++        *aResponseSize += info.Size();
+ 
+         SerializedStructuredCloneReadInfo& serializedInfo =
+           fallibleCloneInfos[index];
+@@ -27335,9 +27372,11 @@ IndexGetRequestOp::GetResponse(RequestResponse& aResponse)
+   }
+ 
+   aResponse = IndexGetResponse();
++  *aResponseSize = 0;
+ 
+   if (!mResponse.IsEmpty()) {
+     StructuredCloneReadInfo& info = mResponse[0];
++    *aResponseSize += info.Size();
+ 
+     SerializedStructuredCloneReadInfo& serializedInfo =
+       aResponse.get_IndexGetResponse().cloneInfo();
+@@ -27467,23 +27506,30 @@ IndexGetKeyRequestOp::DoDatabaseWork(DatabaseConnection* aConnection)
+ }
+ 
+ void
+-IndexGetKeyRequestOp::GetResponse(RequestResponse& aResponse)
++IndexGetKeyRequestOp::GetResponse(RequestResponse& aResponse,
++                                  size_t* aResponseSize)
+ {
+   MOZ_ASSERT_IF(!mGetAll, mResponse.Length() <= 1);
+ 
+   if (mGetAll) {
+     aResponse = IndexGetAllKeysResponse();
++    *aResponseSize = 0;
+ 
+     if (!mResponse.IsEmpty()) {
+       mResponse.SwapElements(aResponse.get_IndexGetAllKeysResponse().keys());
++      for (uint32_t i = 0; i < mResponse.Length(); ++i) {
++        *aResponseSize += mResponse[i].GetBuffer().Length();
++      }
+     }
+ 
+     return;
+   }
+ 
+   aResponse = IndexGetKeyResponse();
++  *aResponseSize = 0;
+ 
+   if (!mResponse.IsEmpty()) {
++    *aResponseSize = mResponse[0].GetBuffer().Length();
+     aResponse.get_IndexGetKeyResponse().key() = Move(mResponse[0]);
+   }
+ }
+diff --git dom/indexedDB/IndexedDatabase.h dom/indexedDB/IndexedDatabase.h
+index b0c4cb877a9c..9165758bcd62 100644
+--- dom/indexedDB/IndexedDatabase.h
++++ dom/indexedDB/IndexedDatabase.h
+@@ -83,6 +83,10 @@ struct StructuredCloneReadInfo
+   // In IndexedDatabaseInlines.h
+   inline
+   MOZ_IMPLICIT StructuredCloneReadInfo(SerializedStructuredCloneReadInfo&& aOther);
++
++  // In IndexedDatabaseInlines.h
++  inline
++  size_t Size() const;
+ };
+ 
+ } // namespace indexedDB
+diff --git dom/indexedDB/IndexedDatabaseInlines.h dom/indexedDB/IndexedDatabaseInlines.h
+index 830c2f11009d..48cc4f9b3ced 100644
+--- dom/indexedDB/IndexedDatabaseInlines.h
++++ dom/indexedDB/IndexedDatabaseInlines.h
+@@ -99,6 +99,20 @@ StructuredCloneReadInfo::operator=(StructuredCloneReadInfo&& aCloneReadInfo)
+   return *this;
+ }
+ 
++inline size_t
++StructuredCloneReadInfo::Size() const
++{
++  size_t size = mData.Size();
++
++  for (uint32_t i = 0, count = mFiles.Length(); i < count; ++i) {
++    // We don't want to calculate the size of files and so on, because are mainly
++    // file descriptors.
++    size += sizeof(uint64_t);
++  }
++
++  return size;
++}
++
+ } // namespace indexedDB
+ } // namespace dom
+ } // namespace mozilla

Added: head/www/waterfox/files/patch-bug1321960
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1321960	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,134 @@
+commit 8721b8f42bc0
+Author: Alexander Surkov <surkov.alexander@gmail.com>
+Date:   Tue Sep 26 16:25:12 2017 -0400
+
+    Bug 1321960 - Rename nsIPresShell::mSuppressInterruptibleReflows to mWasLastReflowInterrupted to reflect better its purpose. r=dholbert, a=sledru
+    
+    --HG--
+    extra : source : c65fce03b9e0a1a7591668f727b846675cffa44a
+---
+ layout/base/PresShell.cpp       |  8 ++++----
+ layout/base/nsIPresShell.h      | 18 +++++++++++++++++-
+ layout/base/nsRefreshDriver.cpp |  2 +-
+ 3 files changed, 22 insertions(+), 6 deletions(-)
+
+diff --git layout/base/PresShell.cpp layout/base/PresShell.cpp
+index 4ca35ffe1466..a1660ac30de7 100644
+--- layout/base/PresShell.cpp
++++ layout/base/PresShell.cpp
+@@ -762,7 +762,7 @@ nsIPresShell::nsIPresShell()
+     , mFrozen(false)
+     , mIsFirstPaint(false)
+     , mObservesMutationsForPrint(false)
+-    , mSuppressInterruptibleReflows(false)
++    , mWasLastReflowInterrupted(false)
+     , mScrollPositionClampingScrollPortSizeSet(false)
+     , mNeedLayoutFlush(true)
+     , mNeedStyleFlush(true)
+@@ -4197,7 +4197,7 @@ PresShell::DoFlushPendingNotifications(mozilla::ChangesToFlush aFlush)
+     // worry about them.  They can't be triggered during reflow, so we should
+     // be good.
+ 
+-    if (flushType >= (mSuppressInterruptibleReflows
++    if (flushType >= (SuppressInterruptibleReflows()
+                         ? FlushType::Layout
+                         : FlushType::InterruptibleLayout) &&
+         !mIsDestroying) {
+@@ -4232,7 +4232,7 @@ PresShell::DoFlushPendingNotifications(mozilla::ChangesToFlush aFlush)
+   if (!didLayoutFlush && flushType >= FlushType::InterruptibleLayout &&
+       !mIsDestroying) {
+     // We suppressed this flush either due to it not being safe to flush,
+-    // or due to mSuppressInterruptibleReflows.  Either way, the
++    // or due to SuppressInterruptibleReflows().  Either way, the
+     // mNeedLayoutFlush flag needs to be re-set.
+     SetNeedLayoutFlush();
+   }
+@@ -9484,7 +9484,7 @@ PresShell::DoReflow(nsIFrame* target, bool aInterruptible)
+     // Any FlushPendingNotifications with interruptible reflows
+     // should be suppressed now. We don't want to do extra reflow work
+     // before our reflow event happens.
+-    mSuppressInterruptibleReflows = true;
++    mWasLastReflowInterrupted = true;
+     MaybeScheduleReflow();
+   }
+ 
+diff --git layout/base/nsIPresShell.h layout/base/nsIPresShell.h
+index 9f65bad1b4d7..885bc0bc699a 100644
+--- layout/base/nsIPresShell.h
++++ layout/base/nsIPresShell.h
+@@ -1581,6 +1581,21 @@ public:
+     mFontSizeInflationEnabledIsDirty = true;
+   }
+ 
++  /**
++   * Return true if the most recent interruptible reflow was interrupted.
++   */
++  bool IsReflowInterrupted() const {
++    return mWasLastReflowInterrupted;
++  }
++
++  /**
++   * Return true if the the interruptible reflows have to be suppressed.
++   * This may happen only if if the most recent reflow was interrupted.
++   */
++  bool SuppressInterruptibleReflows() const {
++    return mWasLastReflowInterrupted;
++  }
++
+   //////////////////////////////////////////////////////////////////////////////
+   // Approximate frame visibility tracking public API.
+   //////////////////////////////////////////////////////////////////////////////
+@@ -1794,7 +1809,8 @@ protected:
+   bool                      mIsFirstPaint : 1;
+   bool                      mObservesMutationsForPrint : 1;
+ 
+-  bool                      mSuppressInterruptibleReflows : 1;
++  // Whether the most recent interruptible reflow was actually interrupted:
++  bool                      mWasLastReflowInterrupted : 1;
+   bool                      mScrollPositionClampingScrollPortSizeSet : 1;
+ 
+   // True if a layout flush might not be a no-op
+diff --git layout/base/nsRefreshDriver.cpp layout/base/nsRefreshDriver.cpp
+index 4dbe56952ccf..4ca4783561c6 100644
+--- layout/base/nsRefreshDriver.cpp
++++ layout/base/nsRefreshDriver.cpp
+@@ -1949,7 +1949,7 @@ nsRefreshDriver::Tick(int64_t aNowEpoch, TimeStamp aNowTime)
+ 
+         nsCOMPtr<nsIPresShell> shellKungFuDeathGrip(shell);
+         shell->mObservingLayoutFlushes = false;
+-        shell->mSuppressInterruptibleReflows = false;
++        shell->mWasLastReflowInterrupted = false;
+         FlushType flushType = HasPendingAnimations(shell)
+                                ? FlushType::Layout
+                                : FlushType::InterruptibleLayout;
+commit 5ee10fd6f2e4
+Author: Alexander Surkov <surkov.alexander@gmail.com>
+Date:   Tue Sep 26 16:27:02 2017 -0400
+
+    Bug 1321960 - Let an interrupted reflow finish before processing a11y. r=eeejay, f=dholbert, a=sledru
+    
+    --HG--
+    extra : source : c845865489652eadaa3f9a12736c1db56c0e6f12
+---
+ accessible/base/NotificationController.cpp | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git accessible/base/NotificationController.cpp accessible/base/NotificationController.cpp
+index d08500458221..8263c7b54d83 100644
+--- accessible/base/NotificationController.cpp
++++ accessible/base/NotificationController.cpp
+@@ -601,9 +601,13 @@ NotificationController::WillRefresh(mozilla::TimeStamp aTime)
+   if (!mDocument)
+     return;
+ 
++  // Wait until an update, we have started, or an interruptible reflow is
++  // finished.
+   if (mObservingState == eRefreshProcessing ||
+-      mObservingState == eRefreshProcessingForUpdate)
++      mObservingState == eRefreshProcessingForUpdate ||
++      mPresShell->IsReflowInterrupted()) {
+     return;
++  }
+ 
+   // Any generic notifications should be queued if we're processing content
+   // insertions or generic notifications.

Added: head/www/waterfox/files/patch-bug1347984
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1347984	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,96 @@
+commit d40956eaa7d8
+Author: Jan de Mooij <jdemooij@mozilla.com>
+Date:   Fri Oct 6 20:11:07 2017 +0200
+
+    Bug 1347984 - Check for dead object proxies in TriggerPromiseReactions. r=till, a=ritu
+    
+    --HG--
+    extra : source : 754a3e12321c8656a83759adf297e61b0e188368
+---
+ js/src/builtin/Promise.cpp                  |  6 +++++-
+ js/src/jit-test/tests/basic/bug908915.js    |  1 +
+ js/src/jit-test/tests/promise/bug1347984.js |  6 ++++++
+ js/src/shell/js.cpp                         | 21 +++++++++++++++++++++
+ 4 files changed, 33 insertions(+), 1 deletion(-)
+
+diff --git js/src/builtin/Promise.cpp js/src/builtin/Promise.cpp
+index 2462f1f07853..1cb1cff0682e 100644
+--- js/src/builtin/Promise.cpp
++++ js/src/builtin/Promise.cpp
+@@ -1017,8 +1017,12 @@ TriggerPromiseReactions(JSContext* cx, HandleValue reactionsVal, JS::PromiseStat
+     RootedObject reactions(cx, &reactionsVal.toObject());
+     RootedObject reaction(cx);
+ 
+-    if (reactions->is<PromiseReactionRecord>() || IsWrapper(reactions))
++    if (reactions->is<PromiseReactionRecord>() ||
++        IsWrapper(reactions) ||
++        JS_IsDeadWrapper(reactions))
++    {
+         return EnqueuePromiseReactionJob(cx, reactions, valueOrReason, state);
++    }
+ 
+     RootedNativeObject reactionsList(cx, &reactions->as<NativeObject>());
+     size_t reactionsCount = reactionsList->getDenseInitializedLength();
+diff --git js/src/jit-test/tests/basic/bug908915.js js/src/jit-test/tests/basic/bug908915.js
+index 5077801b1b67..f0213296e769 100644
+--- js/src/jit-test/tests/basic/bug908915.js
++++ js/src/jit-test/tests/basic/bug908915.js
+@@ -11,6 +11,7 @@ var blacklist = {
+     'readline': true,
+     'terminate': true,
+     'nestedShell': true,
++    'nukeAllCCWs': true,
+ };
+ 
+ function f(y) {}
+diff --git js/src/jit-test/tests/promise/bug1347984.js js/src/jit-test/tests/promise/bug1347984.js
+new file mode 100644
+index 000000000000..5fc458cd452e
+--- /dev/null
++++ js/src/jit-test/tests/promise/bug1347984.js
+@@ -0,0 +1,6 @@
++// |jit-test| error:dead object
++var g = newGlobal();
++var p = new Promise(() => {});
++g.Promise.prototype.then.call(p, () => void 0);
++g.eval("nukeAllCCWs()");
++resolvePromise(p, 9);
+diff --git js/src/shell/js.cpp js/src/shell/js.cpp
+index 2bb7e97120a7..8e9aee7c854a 100644
+--- js/src/shell/js.cpp
++++ js/src/shell/js.cpp
+@@ -5049,6 +5049,23 @@ NukeCCW(JSContext* cx, unsigned argc, Value* vp)
+     return true;
+ }
+ 
++static bool
++NukeAllCCWs(JSContext* cx, unsigned argc, Value* vp)
++{
++    CallArgs args = CallArgsFromVp(argc, vp);
++
++    if (args.length() != 0) {
++        JS_ReportErrorNumberASCII(cx, my_GetErrorMessage, nullptr, JSSMSG_INVALID_ARGS,
++                                  "nukeAllCCWs");
++        return false;
++    }
++
++    NukeCrossCompartmentWrappers(cx, AllCompartments(), cx->compartment(),
++                                 NukeWindowReferences, NukeAllReferences);
++    args.rval().setUndefined();
++    return true;
++}
++
+ static bool
+ GetMaxArgs(JSContext* cx, unsigned argc, Value* vp)
+ {
+@@ -6552,6 +6569,10 @@ static const JSFunctionSpecWithHelp shell_functions[] = {
+ "nukeCCW(wrapper)",
+ "  Nuke a CrossCompartmentWrapper, which turns it into a DeadProxyObject."),
+ 
++    JS_FN_HELP("nukeAllCCWs", NukeAllCCWs, 0, 0,
++"nukeAllCCWs()",
++"  Like nukeCCW, but for all CrossCompartmentWrappers targeting the current compartment."),
++
+     JS_FN_HELP("createMappedArrayBuffer", CreateMappedArrayBuffer, 1, 0,
+ "createMappedArrayBuffer(filename, [offset, [size]])",
+ "  Create an array buffer that mmaps the given file."),

Added: head/www/waterfox/files/patch-bug1370791
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1370791	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,104 @@
+commit 4ab22d92be00
+Author: Gijs Kruitbosch <gijskruitbosch@gmail.com>
+Date:   Wed Oct 4 19:12:40 2017 +0100
+
+    Bug 1370791 - Use CUI listener and an attribute to toggle hiding/showing the new tab button. r=jaws, a=ritu
+    
+    MozReview-Commit-ID: DaKohSCnrJn
+    
+    --HG--
+    extra : source : 3894d341fe1631dc755e5b16b3a286ec4e741991
+    extra : amend_source : 14a18fd29a60434f84664ee21eb245397a87f160
+---
+ browser/base/content/browser.css    |  4 +--
+ browser/base/content/tabbrowser.xml | 49 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 51 insertions(+), 2 deletions(-)
+
+diff --git browser/base/content/browser.css browser/base/content/browser.css
+index 8afcbf4a5f48..4527cd480fb0 100644
+--- browser/base/content/browser.css
++++ browser/base/content/browser.css
+@@ -114,9 +114,9 @@ tabbrowser {
+ }
+ 
+ #tabbrowser-tabs:not([overflow="true"]) ~ #alltabs-button,
+-#tabbrowser-tabs:not([overflow="true"]) + #new-tab-button,
++#tabbrowser-tabs[hasadjacentnewtabbutton]:not([overflow="true"]) ~ #new-tab-button,
+ #tabbrowser-tabs[overflow="true"] > .tabbrowser-arrowscrollbox > .tabs-newtab-button,
+-#TabsToolbar[currentset]:not([currentset*="tabbrowser-tabs,new-tab-button"]) > #tabbrowser-tabs > .tabbrowser-arrowscrollbox > .tabs-newtab-button,
++#tabbrowser-tabs:not([hasadjacentnewtabbutton]) > .tabbrowser-arrowscrollbox > .tabs-newtab-button,
+ #TabsToolbar[customizing="true"] > #tabbrowser-tabs > .tabbrowser-arrowscrollbox > .tabs-newtab-button {
+   visibility: collapse;
+ }
+diff --git browser/base/content/tabbrowser.xml browser/base/content/tabbrowser.xml
+index 7575a985eeba..7e6c321e5dee 100644
+--- browser/base/content/tabbrowser.xml
++++ browser/base/content/tabbrowser.xml
+@@ -5808,11 +5808,58 @@
+         ]]></body>
+       </method>
+ 
++      <method name="_updateNewTabVisibility">
++        <body><![CDATA[
++          let sib = this.tabContainer.nextElementSibling;
++          while (sib && sib.hidden) {
++            sib = sib.nextElementSibling;
++          }
++          const kAttr = "hasadjacentnewtabbutton";
++          if (sib && sib.id == "new-tab-button") {
++            this.tabContainer.setAttribute(kAttr, "true");
++          } else {
++            this.tabContainer.removeAttribute(kAttr);
++          }
++        ]]></body>
++      </method>
++
++      <method name="onWidgetAfterDOMChange">
++        <parameter name="aNode"/>
++        <parameter name="aNextNode"/>
++        <parameter name="aContainer"/>
++        <body><![CDATA[
++          if (aContainer.ownerDocument == document &&
++              aContainer.id == "TabsToolbar") {
++            this._updateNewTabVisibility();
++          }
++        ]]></body>
++      </method>
++      <method name="onAreaNodeRegistered">
++        <parameter name="aArea"/>
++        <parameter name="aContainer"/>
++        <body><![CDATA[
++          if (aContainer.ownerDocument == document &&
++              aArea == "TabsToolbar") {
++            this._updateNewTabVisibility();
++          }
++        ]]></body>
++      </method>
++      <method name="onAreaReset">
++        <parameter name="aArea"/>
++        <parameter name="aContainer"/>
++        <body><![CDATA[
++          this.onAreaNodeRegistered(aArea, aContainer);
++        ]]></body>
++      </method>
++
+       <constructor>
+         <![CDATA[
+           this.mCurrentBrowser = document.getAnonymousElementByAttribute(this, "anonid", "initialBrowser");
+           this.mCurrentBrowser.permanentKey = {};
+ 
++          CustomizableUI.addListener(this);
++          this._updateNewTabVisibility();
++
+           Services.obs.addObserver(this, "contextual-identity-updated");
+ 
+           this.mCurrentTab = this.tabContainer.firstChild;
+@@ -5922,6 +5969,8 @@
+         <![CDATA[
+           Services.obs.removeObserver(this, "contextual-identity-updated");
+ 
++          CustomizableUI.removeListener(this);
++
+           for (let tab of this.tabs) {
+             let browser = tab.linkedBrowser;
+             if (browser.registeredOpenURI) {

Added: head/www/waterfox/files/patch-bug1383501
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1383501	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,83 @@
+commit 8ba0e2ee02b0
+Author: Aaron Klotz <aklotz@mozilla.com>
+Date:   Wed Oct 4 09:12:25 2017 -0600
+
+    Bug 1383501 - Do not crash when TabParent::RecvPDocAccessibleConstructor receives a null COM proxy sent to the parent process. r=jimm, a=ritu
+    
+    MozReview-Commit-ID: 5IOuLXc375T
+    
+    --HG--
+    extra : source : e2a6e2ddfa184b5a1f410408d7232ed0041a360f
+---
+ accessible/ipc/win/ProxyAccessible.cpp |  2 +-
+ accessible/ipc/win/ProxyAccessible.h   | 13 ++++++++++++-
+ dom/ipc/TabParent.cpp                  |  2 ++
+ 3 files changed, 15 insertions(+), 2 deletions(-)
+
+diff --git accessible/ipc/win/ProxyAccessible.cpp accessible/ipc/win/ProxyAccessible.cpp
+index 0942e280ea30..383ece99fb0c 100644
+--- accessible/ipc/win/ProxyAccessible.cpp
++++ accessible/ipc/win/ProxyAccessible.cpp
+@@ -34,7 +34,7 @@ ProxyAccessible::GetCOMInterface(void** aOutAccessible) const
+     return false;
+   }
+ 
+-  if (!mCOMProxy) {
++  if (!mCOMProxy && mSafeToRecurse) {
+     // See if we can lazily obtain a COM proxy
+     AccessibleWrap* wrap = WrapperFor(this);
+     bool isDefunct = false;
+diff --git accessible/ipc/win/ProxyAccessible.h accessible/ipc/win/ProxyAccessible.h
+index 83f1e6093253..4fd897e588fe 100644
+--- accessible/ipc/win/ProxyAccessible.h
++++ accessible/ipc/win/ProxyAccessible.h
+@@ -27,6 +27,7 @@ public:
+   ProxyAccessible(uint64_t aID, ProxyAccessible* aParent,
+                   DocAccessibleParent* aDoc, role aRole, uint32_t aInterfaces)
+     : ProxyAccessibleBase(aID, aParent, aDoc, aRole, aInterfaces)
++    , mSafeToRecurse(true)
+   {
+     MOZ_COUNT_CTOR(ProxyAccessible);
+   }
+@@ -40,7 +41,16 @@ public:
+ 
+   bool GetCOMInterface(void** aOutAccessible) const;
+   void SetCOMInterface(const RefPtr<IAccessible>& aIAccessible)
+-  { mCOMProxy = aIAccessible; }
++  {
++    if (aIAccessible) {
++      mCOMProxy = aIAccessible;
++    } else {
++      // If we were supposed to be receiving an interface (hence the call to
++      // this function), but the interface turns out to be null, then we're
++      // broken for some reason.
++      mSafeToRecurse = false;
++    }
++  }
+ 
+ protected:
+   explicit ProxyAccessible(DocAccessibleParent* aThisAsDoc)
+@@ -49,6 +59,7 @@ protected:
+ 
+ private:
+   RefPtr<IAccessible> mCOMProxy;
++  bool                mSafeToRecurse;
+ };
+ 
+ }
+diff --git dom/ipc/TabParent.cpp dom/ipc/TabParent.cpp
+index 7fc5689e6211..d8733a377219 100644
+--- dom/ipc/TabParent.cpp
++++ dom/ipc/TabParent.cpp
+@@ -972,9 +972,11 @@ TabParent::RecvPDocAccessibleConstructor(PDocAccessibleParent* aDoc,
+ #ifdef XP_WIN
+     a11y::WrapperFor(doc)->SetID(aMsaaID);
+     MOZ_ASSERT(!aDocCOMProxy.IsNull());
++#ifdef NIGHTLY_BUILD
+     if (aDocCOMProxy.IsNull()) {
+       return IPC_FAIL(this, "Constructing a top-level PDocAccessible with null COM proxy");
+     }
++#endif
+ 
+     RefPtr<IAccessible> proxy(aDocCOMProxy.Get());
+     doc->SetCOMInterface(proxy);

Added: head/www/waterfox/files/patch-bug1397114
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1397114	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,105 @@
+commit 92b82f64e587
+Author: Scott Wu <scottcwwu@gmail.com>
+Date:   Wed Sep 20 16:45:03 2017 +0800
+
+    Bug 1397114 - Disable smooth scrolling when value changes come from input box. r=mconley, a=ritu
+    
+    MozReview-Commit-ID: 9ZLSB2HQvcu
+    
+    --HG--
+    extra : source : f215f88437f1db1884858be2c78582ab2b11bbb0
+---
+ toolkit/content/widgets/datepicker.js | 11 ++++++-----
+ toolkit/content/widgets/spinner.js    | 16 ++--------------
+ 2 files changed, 8 insertions(+), 19 deletions(-)
+
+diff --git toolkit/content/widgets/datepicker.js toolkit/content/widgets/datepicker.js
+index 31651dc63665..b125c5103a9a 100644
+--- toolkit/content/widgets/datepicker.js
++++ toolkit/content/widgets/datepicker.js
+@@ -133,7 +133,7 @@ function DatePicker(context) {
+     /**
+      * Update date picker and its components.
+      */
+-    _update() {
++    _update(options = {}) {
+       const { dateKeeper, isMonthPickerVisible } = this.state;
+ 
+       if (isMonthPickerVisible) {
+@@ -148,7 +148,8 @@ function DatePicker(context) {
+         dateObj: dateKeeper.state.dateObj,
+         months: this.state.months,
+         years: this.state.years,
+-        toggleMonthPicker: this.state.toggleMonthPicker
++        toggleMonthPicker: this.state.toggleMonthPicker,
++        noSmoothScroll: options.noSmoothScroll
+       });
+       this.components.calendar.setProps({
+         isVisible: !isMonthPickerVisible,
+@@ -269,7 +270,7 @@ function DatePicker(context) {
+       dateKeeper.setSelection({
+         year, month, day
+       });
+-      this._update();
++      this._update({ noSmoothScroll: true });
+     }
+   };
+ 
+@@ -350,14 +351,14 @@ function DatePicker(context) {
+           items: props.months,
+           isInfiniteScroll: true,
+           isValueSet: this.state.isMonthSet,
+-          smoothScroll: !this.state.firstOpened
++          smoothScroll: !(this.state.firstOpened || props.noSmoothScroll)
+         });
+         this.components.year.setState({
+           value: props.dateObj.getUTCFullYear(),
+           items: props.years,
+           isInfiniteScroll: false,
+           isValueSet: this.state.isYearSet,
+-          smoothScroll: !this.state.firstOpened
++          smoothScroll: !(this.state.firstOpened || props.noSmoothScroll)
+         });
+         this.state.firstOpened = false;
+       } else {
+diff --git toolkit/content/widgets/spinner.js toolkit/content/widgets/spinner.js
+index 101cb01658a0..0a30766f8d13 100644
+--- toolkit/content/widgets/spinner.js
++++ toolkit/content/widgets/spinner.js
+@@ -124,8 +124,6 @@ function Spinner(props, context) {
+     /**
+      * Whenever scroll event is detected:
+      * - Update the index state
+-     * - If a smooth scroll has reached its destination, set [isScrolling] state
+-     *   to false
+      * - If the value has changed, update the [value] state and call [setValue]
+      * - If infinite scrolling is on, reset the scrolling position if necessary
+      */
+@@ -138,14 +136,8 @@ function Spinner(props, context) {
+ 
+       const value = itemsView[this.state.index + viewportTopOffset].value;
+ 
+-      // Check if smooth scrolling has reached its destination.
+-      // This prevents input box jump when input box changes values.
+-      if (this.state.value == value && this.state.isScrolling) {
+-        this.state.isScrolling = false;
+-      }
+-
+-      // Call setValue if value has changed, and is not smooth scrolling
+-      if (this.state.value != value && !this.state.isScrolling) {
++      // Call setValue if value has changed
++      if (this.state.value != value) {
+         this.state.value = value;
+         this.props.setValue(value);
+       }
+@@ -444,10 +436,6 @@ function Spinner(props, context) {
+     _smoothScrollToIndex(index) {
+       const element = this.elements.spinner.children[index];
+       if (element) {
+-        // Set the isScrolling flag before smooth scrolling begins
+-        // and remove it when it has reached the destination.
+-        // This prevents input box jump when input box changes values
+-        this.state.isScrolling = true;
+         element.scrollIntoView({
+           behavior: "smooth", block: "start"
+         });

Added: head/www/waterfox/files/patch-bug1399939
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1399939	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,36 @@
+commit b0369ebbca69
+Author: Gijs Kruitbosch <gijskruitbosch@gmail.com>
+Date:   Thu Sep 28 12:00:22 2017 +0100
+
+    Bug 1399939 - Switch to highly restrictive profile for IDN. r=dveditz, r=jfkthame, a=sledru
+    
+    MozReview-Commit-ID: E5LRuQVfIZP
+    
+    --HG--
+    extra : source : e1c1ebf60808e5e94b9a03d8cb577990ac0b9ca1
+---
+ modules/libpref/init/all.js | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git modules/libpref/init/all.js modules/libpref/init/all.js
+index c74659f8d4a5..c796df0fef1d 100644
+--- modules/libpref/init/all.js
++++ modules/libpref/init/all.js
+@@ -1913,7 +1913,7 @@ pref("network.IDN_show_punycode", false);
+ // IDN-safe. Otherwise, they're treated as unsafe and punycode will be used
+ // for displaying them in the UI (e.g. URL bar), unless they conform to one of
+ // the profiles specified in
+-// http://www.unicode.org/reports/tr36/proposed.html#Security_Levels_and_Alerts
++// https://www.unicode.org/reports/tr39/#Restriction_Level_Detection
+ // If "network.IDN.restriction_profile" is "high", the Highly Restrictive
+ // profile is used.
+ // If "network.IDN.restriction_profile" is "moderate", the Moderately
+@@ -1922,7 +1922,7 @@ pref("network.IDN_show_punycode", false);
+ // Note that these preferences are referred to ONLY when
+ // "network.IDN_show_punycode" is false. In other words, all IDNs will be shown
+ // in punycode if "network.IDN_show_punycode" is true.
+-pref("network.IDN.restriction_profile", "moderate");
++pref("network.IDN.restriction_profile", "high");
+ pref("network.IDN.use_whitelist", false);
+ 
+ // ccTLDs

Added: head/www/waterfox/files/patch-bug1402025
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/www/waterfox/files/patch-bug1402025	Thu Feb  8 00:59:04 2018	(r461193)
@@ -0,0 +1,201 @@
+commit a80cfb448ce3
+Author: Kirk Steuber <ksteuber@mozilla.com>
+Date:   Thu Sep 28 12:09:56 2017 -0700
+
+    Bug 1402025 - Ensure form submission flush when unsetting relevant attributes. r=bz, a=ritu
+    
+    It seems that we were flushing any pending submission when changing the action or target attributes of a form, but not when unsetting those attributes.
+    
+    MozReview-Commit-ID: E6aUnokg54k
+    
+    --HG--
+    extra : source : 32fa20aaa56cfb063433ff46f202e99eb35043d7
+---
+ dom/html/HTMLFormElement.cpp              | 25 ++++-----
+ dom/html/test/browser.ini                 |  3 ++
+ dom/html/test/browser_submission_flush.js | 85 +++++++++++++++++++++++++++++++
+ dom/html/test/post_action_page.html       | 10 ++++
+ dom/html/test/submission_flush.html       | 13 +++++
+ 5 files changed, 122 insertions(+), 14 deletions(-)
+
+diff --git dom/html/HTMLFormElement.cpp dom/html/HTMLFormElement.cpp
+index 6b87c8b54255..c9ff6ffc8f2a 100644
+--- dom/html/HTMLFormElement.cpp
++++ dom/html/HTMLFormElement.cpp
+@@ -189,21 +189,18 @@ HTMLFormElement::BeforeSetAttr(int32_t aNamespaceID, nsIAtom* aName,
+ {
+   if (aNamespaceID == kNameSpaceID_None) {
+     if (aName == nsGkAtoms::action || aName == nsGkAtoms::target) {
+-      // This check is mostly to preserve previous behavior.

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802080059.w180x4Xc042075>