Merge inbound to mozilla-central. a=merge
authorBrindusan Cristian <cbrindusan@mozilla.com>
Sat, 07 Apr 2018 12:57:02 +0300
changeset 412254 22542265bb30870639c3908d9e1cf299be25e7ea
parent 412253 2ae59181b9de1efbdb20cffc773fb4b1329c5a38 (current diff)
parent 412183 c4b19afa06ea11c16ff3983a69e6c3aa1fdad8de (diff)
child 412255 a44f62799a10195778ea508881c38aa3169bcfef
child 412262 71d11ec551a369a9b8919ab585c184dae5d1f3ba
child 412266 4920c6279ea093094d42d236509ecc22aced7c7d
push id101866
push usercbrindusan@mozilla.com
push dateSat, 07 Apr 2018 10:01:01 +0000
treeherdermozilla-inbound@a44f62799a10 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone61.0a1
first release with
nightly linux32
22542265bb30 / 61.0a1 / 20180407100152 / files
nightly linux64
22542265bb30 / 61.0a1 / 20180407100152 / files
nightly mac
22542265bb30 / 61.0a1 / 20180407100152 / files
nightly win32
22542265bb30 / 61.0a1 / 20180407100152 / files
nightly win64
22542265bb30 / 61.0a1 / 20180407100152 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central. a=merge
layout/style/nsNthIndexCache.h
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -49,17 +49,17 @@ var whitelist = [
 
   // security/manager/pki/resources/content/device_manager.js
   {file: "chrome://pippki/content/load_device.xul"},
 
   // The l10n build system can't package string files only for some platforms.
   // See bug 1339424 for why this is hard to fix.
   {file: "chrome://global/locale/fallbackMenubar.properties",
    platforms: ["linux", "win"]},
-  {file: "chrome://global/locale/printPageSetup.dtd", platforms: ["macosx"]},
+  {file: "chrome://global/locale/printPageSetup.dtd", platforms: ["linux", "macosx"]},
   {file: "chrome://global/locale/printPreviewProgress.dtd",
    platforms: ["macosx"]},
   {file: "chrome://global/locale/printProgress.dtd", platforms: ["macosx"]},
 
   // toolkit/content/aboutRights-unbranded.xhtml doesn't use aboutRights.css
   {file: "chrome://global/skin/aboutRights.css", skipUnofficial: true},
 
   // devtools/client/inspector/bin/dev-server.js
--- a/browser/components/preferences/in-content/preferences.js
+++ b/browser/components/preferences/in-content/preferences.js
@@ -93,16 +93,17 @@ function init_all() {
   }));
 }
 
 function telemetryBucketForCategory(category) {
   category = category.toLowerCase();
   switch (category) {
     case "containers":
     case "general":
+    case "home":
     case "privacy":
     case "search":
     case "sync":
     case "searchresults":
       return category;
     default:
       return "unknown";
   }
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -21,19 +21,17 @@
     locale/browser/aboutSearchReset.dtd            (%chrome/browser/aboutSearchReset.dtd)
     locale/browser/aboutSessionRestore.dtd         (%chrome/browser/aboutSessionRestore.dtd)
     locale/browser/aboutTabCrashed.dtd             (%chrome/browser/aboutTabCrashed.dtd)
     locale/browser/browser.dtd                     (%chrome/browser/browser.dtd)
     locale/browser/baseMenuOverlay.dtd             (%chrome/browser/baseMenuOverlay.dtd)
     locale/browser/browser.properties              (%chrome/browser/browser.properties)
     locale/browser/customizableui/customizableWidgets.properties (%chrome/browser/customizableui/customizableWidgets.properties)
     locale/browser/lightweightThemes.properties    (%chrome/browser/lightweightThemes.properties)
-#ifdef XP_WIN
     locale/browser/uiDensity.properties            (%chrome/browser/uiDensity.properties)
-#endif
     locale/browser/pageInfo.dtd                    (%chrome/browser/pageInfo.dtd)
     locale/browser/pageInfo.properties             (%chrome/browser/pageInfo.properties)
     locale/browser/quitDialog.properties           (%chrome/browser/quitDialog.properties)
     locale/browser/safeMode.dtd                    (%chrome/browser/safeMode.dtd)
     locale/browser/sanitize.dtd                    (%chrome/browser/sanitize.dtd)
     locale/browser/search.properties               (%chrome/browser/search.properties)
     locale/browser/siteData.properties             (%chrome/browser/siteData.properties)
     locale/browser/sitePermissions.properties      (%chrome/browser/sitePermissions.properties)
--- a/dom/mathml/nsMathMLElement.cpp
+++ b/dom/mathml/nsMathMLElement.cpp
@@ -721,20 +721,20 @@ nsMathMLElement::MapMathMLAttributesInto
                    nsGkAtoms::mathvariant_->GetUTF16String(),
                    aData->Document());
     if (value->Type() == nsAttrValue::eString &&
         !aData->PropertyIsSet(eCSSProperty_font_weight)) {
       nsAutoString str(value->GetStringValue());
       str.CompressWhitespace();
       if (str.EqualsASCII("normal")) {
         aData->SetKeywordValue(eCSSProperty_font_weight,
-                               NS_STYLE_FONT_WEIGHT_NORMAL);
+                               NS_FONT_WEIGHT_NORMAL);
       } else if (str.EqualsASCII("bold")) {
         aData->SetKeywordValue(eCSSProperty_font_weight,
-                               NS_STYLE_FONT_WEIGHT_BOLD);
+                               NS_FONT_WEIGHT_BOLD);
       }
     }
   }
 
   // mathvariant
   //
   // "Specifies the logical class of the token. Note that this class is more
   // than styling, it typically conveys semantic intent;"
--- a/dom/media/webaudio/test/mochitest.ini
+++ b/dom/media/webaudio/test/mochitest.ini
@@ -66,18 +66,20 @@ tags=capturestream
 [test_audioDestinationNode.html]
 [test_AudioListener.html]
 [test_AudioNodeDevtoolsAPI.html]
 [test_audioParamChaining.html]
 [test_AudioParamDevtoolsAPI.html]
 [test_audioParamExponentialRamp.html]
 [test_audioParamGain.html]
 [test_audioParamLinearRamp.html]
+skip-if = os == "linux" || os == "win" #bug 1446346
 [test_audioParamSetCurveAtTime.html]
 [test_audioParamSetCurveAtTimeTwice.html]
+skip-if = os == "linux" || os == "win" #bug 1446456
 [test_audioParamSetCurveAtTimeZeroDuration.html]
 [test_audioParamSetTargetAtTime.html]
 [test_audioParamSetTargetAtTimeZeroTimeConstant.html]
 [test_audioParamSetValueAtTime.html]
 [test_audioParamTimelineDestinationOffset.html]
 [test_badConnect.html]
 [test_biquadFilterNode.html]
 [test_biquadFilterNodePassThrough.html]
--- a/dom/serviceworkers/ServiceWorkerRegistrar.cpp
+++ b/dom/serviceworkers/ServiceWorkerRegistrar.cpp
@@ -784,41 +784,54 @@ ServiceWorkerRegistrar::RegisterServiceW
 }
 
 class ServiceWorkerRegistrarSaveDataRunnable final : public Runnable
 {
 public:
   ServiceWorkerRegistrarSaveDataRunnable()
     : Runnable("dom::ServiceWorkerRegistrarSaveDataRunnable")
     , mEventTarget(GetCurrentThreadEventTarget())
+    , mRetryCounter(0)
   {
     AssertIsOnBackgroundThread();
   }
 
   NS_IMETHOD
   Run() override
   {
     RefPtr<ServiceWorkerRegistrar> service = ServiceWorkerRegistrar::Get();
     MOZ_ASSERT(service);
 
-    service->SaveData();
+    // If the save fails, try again once in case it was a temporary
+    // problem due to virus scanning, etc.
+    static const uint32_t kMaxSaveRetryCount = 1;
+
+    nsresult rv = service->SaveData();
+    if (NS_FAILED(rv) && mRetryCounter < kMaxSaveRetryCount) {
+      rv = GetCurrentThreadEventTarget()->Dispatch(this, NS_DISPATCH_NORMAL);
+      if (NS_SUCCEEDED(rv)) {
+        mRetryCounter += 1;
+        return NS_OK;
+      }
+    }
 
     RefPtr<Runnable> runnable =
       NewRunnableMethod("ServiceWorkerRegistrar::DataSaved",
                         service, &ServiceWorkerRegistrar::DataSaved);
-    nsresult rv = mEventTarget->Dispatch(runnable, NS_DISPATCH_NORMAL);
+    rv = mEventTarget->Dispatch(runnable, NS_DISPATCH_NORMAL);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     return NS_OK;
   }
 
 private:
   nsCOMPtr<nsIEventTarget> mEventTarget;
+  uint32_t mRetryCounter;
 };
 
 void
 ServiceWorkerRegistrar::ScheduleSaveData()
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(!mShuttingDown);
 
@@ -840,26 +853,30 @@ void
 ServiceWorkerRegistrar::ShutdownCompleted()
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   DebugOnly<nsresult> rv = GetShutdownPhase()->RemoveBlocker(this);
   MOZ_ASSERT(NS_SUCCEEDED(rv));
 }
 
-void
+nsresult
 ServiceWorkerRegistrar::SaveData()
 {
   MOZ_ASSERT(!NS_IsMainThread());
 
   nsresult rv = WriteData();
   if (NS_FAILED(rv)) {
     NS_WARNING("Failed to write data for the ServiceWorker Registations.");
-    DeleteData();
+    // Don't touch the file or in-memory state.  Writing files can
+    // sometimes fail due to virus scanning, etc.  We should just leave
+    // things as is so the next save operation can pick up any changes
+    // without losing data.
   }
+  return rv;
 }
 
 void
 ServiceWorkerRegistrar::DataSaved()
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(mRunnableCounter);
 
--- a/dom/serviceworkers/ServiceWorkerRegistrar.h
+++ b/dom/serviceworkers/ServiceWorkerRegistrar.h
@@ -58,17 +58,17 @@ public:
   void UnregisterServiceWorker(const mozilla::ipc::PrincipalInfo& aPrincipalInfo,
                                const nsACString& aScope);
   void RemoveAll();
 
 protected:
   // These methods are protected because we test this class using gTest
   // subclassing it.
   void LoadData();
-  void SaveData();
+  nsresult SaveData();
 
   nsresult ReadData();
   nsresult WriteData();
   void DeleteData();
 
   void RegisterServiceWorkerInternal(const ServiceWorkerRegistrationData& aData);
 
   ServiceWorkerRegistrar();
--- a/layout/style/FontFaceSet.cpp
+++ b/layout/style/FontFaceSet.cpp
@@ -967,32 +967,32 @@ FontFaceSet::FindOrCreateUserFontEntryFr
                                                    FontFace* aFontFace,
                                                    SheetType aSheetType)
 {
   FontFaceSet* set = aFontFace->GetPrimaryFontFaceSet();
 
   nsCSSValue val;
   nsCSSUnit unit;
 
-  uint32_t weight = NS_STYLE_FONT_WEIGHT_NORMAL;
+  uint32_t weight = NS_FONT_WEIGHT_NORMAL;
   int32_t stretch = NS_STYLE_FONT_STRETCH_NORMAL;
   uint8_t italicStyle = NS_STYLE_FONT_STYLE_NORMAL;
   uint32_t languageOverride = NO_FONT_LANGUAGE_OVERRIDE;
   uint8_t fontDisplay = NS_FONT_DISPLAY_AUTO;
 
   // set up weight
   aFontFace->GetDesc(eCSSFontDesc_Weight, val);
   unit = val.GetUnit();
   if (unit == eCSSUnit_Integer || unit == eCSSUnit_Enumerated) {
     weight = val.GetIntValue();
     if (weight == 0) {
-      weight = NS_STYLE_FONT_WEIGHT_NORMAL;
+      weight = NS_FONT_WEIGHT_NORMAL;
     }
   } else if (unit == eCSSUnit_Normal) {
-    weight = NS_STYLE_FONT_WEIGHT_NORMAL;
+    weight = NS_FONT_WEIGHT_NORMAL;
   } else {
     NS_ASSERTION(unit == eCSSUnit_Null,
                  "@font-face weight has unexpected unit");
   }
 
   // set up stretch
   aFontFace->GetDesc(eCSSFontDesc_Stretch, val);
   unit = val.GetUnit();
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -1370,18 +1370,18 @@ const KTableEntry nsCSSProps::kFontVaria
 
 const KTableEntry nsCSSProps::kFontVariantPositionKTable[] = {
   { eCSSKeyword_super, NS_FONT_VARIANT_POSITION_SUPER },
   { eCSSKeyword_sub, NS_FONT_VARIANT_POSITION_SUB },
   { eCSSKeyword_UNKNOWN, -1 }
 };
 
 const KTableEntry nsCSSProps::kFontWeightKTable[] = {
-  { eCSSKeyword_normal, NS_STYLE_FONT_WEIGHT_NORMAL },
-  { eCSSKeyword_bold, NS_STYLE_FONT_WEIGHT_BOLD },
+  { eCSSKeyword_normal, NS_FONT_WEIGHT_NORMAL },
+  { eCSSKeyword_bold, NS_FONT_WEIGHT_BOLD },
   { eCSSKeyword_bolder, NS_STYLE_FONT_WEIGHT_BOLDER },
   { eCSSKeyword_lighter, NS_STYLE_FONT_WEIGHT_LIGHTER },
   { eCSSKeyword_UNKNOWN, -1 }
 };
 
 const KTableEntry nsCSSProps::kGridAutoFlowKTable[] = {
   { eCSSKeyword_row, NS_STYLE_GRID_AUTO_FLOW_ROW },
   { eCSSKeyword_column, NS_STYLE_GRID_AUTO_FLOW_COLUMN },
deleted file mode 100644
--- a/layout/style/nsNthIndexCache.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#ifndef nsContentIndexCache_h__
-#define nsContentIndexCache_h__
-
-#include "js/HashTable.h"
-
-class nsIContent;
-
-namespace mozilla {
-namespace dom {
-class Element;
-} // namespace dom
-} // namespace mozilla
-
-/*
- * A class that computes and caches the indices used for :nth-* pseudo-class
- * matching.
- */
-
-class nsNthIndexCache {
-private:
-  typedef mozilla::dom::Element Element;
-
-public:
-  /**
-   * Constructor and destructor out of line so that we don't try to
-   * instantiate the hashtable template all over the place.
-   */
-  nsNthIndexCache();
-  ~nsNthIndexCache();
-
-  // Returns a 1-based index of the child in its parent.  If the child
-  // is not in its parent's child list (i.e., it is anonymous content),
-  // returns 0.
-  // If aCheckEdgeOnly is true, the function will return 1 if the result
-  // is 1, and something other than 1 (maybe or maybe not a valid
-  // result) otherwise.
-  // This must only be called on nodes which have a non-null parent.
-  int32_t GetNthIndex(Element* aChild, bool aIsOfType, bool aIsFromEnd,
-                      bool aCheckEdgeOnly);
-
-  void Reset();
-
-private:
-  /**
-   * Returns true if aSibling and aElement should be considered in the same
-   * list for nth-index purposes, taking aIsOfType into account.
-   */
-  inline bool SiblingMatchesElement(nsIContent* aSibling, Element* aElement,
-                                    bool aIsOfType);
-
-  // This node's index for this cache.
-  // If -2, needs to be computed.
-  // If -1, needs to be computed but known not to be 1.
-  // If 0, the node is not at any index in its parent.
-  typedef int32_t CacheEntry;
-
-  class SystemAllocPolicy {
-  public:
-    void *malloc_(size_t bytes) { return ::malloc(bytes); }
-
-    template <typename T>
-    T *maybe_pod_calloc(size_t numElems) {
-      return static_cast<T *>(::calloc(numElems, sizeof(T)));
-    }
-
-    template <typename T>
-    T *pod_calloc(size_t numElems) {
-      return maybe_pod_calloc<T>(numElems);
-    }
-
-    void *realloc_(void *p, size_t bytes) { return ::realloc(p, bytes); }
-    void free_(void *p) { ::free(p); }
-    void reportAllocOverflow() const {}
-    bool checkSimulatedOOM() const { return true; }
-  };
-
-  typedef js::HashMap<nsIContent*, CacheEntry, js::DefaultHasher<nsIContent*>,
-                      SystemAllocPolicy> Cache;
-
-  /**
-   * Returns true if aResult has been set to the correct value for aChild and
-   * no more work needs to be done.  Returns false otherwise.
-   *
-   * aResult is an inout parameter.  The in value is the number of elements
-   * that are in the half-open range (aSibling, aChild] (so including aChild
-   * but not including aSibling) that match aChild.  The out value is the
-   * correct index for aChild if this function returns true and the number of
-   * elements in the closed range [aSibling, aChild] that match aChild
-   * otherwise.
-   */
-  inline bool IndexDeterminedFromPreviousSibling(nsIContent* aSibling,
-                                                 Element* aChild,
-                                                 bool aIsOfType,
-                                                 bool aIsFromEnd,
-                                                 const Cache& aCache,
-                                                 int32_t& aResult);
-
-  // Caches of indices for :nth-child(), :nth-last-child(),
-  // :nth-of-type(), :nth-last-of-type(), keyed by Element*.
-  //
-  // The first subscript is 0 for -child and 1 for -of-type, the second
-  // subscript is 0 for nth- and 1 for nth-last-.
-  Cache mCaches[2][2];
-};
-
-#endif /* nsContentIndexCache_h__ */
--- a/layout/style/nsStyleConsts.h
+++ b/layout/style/nsStyleConsts.h
@@ -568,19 +568,16 @@ enum class StyleDisplay : uint8_t {
 
 // See nsStyleFont
 // We should eventually stop using the NS_STYLE_* variants here.
 #define NS_STYLE_FONT_STYLE_NORMAL              NS_FONT_STYLE_NORMAL
 #define NS_STYLE_FONT_STYLE_ITALIC              NS_FONT_STYLE_ITALIC
 #define NS_STYLE_FONT_STYLE_OBLIQUE             NS_FONT_STYLE_OBLIQUE
 
 // See nsStyleFont
-// We should eventually stop using the NS_STYLE_* variants here.
-#define NS_STYLE_FONT_WEIGHT_NORMAL             NS_FONT_WEIGHT_NORMAL
-#define NS_STYLE_FONT_WEIGHT_BOLD               NS_FONT_WEIGHT_BOLD
 // The constants below appear only in style sheets and not computed style.
 #define NS_STYLE_FONT_WEIGHT_BOLDER             (-1)
 #define NS_STYLE_FONT_WEIGHT_LIGHTER            (-2)
 
 // See nsStyleFont
 #define NS_STYLE_FONT_SIZE_XXSMALL              0
 #define NS_STYLE_FONT_SIZE_XSMALL               1
 #define NS_STYLE_FONT_SIZE_SMALL                2
--- a/taskcluster/taskgraph/target_tasks.py
+++ b/taskcluster/taskgraph/target_tasks.py
@@ -19,26 +19,32 @@ def _target_task(name):
     return wrap
 
 
 def get_method(method):
     """Get a target_task_method to pass to a TaskGraphGenerator."""
     return _target_task_methods[method]
 
 
-def filter_on_nightly(task, parameters):
+def filter_out_nightly(task, parameters):
     return not task.attributes.get('nightly') or parameters.get('include_nightly')
 
 
 def filter_for_project(task, parameters):
     """Filter tasks by project.  Optionally enable nightlies."""
     run_on_projects = set(task.attributes.get('run_on_projects', []))
     return match_run_on_projects(parameters['project'], run_on_projects)
 
 
+def filter_on_platforms(task, platforms):
+    """Filter tasks on the given platform"""
+    platform = task.attributes.get('build_platform')
+    return (platform in platforms)
+
+
 def filter_upload_symbols(task, parameters):
     # Filters out symbols when there are not part of a nightly or a release build
     # TODO Remove this too specific filter (bug 1353296)
     return '-upload-symbols' not in task.label or \
         task.attributes.get('nightly') or \
         parameters.get('project') in ('mozilla-beta', 'mozilla-release')
 
 
@@ -83,17 +89,17 @@ def filter_beta_release_tasks(task, para
         return False
 
     return True
 
 
 def standard_filter(task, parameters):
     return all(
         filter_func(task, parameters) for filter_func in
-        (filter_on_nightly, filter_for_project, filter_upload_symbols)
+        (filter_out_nightly, filter_for_project, filter_upload_symbols)
     )
 
 
 def _try_task_config(full_task_graph, parameters, graph_config):
     requested_tasks = parameters['try_task_config']['tasks']
     return list(set(requested_tasks) & full_task_graph.graph.nodes)
 
 
@@ -244,46 +250,16 @@ def target_tasks_valgrind(full_task_grap
         if task.attributes.get('unittest_suite', '').startswith('mochitest') and \
            task.attributes.get('unittest_flavor', '').startswith('valgrind-plain'):
             return True
         return False
 
     return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
 
 
-@_target_task('nightly_fennec')
-def target_tasks_nightly_fennec(full_task_graph, parameters, graph_config):
-    """Select the set of tasks required for a nightly build of fennec. The
-    nightly build process involves a pipeline of builds, signing,
-    and, eventually, uploading the tasks to balrog."""
-    def filter(task):
-        platform = task.attributes.get('build_platform')
-        if platform in ('android-aarch64-nightly',
-                        'android-api-16-nightly',
-                        'android-nightly',
-                        'android-x86-nightly',
-                        ):
-            if not task.attributes.get('nightly', False):
-                return False
-            return filter_for_project(task, parameters)
-    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
-
-
-@_target_task('nightly_linux')
-def target_tasks_nightly_linux(full_task_graph, parameters, graph_config):
-    """Select the set of tasks required for a nightly build of linux. The
-    nightly build process involves a pipeline of builds, signing,
-    and, eventually, uploading the tasks to balrog."""
-    def filter(task):
-        platform = task.attributes.get('build_platform')
-        if platform in ('linux64-nightly', 'linux-nightly'):
-            return task.attributes.get('nightly', False)
-    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
-
-
 @_target_task('mozilla_beta_tasks')
 def target_tasks_mozilla_beta(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a promotable beta or release build
     of desktop, plus android CI. The candidates build process involves a pipeline
     of builds and signing, but does not include beetmover or balrog jobs."""
 
     return [l for l, t in full_task_graph.tasks.iteritems() if
             filter_beta_release_tasks(t, parameters)]
@@ -532,54 +508,82 @@ def target_tasks_pine(full_task_graph, p
         if platform == 'linux64-asan':
             return False
         # disable non-pine and nightly tasks
         if standard_filter(task, parameters):
             return True
     return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
 
 
+@_target_task('nightly_fennec')
+def target_tasks_nightly_fennec(full_task_graph, parameters, graph_config):
+    """Select the set of tasks required for a nightly build of fennec. The
+    nightly build process involves a pipeline of builds, signing,
+    and, eventually, uploading the tasks to balrog."""
+    def filter(task):
+        platform = task.attributes.get('build_platform')
+        if not filter_for_project(task, parameters):
+            return False
+        if platform in ('android-aarch64-nightly',
+                        'android-api-16-nightly',
+                        'android-nightly',
+                        'android-x86-nightly',
+                        ):
+            if not task.attributes.get('nightly', False):
+                return False
+            return filter_for_project(task, parameters)
+    filter
+    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
+
+
+def make_nightly_filter(platforms):
+    """Returns a filter that gets all nightly tasks on the given platform."""
+    def filter(task, parameters):
+        return all([
+            filter_on_platforms(task, platforms),
+            filter_for_project(task, parameters),
+            task.attributes.get('nightly', False),
+        ])
+    return filter
+
+
+@_target_task('nightly_linux')
+def target_tasks_nightly_linux(full_task_graph, parameters, graph_config):
+    """Select the set of tasks required for a nightly build of linux. The
+    nightly build process involves a pipeline of builds, signing,
+    and, eventually, uploading the tasks to balrog."""
+    filter = make_nightly_filter({'linux64-nightly', 'linux-nightly'})
+    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t, parameters)]
+
+
 @_target_task('nightly_macosx')
 def target_tasks_nightly_macosx(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of macosx. The
     nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    def filter(task):
-        platform = task.attributes.get('build_platform')
-        if platform in ('macosx64-nightly', ):
-            return task.attributes.get('nightly', False)
-    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
+    filter = make_nightly_filter({'macosx64-nightly'})
+    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t, parameters)]
 
 
 @_target_task('nightly_win32')
 def target_tasks_nightly_win32(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of win32 and win64.
     The nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    def filter(task):
-        platform = task.attributes.get('build_platform')
-        if not filter_for_project(task, parameters):
-            return False
-        if platform in ('win32-nightly', ):
-            return task.attributes.get('nightly', False)
-    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
+    filter = make_nightly_filter({'win32-nightly'})
+    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t, parameters)]
 
 
 @_target_task('nightly_win64')
 def target_tasks_nightly_win64(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of win32 and win64.
     The nightly build process involves a pipeline of builds, signing,
     and, eventually, uploading the tasks to balrog."""
-    def filter(task):
-        platform = task.attributes.get('build_platform')
-        if not filter_for_project(task, parameters):
-            return False
-        if platform in ('win64-nightly', ):
-            return task.attributes.get('nightly', False)
-    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
+    filter = make_nightly_filter({'win64-nightly'})
+    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t, parameters)]
 
 
 @_target_task('nightly_desktop')
 def target_tasks_nightly_desktop(full_task_graph, parameters, graph_config):
     """Select the set of tasks required for a nightly build of linux, mac,
     windows."""
     # Avoid duplicate tasks.
     return list(
--- a/taskcluster/taskgraph/util/attributes.py
+++ b/taskcluster/taskgraph/util/attributes.py
@@ -7,22 +7,24 @@ from __future__ import absolute_import, 
 import re
 
 
 INTEGRATION_PROJECTS = {
     'mozilla-inbound',
     'autoland',
 }
 
-TRUNK_PROJECTS = INTEGRATION_PROJECTS | {'mozilla-central', }
+TRUNK_PROJECTS = INTEGRATION_PROJECTS | {'mozilla-central', 'comm-central'}
 
 RELEASE_PROJECTS = {
     'mozilla-central',
     'mozilla-beta',
     'mozilla-release',
+    'comm-central',
+    'comm-beta',
 }
 
 RELEASE_PROMOTION_PROJECTS = {
     'jamun',
     'maple',
     'try',
 } | RELEASE_PROJECTS
 
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -6311,21 +6311,21 @@
     "expires_in_version": "59",
     "kind": "categorical",
     "labels": ["unknown", "general", "search", "content", "applications", "privacy", "security", "sync", "advancedGeneral", "advancedDataChoices", "advancedNetwork", "advancedUpdates", "advancedCerts"],
     "releaseChannelCollection": "opt-out",
     "description": "Count how often each preference category is opened."
   },
   "FX_PREFERENCES_CATEGORY_OPENED_V2": {
     "record_in_processes": ["main", "content"],
-    "bug_numbers": [1335907, 1425173],
+    "bug_numbers": [1335907, 1425173, 1451006],
     "alert_emails": ["jaws@mozilla.com"],
     "expires_in_version": "66",
     "kind": "categorical",
-    "labels": ["unknown", "searchresults", "general", "applications", "privacy", "sync", "advanced", "search"],
+    "labels": ["unknown", "searchresults", "general", "applications", "privacy", "sync", "advanced", "search", "home"],
     "releaseChannelCollection": "opt-out",
     "description": "Count how often each preference category is opened."
   },
   "FX_PREFERENCES_OPENED_VIA": {
     "record_in_processes": ["main", "content"],
     "bug_numbers": [1330315, 1420062, 1427973],
     "alert_emails": ["jaws@mozilla.com"],
     "expires_in_version": "63",
--- a/toolkit/locales/jar.mn
+++ b/toolkit/locales/jar.mn
@@ -53,19 +53,17 @@
   locale/@AB_CD@/global/languageNames.properties        (%chrome/global/languageNames.properties)
   locale/@AB_CD@/global/mozilla.dtd                     (%chrome/global/mozilla.dtd)
 #ifndef MOZ_FENNEC
   locale/@AB_CD@/global/narrate.properties              (%chrome/global/narrate.properties)
 #endif
   locale/@AB_CD@/global/notification.dtd                (%chrome/global/notification.dtd)
   locale/@AB_CD@/global/preferences.dtd                 (%chrome/global/preferences.dtd)
 #ifndef MOZ_FENNEC
-#ifndef MOZ_GTK
   locale/@AB_CD@/global/printPageSetup.dtd              (%chrome/global/printPageSetup.dtd)
-#endif
   locale/@AB_CD@/global/printPreview.dtd                (%chrome/global/printPreview.dtd)
   locale/@AB_CD@/global/printPreviewProgress.dtd        (%chrome/global/printPreviewProgress.dtd)
   locale/@AB_CD@/global/printdialog.properties          (%chrome/global/printdialog.properties)
   locale/@AB_CD@/global/printProgress.dtd               (%chrome/global/printProgress.dtd)
 #endif
   locale/@AB_CD@/global/regionNames.properties          (%chrome/global/regionNames.properties)
   locale/@AB_CD@/global/resetProfile.dtd                (%chrome/global/resetProfile.dtd)
   locale/@AB_CD@/global/resetProfile.properties         (%chrome/global/resetProfile.properties)