Merge inbound to mozilla-central. a=merge
authorBrindusan Cristian <cbrindusan@mozilla.com>
Tue, 04 Jun 2019 06:47:20 +0300
changeset 476703 c909c105f914f69054b9a7c6b189ee39fa1cad44
parent 476702 38c2478a4825044a8c33bb72539b42fbdda833fc (current diff)
parent 476603 8bcc51aaa91e5aadd57bdf5484c200c3713baab8 (diff)
child 476704 360fe85b587f76c9edbf49f9683355bdbc15d5bf
child 476719 0e949672e35e323b850d9943aaad320f3ed29b3a
push id113305
push usercbrindusan@mozilla.com
push dateTue, 04 Jun 2019 03:54:43 +0000
treeherdermozilla-inbound@360fe85b587f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone69.0a1
first release with
nightly linux32
c909c105f914 / 69.0a1 / 20190604034844 / files
nightly linux64
c909c105f914 / 69.0a1 / 20190604034844 / files
nightly mac
c909c105f914 / 69.0a1 / 20190604034844 / files
nightly win32
c909c105f914 / 69.0a1 / 20190604034844 / files
nightly win64
c909c105f914 / 69.0a1 / 20190604034844 / 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
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -1352,17 +1352,18 @@ function RedirectLoad({ target: browser,
 
 let _resolveDelayedStartup;
 var delayedStartupPromise = new Promise(resolve => {
   _resolveDelayedStartup = resolve;
 });
 
 var gBrowserInit = {
   delayedStartupFinished: false,
-  idleTasksFinished: false,
+  idleTasksFinishedPromise: null,
+  idleTaskPromiseResolve: null,
 
   _tabToAdopt: undefined,
 
   getTabToAdopt() {
     if (this._tabToAdopt !== undefined) {
       return this._tabToAdopt;
     }
 
@@ -1981,17 +1982,17 @@ var gBrowserInit = {
     scheduleIdleTask(async () => {
       NewTabPagePreloading.maybeCreatePreloadedBrowser(window);
     });
 
     // This should always go last, since the idle tasks (except for the ones with
     // timeouts) should execute in order. Note that this observer notification is
     // not guaranteed to fire, since the window could close before we get here.
     scheduleIdleTask(() => {
-      this.idleTasksFinished = true;
+      this.idleTaskPromiseResolve();
       Services.obs.notifyObservers(window, "browser-idle-startup-tasks-finished");
     });
   },
 
   // Returns the URI(s) to load at startup if it is immediately known, or a
   // promise resolving to the URI to load.
   get uriToLoadPromise() {
     delete this.uriToLoadPromise;
@@ -2154,16 +2155,20 @@ var gBrowserInit = {
     window.docShell.treeOwner
           .QueryInterface(Ci.nsIInterfaceRequestor)
           .getInterface(Ci.nsIXULWindow)
           .XULBrowserWindow = null;
     window.browserDOMWindow = null;
   },
 };
 
+gBrowserInit.idleTasksFinishedPromise = new Promise(resolve => {
+  gBrowserInit.idleTaskPromiseResolve = resolve;
+});
+
 function HandleAppCommandEvent(evt) {
   switch (evt.command) {
   case "Back":
     BrowserBack();
     break;
   case "Forward":
     BrowserForward();
     break;
--- a/browser/components/extensions/test/browser/browser_ext_tabs_events.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_events.js
@@ -388,19 +388,18 @@ add_task(async function testTabCreateRel
 
   await extension.awaitMessage("tabRemoved");
   await extension.unload();
 
   BrowserTestUtils.removeTab(openerTab);
 });
 
 add_task(async function testLastTabRemoval() {
-  const CLOSE_WINDOW_PREF = "browser.tabs.closeWindowWithLastTab";
   await SpecialPowers.pushPrefEnv({set: [
-    [CLOSE_WINDOW_PREF, false],
+    ["browser.tabs.closeWindowWithLastTab", false],
   ]});
 
   async function background() {
     let windowId;
     browser.tabs.onCreated.addListener(tab => {
       browser.test.assertEq(windowId, tab.windowId,
                             "expecting onCreated after onRemoved on the same window");
       browser.test.sendMessage("tabCreated", `${tab.width}x${tab.height}`);
@@ -424,17 +423,17 @@ add_task(async function testLastTabRemov
   const expectedDims = `${oldBrowser.clientWidth}x${oldBrowser.clientHeight}`;
   BrowserTestUtils.removeTab(newWin.gBrowser.selectedTab);
 
   const actualDims = await extension.awaitMessage("tabCreated");
   is(actualDims, expectedDims, "created tab reports a size same to the removed last tab");
 
   await extension.unload();
   await BrowserTestUtils.closeWindow(newWin);
-  SpecialPowers.clearUserPref(CLOSE_WINDOW_PREF);
+  await SpecialPowers.popPrefEnv();
 });
 
 add_task(async function testTabActivationEvent() {
   async function background() {
     function makeExpectable() {
       let expectation = null, resolver = null;
       const expectable = param => {
         if (expectation === null) {
--- a/browser/extensions/pdfjs/README.mozilla
+++ b/browser/extensions/pdfjs/README.mozilla
@@ -1,5 +1,5 @@
 This is the PDF.js project output, https://github.com/mozilla/pdf.js
 
-Current extension version is: 2.2.189
+Current extension version is: 2.2.199
 
-Taken from upstream commit: f652cf8e
+Taken from upstream commit: 63014eb8
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -118,18 +118,18 @@ return /******/ (function(modules) { // 
 /************************************************************************/
 /******/ ([
 /* 0 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '2.2.189';
-var pdfjsBuild = 'f652cf8e';
+var pdfjsVersion = '2.2.199';
+var pdfjsBuild = '63014eb8';
 
 var pdfjsSharedUtil = __w_pdfjs_require__(1);
 
 var pdfjsDisplayAPI = __w_pdfjs_require__(6);
 
 var pdfjsDisplayTextLayer = __w_pdfjs_require__(18);
 
 var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(19);
@@ -1299,17 +1299,17 @@ function _fetchDocument(worker, source, 
   if (pdfDataRangeTransport) {
     source.length = pdfDataRangeTransport.length;
     source.initialData = pdfDataRangeTransport.initialData;
     source.progressiveDone = pdfDataRangeTransport.progressiveDone;
   }
 
   return worker.messageHandler.sendWithPromise('GetDocRequest', {
     docId,
-    apiVersion: '2.2.189',
+    apiVersion: '2.2.199',
     source: {
       data: source.data,
       url: source.url,
       password: source.password,
       disableAutoFetch: source.disableAutoFetch,
       rangeChunkSize: source.rangeChunkSize,
       length: source.length
     },
@@ -1971,17 +1971,17 @@ class LoopbackPort {
 
   removeEventListener(name, listener) {
     const i = this._listeners.indexOf(listener);
 
     this._listeners.splice(i, 1);
   }
 
   terminate() {
-    this._listeners = [];
+    this._listeners.length = 0;
   }
 
 }
 
 exports.LoopbackPort = LoopbackPort;
 
 const PDFWorker = function PDFWorkerClosure() {
   const pdfWorkerPorts = new WeakMap();
@@ -2291,18 +2291,18 @@ class WorkerTransport {
     }
 
     const waitOn = [];
     this.pageCache.forEach(function (page) {
       if (page) {
         waitOn.push(page._destroy());
       }
     });
-    this.pageCache = [];
-    this.pagePromises = [];
+    this.pageCache.length = 0;
+    this.pagePromises.length = 0;
     const terminated = this.messageHandler.sendWithPromise('Terminate', null);
     waitOn.push(terminated);
     Promise.all(waitOn).then(() => {
       this.fontLoader.clear();
 
       if (this._networkStream) {
         this._networkStream.cancelAllRequests();
       }
@@ -3095,19 +3095,19 @@ const InternalRenderTask = function Inte
       }
     }
 
   }
 
   return InternalRenderTask;
 }();
 
-const version = '2.2.189';
+const version = '2.2.199';
 exports.version = version;
-const build = 'f652cf8e';
+const build = '63014eb8';
 exports.build = build;
 
 /***/ }),
 /* 7 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js
+++ b/browser/extensions/pdfjs/content/build/pdf.worker.js
@@ -118,18 +118,18 @@ return /******/ (function(modules) { // 
 /************************************************************************/
 /******/ ([
 /* 0 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-const pdfjsVersion = '2.2.189';
-const pdfjsBuild = 'f652cf8e';
+const pdfjsVersion = '2.2.199';
+const pdfjsBuild = '63014eb8';
 
 const pdfjsCoreWorker = __w_pdfjs_require__(1);
 
 exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;
 
 /***/ }),
 /* 1 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
@@ -139,25 +139,25 @@ exports.WorkerMessageHandler = pdfjsCore
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.WorkerMessageHandler = exports.WorkerTask = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _pdf_manager = __w_pdfjs_require__(7);
+var _primitives = __w_pdfjs_require__(7);
+
+var _pdf_manager = __w_pdfjs_require__(8);
 
 var _is_node = _interopRequireDefault(__w_pdfjs_require__(47));
 
 var _message_handler = __w_pdfjs_require__(48);
 
-var _primitives = __w_pdfjs_require__(12);
-
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var WorkerTask = function WorkerTaskClosure() {
   function WorkerTask(name) {
     this.name = name;
     this.terminated = false;
     this._capability = (0, _util.createPromiseCapability)();
@@ -373,17 +373,17 @@ var WorkerMessageHandler = {
 
   createDocumentHandler(docParams, port) {
     var pdfManager;
     var terminated = false;
     var cancelXHRs = null;
     var WorkerTasks = [];
     const verbosity = (0, _util.getVerbosityLevel)();
     let apiVersion = docParams.apiVersion;
-    let workerVersion = '2.2.189';
+    let workerVersion = '2.2.199';
 
     if (apiVersion !== workerVersion) {
       throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`);
     }
 
     var docId = docParams.docId;
     var docBaseUrl = docParams.docBaseUrl;
     var workerHandlerName = docParams.docId + '_worker';
@@ -794,16 +794,17 @@ var WorkerMessageHandler = {
         pdfManager.terminate();
         pdfManager = null;
       }
 
       if (cancelXHRs) {
         cancelXHRs();
       }
 
+      (0, _primitives.clearPrimitiveCaches)();
       var waitOn = [];
       WorkerTasks.forEach(function (task) {
         waitOn.push(task.finished);
         task.terminate();
       });
       return Promise.all(waitOn).then(function () {
         handler.destroy();
         handler = null;
@@ -1747,25 +1748,348 @@ module.exports = typeof window !== 'unde
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.clearPrimitiveCaches = clearPrimitiveCaches;
+exports.isEOF = isEOF;
+exports.isCmd = isCmd;
+exports.isDict = isDict;
+exports.isName = isName;
+exports.isRef = isRef;
+exports.isRefsEqual = isRefsEqual;
+exports.isStream = isStream;
+exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var EOF = {};
+exports.EOF = EOF;
+
+var Name = function NameClosure() {
+  let nameCache = Object.create(null);
+
+  function Name(name) {
+    this.name = name;
+  }
+
+  Name.prototype = {};
+
+  Name.get = function Name_get(name) {
+    var nameValue = nameCache[name];
+    return nameValue ? nameValue : nameCache[name] = new Name(name);
+  };
+
+  Name._clearCache = function () {
+    nameCache = Object.create(null);
+  };
+
+  return Name;
+}();
+
+exports.Name = Name;
+
+var Cmd = function CmdClosure() {
+  let cmdCache = Object.create(null);
+
+  function Cmd(cmd) {
+    this.cmd = cmd;
+  }
+
+  Cmd.prototype = {};
+
+  Cmd.get = function Cmd_get(cmd) {
+    var cmdValue = cmdCache[cmd];
+    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);
+  };
+
+  Cmd._clearCache = function () {
+    cmdCache = Object.create(null);
+  };
+
+  return Cmd;
+}();
+
+exports.Cmd = Cmd;
+
+var Dict = function DictClosure() {
+  var nonSerializable = function nonSerializableClosure() {
+    return nonSerializable;
+  };
+
+  function Dict(xref) {
+    this._map = Object.create(null);
+    this.xref = xref;
+    this.objId = null;
+    this.suppressEncryption = false;
+    this.__nonSerializable__ = nonSerializable;
+  }
+
+  Dict.prototype = {
+    assignXref: function Dict_assignXref(newXref) {
+      this.xref = newXref;
+    },
+    get: function Dict_get(key1, key2, key3) {
+      var value;
+      var xref = this.xref,
+          suppressEncryption = this.suppressEncryption;
+
+      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
+        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
+      }
+
+      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
+        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
+      }
+
+      value = this._map[key3] || null;
+      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
+    },
+    getAsync: function Dict_getAsync(key1, key2, key3) {
+      var value;
+      var xref = this.xref,
+          suppressEncryption = this.suppressEncryption;
+
+      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
+        if (xref) {
+          return xref.fetchIfRefAsync(value, suppressEncryption);
+        }
+
+        return Promise.resolve(value);
+      }
+
+      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
+        if (xref) {
+          return xref.fetchIfRefAsync(value, suppressEncryption);
+        }
+
+        return Promise.resolve(value);
+      }
+
+      value = this._map[key3] || null;
+
+      if (xref) {
+        return xref.fetchIfRefAsync(value, suppressEncryption);
+      }
+
+      return Promise.resolve(value);
+    },
+    getArray: function Dict_getArray(key1, key2, key3) {
+      var value = this.get(key1, key2, key3);
+      var xref = this.xref,
+          suppressEncryption = this.suppressEncryption;
+
+      if (!Array.isArray(value) || !xref) {
+        return value;
+      }
+
+      value = value.slice();
+
+      for (var i = 0, ii = value.length; i < ii; i++) {
+        if (!isRef(value[i])) {
+          continue;
+        }
+
+        value[i] = xref.fetch(value[i], suppressEncryption);
+      }
+
+      return value;
+    },
+    getRaw: function Dict_getRaw(key) {
+      return this._map[key];
+    },
+    getKeys: function Dict_getKeys() {
+      return Object.keys(this._map);
+    },
+    set: function Dict_set(key, value) {
+      this._map[key] = value;
+    },
+    has: function Dict_has(key) {
+      return key in this._map;
+    },
+    forEach: function Dict_forEach(callback) {
+      for (var key in this._map) {
+        callback(key, this.get(key));
+      }
+    }
+  };
+  Dict.empty = new Dict(null);
+
+  Dict.merge = function (xref, dictArray) {
+    let mergedDict = new Dict(xref);
+
+    for (let i = 0, ii = dictArray.length; i < ii; i++) {
+      let dict = dictArray[i];
+
+      if (!isDict(dict)) {
+        continue;
+      }
+
+      for (let keyName in dict._map) {
+        if (mergedDict._map[keyName] !== undefined) {
+          continue;
+        }
+
+        mergedDict._map[keyName] = dict._map[keyName];
+      }
+    }
+
+    return mergedDict;
+  };
+
+  return Dict;
+}();
+
+exports.Dict = Dict;
+
+var Ref = function RefClosure() {
+  let refCache = Object.create(null);
+
+  function Ref(num, gen) {
+    this.num = num;
+    this.gen = gen;
+  }
+
+  Ref.prototype = {
+    toString: function Ref_toString() {
+      if (this.gen === 0) {
+        return `${this.num}R`;
+      }
+
+      return `${this.num}R${this.gen}`;
+    }
+  };
+
+  Ref.get = function (num, gen) {
+    const key = gen === 0 ? `${num}R` : `${num}R${gen}`;
+    const refValue = refCache[key];
+    return refValue ? refValue : refCache[key] = new Ref(num, gen);
+  };
+
+  Ref._clearCache = function () {
+    refCache = Object.create(null);
+  };
+
+  return Ref;
+}();
+
+exports.Ref = Ref;
+
+var RefSet = function RefSetClosure() {
+  function RefSet() {
+    this.dict = Object.create(null);
+  }
+
+  RefSet.prototype = {
+    has: function RefSet_has(ref) {
+      return ref.toString() in this.dict;
+    },
+    put: function RefSet_put(ref) {
+      this.dict[ref.toString()] = true;
+    },
+    remove: function RefSet_remove(ref) {
+      delete this.dict[ref.toString()];
+    }
+  };
+  return RefSet;
+}();
+
+exports.RefSet = RefSet;
+
+var RefSetCache = function RefSetCacheClosure() {
+  function RefSetCache() {
+    this.dict = Object.create(null);
+  }
+
+  RefSetCache.prototype = {
+    get: function RefSetCache_get(ref) {
+      return this.dict[ref.toString()];
+    },
+    has: function RefSetCache_has(ref) {
+      return ref.toString() in this.dict;
+    },
+    put: function RefSetCache_put(ref, obj) {
+      this.dict[ref.toString()] = obj;
+    },
+    putAlias: function RefSetCache_putAlias(ref, aliasRef) {
+      this.dict[ref.toString()] = this.get(aliasRef);
+    },
+    forEach: function RefSetCache_forEach(fn, thisArg) {
+      for (var i in this.dict) {
+        fn.call(thisArg, this.dict[i]);
+      }
+    },
+    clear: function RefSetCache_clear() {
+      this.dict = Object.create(null);
+    }
+  };
+  return RefSetCache;
+}();
+
+exports.RefSetCache = RefSetCache;
+
+function isEOF(v) {
+  return v === EOF;
+}
+
+function isName(v, name) {
+  return v instanceof Name && (name === undefined || v.name === name);
+}
+
+function isCmd(v, cmd) {
+  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
+}
+
+function isDict(v, type) {
+  return v instanceof Dict && (type === undefined || isName(v.get('Type'), type));
+}
+
+function isRef(v) {
+  return v instanceof Ref;
+}
+
+function isRefsEqual(v1, v2) {
+  return v1.num === v2.num && v1.gen === v2.gen;
+}
+
+function isStream(v) {
+  return typeof v === 'object' && v !== null && v.getBytes !== undefined;
+}
+
+function clearPrimitiveCaches() {
+  Cmd._clearCache();
+
+  Name._clearCache();
+
+  Ref._clearCache();
+}
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
 exports.NetworkPdfManager = exports.LocalPdfManager = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _chunked_stream = __w_pdfjs_require__(8);
-
-var _core_utils = __w_pdfjs_require__(9);
-
-var _document = __w_pdfjs_require__(10);
+var _chunked_stream = __w_pdfjs_require__(9);
+
+var _core_utils = __w_pdfjs_require__(10);
+
+var _document = __w_pdfjs_require__(11);
 
 var _stream = __w_pdfjs_require__(14);
 
 class BasePdfManager {
   constructor() {
     if (this.constructor === BasePdfManager) {
       (0, _util.unreachable)('Cannot initialize BasePdfManager.');
     }
@@ -1945,30 +2269,30 @@ class NetworkPdfManager extends BasePdfM
     this.streamManager.abort();
   }
 
 }
 
 exports.NetworkPdfManager = NetworkPdfManager;
 
 /***/ }),
-/* 8 */
+/* 9 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.ChunkedStreamManager = exports.ChunkedStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 class ChunkedStream {
   constructor(length, chunkSize, manager) {
     this.bytes = new Uint8Array(length);
     this.start = 0;
     this.pos = 0;
     this.end = length;
     this.chunkSize = chunkSize;
@@ -2522,17 +2846,17 @@ class ChunkedStreamManager {
     }
   }
 
 }
 
 exports.ChunkedStreamManager = ChunkedStreamManager;
 
 /***/ }),
-/* 9 */
+/* 10 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -2652,34 +2976,34 @@ function toRomanNumerals(number, lowerCa
   number %= 10;
   romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
   romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
   const romanStr = romanBuf.join('');
   return lowerCase ? romanStr.toLowerCase() : romanStr;
 }
 
 /***/ }),
-/* 10 */
+/* 11 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.PDFDocument = exports.Page = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _obj = __w_pdfjs_require__(11);
-
-var _primitives = __w_pdfjs_require__(12);
-
-var _core_utils = __w_pdfjs_require__(9);
+var _obj = __w_pdfjs_require__(12);
+
+var _primitives = __w_pdfjs_require__(7);
+
+var _core_utils = __w_pdfjs_require__(10);
 
 var _stream = __w_pdfjs_require__(14);
 
 var _annotation = __w_pdfjs_require__(26);
 
 var _crypto = __w_pdfjs_require__(24);
 
 var _parser = __w_pdfjs_require__(13);
@@ -3351,36 +3675,36 @@ class PDFDocument {
     return this.catalog.cleanup();
   }
 
 }
 
 exports.PDFDocument = PDFDocument;
 
 /***/ }),
-/* 11 */
+/* 12 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _parser = __w_pdfjs_require__(13);
 
-var _core_utils = __w_pdfjs_require__(9);
-
-var _chunked_stream = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(10);
+
+var _chunked_stream = __w_pdfjs_require__(9);
 
 var _crypto = __w_pdfjs_require__(24);
 
 var _colorspace = __w_pdfjs_require__(25);
 
 function fetchDestination(dest) {
   return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;
 }
@@ -5576,365 +5900,42 @@ let ObjectLoader = function () {
 
   };
   return ObjectLoader;
 }();
 
 exports.ObjectLoader = ObjectLoader;
 
 /***/ }),
-/* 12 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.clearPrimitiveCaches = clearPrimitiveCaches;
-exports.isEOF = isEOF;
-exports.isCmd = isCmd;
-exports.isDict = isDict;
-exports.isName = isName;
-exports.isRef = isRef;
-exports.isRefsEqual = isRefsEqual;
-exports.isStream = isStream;
-exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = void 0;
-
-var _util = __w_pdfjs_require__(2);
-
-var EOF = {};
-exports.EOF = EOF;
-
-var Name = function NameClosure() {
-  let nameCache = Object.create(null);
-
-  function Name(name) {
-    this.name = name;
-  }
-
-  Name.prototype = {};
-
-  Name.get = function Name_get(name) {
-    var nameValue = nameCache[name];
-    return nameValue ? nameValue : nameCache[name] = new Name(name);
-  };
-
-  Name._clearCache = function () {
-    nameCache = Object.create(null);
-  };
-
-  return Name;
-}();
-
-exports.Name = Name;
-
-var Cmd = function CmdClosure() {
-  let cmdCache = Object.create(null);
-
-  function Cmd(cmd) {
-    this.cmd = cmd;
-  }
-
-  Cmd.prototype = {};
-
-  Cmd.get = function Cmd_get(cmd) {
-    var cmdValue = cmdCache[cmd];
-    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);
-  };
-
-  Cmd._clearCache = function () {
-    cmdCache = Object.create(null);
-  };
-
-  return Cmd;
-}();
-
-exports.Cmd = Cmd;
-
-var Dict = function DictClosure() {
-  var nonSerializable = function nonSerializableClosure() {
-    return nonSerializable;
-  };
-
-  function Dict(xref) {
-    this._map = Object.create(null);
-    this.xref = xref;
-    this.objId = null;
-    this.suppressEncryption = false;
-    this.__nonSerializable__ = nonSerializable;
-  }
-
-  Dict.prototype = {
-    assignXref: function Dict_assignXref(newXref) {
-      this.xref = newXref;
-    },
-    get: function Dict_get(key1, key2, key3) {
-      var value;
-      var xref = this.xref,
-          suppressEncryption = this.suppressEncryption;
-
-      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
-        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
-      }
-
-      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
-        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
-      }
-
-      value = this._map[key3] || null;
-      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
-    },
-    getAsync: function Dict_getAsync(key1, key2, key3) {
-      var value;
-      var xref = this.xref,
-          suppressEncryption = this.suppressEncryption;
-
-      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
-        if (xref) {
-          return xref.fetchIfRefAsync(value, suppressEncryption);
-        }
-
-        return Promise.resolve(value);
-      }
-
-      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
-        if (xref) {
-          return xref.fetchIfRefAsync(value, suppressEncryption);
-        }
-
-        return Promise.resolve(value);
-      }
-
-      value = this._map[key3] || null;
-
-      if (xref) {
-        return xref.fetchIfRefAsync(value, suppressEncryption);
-      }
-
-      return Promise.resolve(value);
-    },
-    getArray: function Dict_getArray(key1, key2, key3) {
-      var value = this.get(key1, key2, key3);
-      var xref = this.xref,
-          suppressEncryption = this.suppressEncryption;
-
-      if (!Array.isArray(value) || !xref) {
-        return value;
-      }
-
-      value = value.slice();
-
-      for (var i = 0, ii = value.length; i < ii; i++) {
-        if (!isRef(value[i])) {
-          continue;
-        }
-
-        value[i] = xref.fetch(value[i], suppressEncryption);
-      }
-
-      return value;
-    },
-    getRaw: function Dict_getRaw(key) {
-      return this._map[key];
-    },
-    getKeys: function Dict_getKeys() {
-      return Object.keys(this._map);
-    },
-    set: function Dict_set(key, value) {
-      this._map[key] = value;
-    },
-    has: function Dict_has(key) {
-      return key in this._map;
-    },
-    forEach: function Dict_forEach(callback) {
-      for (var key in this._map) {
-        callback(key, this.get(key));
-      }
-    }
-  };
-  Dict.empty = new Dict(null);
-
-  Dict.merge = function (xref, dictArray) {
-    let mergedDict = new Dict(xref);
-
-    for (let i = 0, ii = dictArray.length; i < ii; i++) {
-      let dict = dictArray[i];
-
-      if (!isDict(dict)) {
-        continue;
-      }
-
-      for (let keyName in dict._map) {
-        if (mergedDict._map[keyName] !== undefined) {
-          continue;
-        }
-
-        mergedDict._map[keyName] = dict._map[keyName];
-      }
-    }
-
-    return mergedDict;
-  };
-
-  return Dict;
-}();
-
-exports.Dict = Dict;
-
-var Ref = function RefClosure() {
-  let refCache = Object.create(null);
-
-  function Ref(num, gen) {
-    this.num = num;
-    this.gen = gen;
-  }
-
-  Ref.prototype = {
-    toString: function Ref_toString() {
-      if (this.gen === 0) {
-        return `${this.num}R`;
-      }
-
-      return `${this.num}R${this.gen}`;
-    }
-  };
-
-  Ref.get = function (num, gen) {
-    const key = gen === 0 ? `${num}R` : `${num}R${gen}`;
-    const refValue = refCache[key];
-    return refValue ? refValue : refCache[key] = new Ref(num, gen);
-  };
-
-  Ref._clearCache = function () {
-    refCache = Object.create(null);
-  };
-
-  return Ref;
-}();
-
-exports.Ref = Ref;
-
-var RefSet = function RefSetClosure() {
-  function RefSet() {
-    this.dict = Object.create(null);
-  }
-
-  RefSet.prototype = {
-    has: function RefSet_has(ref) {
-      return ref.toString() in this.dict;
-    },
-    put: function RefSet_put(ref) {
-      this.dict[ref.toString()] = true;
-    },
-    remove: function RefSet_remove(ref) {
-      delete this.dict[ref.toString()];
-    }
-  };
-  return RefSet;
-}();
-
-exports.RefSet = RefSet;
-
-var RefSetCache = function RefSetCacheClosure() {
-  function RefSetCache() {
-    this.dict = Object.create(null);
-  }
-
-  RefSetCache.prototype = {
-    get: function RefSetCache_get(ref) {
-      return this.dict[ref.toString()];
-    },
-    has: function RefSetCache_has(ref) {
-      return ref.toString() in this.dict;
-    },
-    put: function RefSetCache_put(ref, obj) {
-      this.dict[ref.toString()] = obj;
-    },
-    putAlias: function RefSetCache_putAlias(ref, aliasRef) {
-      this.dict[ref.toString()] = this.get(aliasRef);
-    },
-    forEach: function RefSetCache_forEach(fn, thisArg) {
-      for (var i in this.dict) {
-        fn.call(thisArg, this.dict[i]);
-      }
-    },
-    clear: function RefSetCache_clear() {
-      this.dict = Object.create(null);
-    }
-  };
-  return RefSetCache;
-}();
-
-exports.RefSetCache = RefSetCache;
-
-function isEOF(v) {
-  return v === EOF;
-}
-
-function isName(v, name) {
-  return v instanceof Name && (name === undefined || v.name === name);
-}
-
-function isCmd(v, cmd) {
-  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
-}
-
-function isDict(v, type) {
-  return v instanceof Dict && (type === undefined || isName(v.get('Type'), type));
-}
-
-function isRef(v) {
-  return v instanceof Ref;
-}
-
-function isRefsEqual(v1, v2) {
-  return v1.num === v2.num && v1.gen === v2.gen;
-}
-
-function isStream(v) {
-  return typeof v === 'object' && v !== null && v.getBytes !== undefined;
-}
-
-function clearPrimitiveCaches() {
-  Cmd._clearCache();
-
-  Name._clearCache();
-
-  Ref._clearCache();
-}
-
-/***/ }),
 /* 13 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.Parser = exports.Linearization = exports.Lexer = void 0;
 
 var _stream = __w_pdfjs_require__(14);
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _ccitt_stream = __w_pdfjs_require__(15);
 
 var _jbig2_stream = __w_pdfjs_require__(17);
 
 var _jpeg_stream = __w_pdfjs_require__(20);
 
 var _jpx_stream = __w_pdfjs_require__(22);
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 const MAX_LENGTH_TO_CACHE = 1000;
 const MAX_ADLER32_LENGTH = 5552;
 
 function computeAdler32(bytes) {
   const bytesLength = bytes.length;
   let a = 1,
       b = 0;
@@ -7190,17 +7191,17 @@ exports.Linearization = Linearization;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.FlateStream = exports.DecodeStream = exports.DecryptStream = exports.AsciiHexStream = exports.Ascii85Stream = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var Stream = function StreamClosure() {
   function Stream(arrayBuffer, start, length, dict) {
     this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
     this.start = start || 0;
     this.pos = this.start;
     this.end = start + length || this.bytes.length;
     this.dict = dict;
@@ -8465,17 +8466,17 @@ exports.NullStream = NullStream;
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.CCITTFaxStream = void 0;
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _ccitt = __w_pdfjs_require__(16);
 
 var _stream = __w_pdfjs_require__(14);
 
 var CCITTFaxStream = function CCITTFaxStreamClosure() {
   function CCITTFaxStream(str, maybeLength, params) {
     this.str = str;
@@ -9237,17 +9238,17 @@ exports.CCITTFaxDecoder = CCITTFaxDecode
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.Jbig2Stream = void 0;
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _stream = __w_pdfjs_require__(14);
 
 var _jbig = __w_pdfjs_require__(18);
 
 var _util = __w_pdfjs_require__(2);
 
 let Jbig2Stream = function Jbig2StreamClosure() {
@@ -11892,17 +11893,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.JpegStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
 var _stream = __w_pdfjs_require__(14);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _jpg = __w_pdfjs_require__(21);
 
 let JpegStream = function JpegStreamClosure() {
   function JpegStream(stream, maybeLength, dict, params) {
     let ch;
 
     while ((ch = stream.getByte()) !== -1) {
@@ -15586,17 +15587,17 @@ exports.JpxImage = JpxImage;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _stream = __w_pdfjs_require__(14);
 
 var ARCFourCipher = function ARCFourCipherClosure() {
   function ARCFourCipher(key) {
     this.a = 0;
     this.b = 0;
     var s = new Uint8Array(256);
@@ -17176,17 +17177,17 @@ exports.CipherTransformFactory = CipherT
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.ColorSpace = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
   const COMPONENTS = 3;
   alpha01 = alpha01 !== 1 ? 0 : alpha01;
   let xRatio = w1 / w2;
   let yRatio = h1 / h2;
   let newIndex = 0,
       oldIndex;
@@ -18212,23 +18213,23 @@ const LabCS = function LabCSClosure() {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _obj = __w_pdfjs_require__(11);
-
-var _primitives = __w_pdfjs_require__(12);
+var _obj = __w_pdfjs_require__(12);
+
+var _primitives = __w_pdfjs_require__(7);
 
 var _colorspace = __w_pdfjs_require__(25);
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 var _operator_list = __w_pdfjs_require__(27);
 
 var _stream = __w_pdfjs_require__(14);
 
 class AnnotationFactory {
   static create(xref, ref, pdfManager, idFactory) {
     return pdfManager.ensure(this, '_create', [xref, ref, pdfManager, idFactory]);
@@ -18476,27 +18477,27 @@ class Annotation {
       return;
     }
 
     if (borderStyle.has('BS')) {
       let dict = borderStyle.get('BS');
       let dictType = dict.get('Type');
 
       if (!dictType || (0, _primitives.isName)(dictType, 'Border')) {
-        this.borderStyle.setWidth(dict.get('W'));
+        this.borderStyle.setWidth(dict.get('W'), this.rectangle);
         this.borderStyle.setStyle(dict.get('S'));
         this.borderStyle.setDashArray(dict.getArray('D'));
       }
     } else if (borderStyle.has('Border')) {
       let array = borderStyle.getArray('Border');
 
       if (Array.isArray(array) && array.length >= 3) {
         this.borderStyle.setHorizontalCornerRadius(array[0]);
         this.borderStyle.setVerticalCornerRadius(array[1]);
-        this.borderStyle.setWidth(array[2]);
+        this.borderStyle.setWidth(array[2], this.rectangle);
 
         if (array.length === 4) {
           this.borderStyle.setDashArray(array[3]);
         }
       }
     } else {
       this.borderStyle.setWidth(0);
     }
@@ -18578,23 +18579,33 @@ class AnnotationBorderStyle {
   constructor() {
     this.width = 1;
     this.style = _util.AnnotationBorderStyleType.SOLID;
     this.dashArray = [3];
     this.horizontalCornerRadius = 0;
     this.verticalCornerRadius = 0;
   }
 
-  setWidth(width) {
+  setWidth(width, rect = [0, 0, 0, 0]) {
     if ((0, _primitives.isName)(width)) {
       this.width = 0;
       return;
     }
 
     if (Number.isInteger(width)) {
+      if (width > 0) {
+        const maxWidth = (rect[2] - rect[0]) / 2;
+        const maxHeight = (rect[3] - rect[1]) / 2;
+
+        if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) {
+          (0, _util.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);
+          width = 1;
+        }
+      }
+
       this.width = width;
     }
   }
 
   setStyle(style) {
     if (!(0, _primitives.isName)(style)) {
       return;
     }
@@ -19840,17 +19851,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.PartialEvaluator = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
 var _cmap = __w_pdfjs_require__(29);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _fonts = __w_pdfjs_require__(30);
 
 var _encodings = __w_pdfjs_require__(33);
 
 var _unicode = __w_pdfjs_require__(36);
 
 var _standard_fonts = __w_pdfjs_require__(35);
@@ -19862,17 +19873,17 @@ var _parser = __w_pdfjs_require__(13);
 var _bidi = __w_pdfjs_require__(40);
 
 var _colorspace = __w_pdfjs_require__(25);
 
 var _stream = __w_pdfjs_require__(14);
 
 var _glyphlist = __w_pdfjs_require__(34);
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 var _metrics = __w_pdfjs_require__(41);
 
 var _function = __w_pdfjs_require__(42);
 
 var _jpeg_stream = __w_pdfjs_require__(20);
 
 var _murmurhash = __w_pdfjs_require__(44);
@@ -23122,21 +23133,21 @@ var EvaluatorPreprocessor = function Eva
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.CMapFactory = exports.IdentityCMap = exports.CMap = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _parser = __w_pdfjs_require__(13);
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 var _stream = __w_pdfjs_require__(14);
 
 var BUILT_IN_CMAPS = ['Adobe-GB1-UCS2', 'Adobe-CNS1-UCS2', 'Adobe-Japan1-UCS2', 'Adobe-Korea1-UCS2', '78-EUC-H', '78-EUC-V', '78-H', '78-RKSJ-H', '78-RKSJ-V', '78-V', '78ms-RKSJ-H', '78ms-RKSJ-V', '83pv-RKSJ-H', '90ms-RKSJ-H', '90ms-RKSJ-V', '90msp-RKSJ-H', '90msp-RKSJ-V', '90pv-RKSJ-H', '90pv-RKSJ-V', 'Add-H', 'Add-RKSJ-H', 'Add-RKSJ-V', 'Add-V', 'Adobe-CNS1-0', 'Adobe-CNS1-1', 'Adobe-CNS1-2', 'Adobe-CNS1-3', 'Adobe-CNS1-4', 'Adobe-CNS1-5', 'Adobe-CNS1-6', 'Adobe-GB1-0', 'Adobe-GB1-1', 'Adobe-GB1-2', 'Adobe-GB1-3', 'Adobe-GB1-4', 'Adobe-GB1-5', 'Adobe-Japan1-0', 'Adobe-Japan1-1', 'Adobe-Japan1-2', 'Adobe-Japan1-3', 'Adobe-Japan1-4', 'Adobe-Japan1-5', 'Adobe-Japan1-6', 'Adobe-Korea1-0', 'Adobe-Korea1-1', 'Adobe-Korea1-2', 'B5-H', 'B5-V', 'B5pc-H', 'B5pc-V', 'CNS-EUC-H', 'CNS-EUC-V', 'CNS1-H', 'CNS1-V', 'CNS2-H', 'CNS2-V', 'ETHK-B5-H', 'ETHK-B5-V', 'ETen-B5-H', 'ETen-B5-V', 'ETenms-B5-H', 'ETenms-B5-V', 'EUC-H', 'EUC-V', 'Ext-H', 'Ext-RKSJ-H', 'Ext-RKSJ-V', 'Ext-V', 'GB-EUC-H', 'GB-EUC-V', 'GB-H', 'GB-V', 'GBK-EUC-H', 'GBK-EUC-V', 'GBK2K-H', 'GBK2K-V', 'GBKp-EUC-H', 'GBKp-EUC-V', 'GBT-EUC-H', 'GBT-EUC-V', 'GBT-H', 'GBT-V', 'GBTpc-EUC-H', 'GBTpc-EUC-V', 'GBpc-EUC-H', 'GBpc-EUC-V', 'H', 'HKdla-B5-H', 'HKdla-B5-V', 'HKdlb-B5-H', 'HKdlb-B5-V', 'HKgccs-B5-H', 'HKgccs-B5-V', 'HKm314-B5-H', 'HKm314-B5-V', 'HKm471-B5-H', 'HKm471-B5-V', 'HKscs-B5-H', 'HKscs-B5-V', 'Hankaku', 'Hiragana', 'KSC-EUC-H', 'KSC-EUC-V', 'KSC-H', 'KSC-Johab-H', 'KSC-Johab-V', 'KSC-V', 'KSCms-UHC-H', 'KSCms-UHC-HW-H', 'KSCms-UHC-HW-V', 'KSCms-UHC-V', 'KSCpc-EUC-H', 'KSCpc-EUC-V', 'Katakana', 'NWP-H', 'NWP-V', 'RKSJ-H', 'RKSJ-V', 'Roman', 'UniCNS-UCS2-H', 'UniCNS-UCS2-V', 'UniCNS-UTF16-H', 'UniCNS-UTF16-V', 'UniCNS-UTF32-H', 'UniCNS-UTF32-V', 'UniCNS-UTF8-H', 'UniCNS-UTF8-V', 'UniGB-UCS2-H', 'UniGB-UCS2-V', 'UniGB-UTF16-H', 'UniGB-UTF16-V', 'UniGB-UTF32-H', 'UniGB-UTF32-V', 'UniGB-UTF8-H', 'UniGB-UTF8-V', 'UniJIS-UCS2-H', 'UniJIS-UCS2-HW-H', 'UniJIS-UCS2-HW-V', 'UniJIS-UCS2-V', 'UniJIS-UTF16-H', 'UniJIS-UTF16-V', 'UniJIS-UTF32-H', 'UniJIS-UTF32-V', 'UniJIS-UTF8-H', 'UniJIS-UTF8-V', 'UniJIS2004-UTF16-H', 'UniJIS2004-UTF16-V', 'UniJIS2004-UTF32-H', 'UniJIS2004-UTF32-V', 'UniJIS2004-UTF8-H', 'UniJIS2004-UTF8-V', 'UniJISPro-UCS2-HW-V', 'UniJISPro-UCS2-V', 'UniJISPro-UTF8-V', 'UniJISX0213-UTF32-H', 'UniJISX0213-UTF32-V', 'UniJISX02132004-UTF32-H', 'UniJISX02132004-UTF32-V', 'UniKS-UCS2-H', 'UniKS-UCS2-V', 'UniKS-UTF16-H', 'UniKS-UTF16-V', 'UniKS-UTF32-H', 'UniKS-UTF32-V', 'UniKS-UTF8-H', 'UniKS-UTF8-V', 'V', 'WP-Symbol'];
 
 class CMap {
   constructor(builtInCMap = false) {
     this.codespaceRanges = [[], [], [], []];
@@ -24034,17 +24045,17 @@ var _encodings = __w_pdfjs_require__(33)
 var _standard_fonts = __w_pdfjs_require__(35);
 
 var _unicode = __w_pdfjs_require__(36);
 
 var _font_renderer = __w_pdfjs_require__(37);
 
 var _cmap = __w_pdfjs_require__(29);
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 var _stream = __w_pdfjs_require__(14);
 
 var _type1_parser = __w_pdfjs_require__(38);
 
 const PRIVATE_USE_AREAS = [[0xE000, 0xF8FF], [0x100000, 0x10FFFD]];
 var PDF_GLYPH_SPACE_UNITS = 1000;
 var SEAC_ANALYSIS_ENABLED = true;
@@ -29053,17 +29064,17 @@ function getEncoding(encodingName) {
       return null;
   }
 }
 
 /***/ }),
 /* 34 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
-var getLookupTableFactory = __w_pdfjs_require__(9).getLookupTableFactory;
+var getLookupTableFactory = __w_pdfjs_require__(10).getLookupTableFactory;
 var getGlyphsUnicode = getLookupTableFactory(function (t) {
  t['A'] = 0x0041;
  t['AE'] = 0x00C6;
  t['AEacute'] = 0x01FC;
  t['AEmacron'] = 0x01E2;
  t['AEsmall'] = 0xF7E6;
  t['Aacute'] = 0x00C1;
  t['Aacutesmall'] = 0xF7E1;
@@ -33597,17 +33608,17 @@ exports.getDingbatsGlyphsUnicode = getDi
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = void 0;
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 const getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {
   t['ArialNarrow'] = 'Helvetica';
   t['ArialNarrow-Bold'] = 'Helvetica-Bold';
   t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique';
   t['ArialNarrow-Italic'] = 'Helvetica-Oblique';
   t['ArialBlack'] = 'Helvetica';
   t['ArialBlack-Bold'] = 'Helvetica-Bold';
@@ -34332,17 +34343,17 @@ const getSupplementalGlyphMapForCalibri 
   t[1086] = 45;
 });
 exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri;
 
 /***/ }),
 /* 36 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
-var getLookupTableFactory = __w_pdfjs_require__(9).getLookupTableFactory;
+var getLookupTableFactory = __w_pdfjs_require__(10).getLookupTableFactory;
 var getSpecialPUASymbols = getLookupTableFactory(function (t) {
  t[63721] = 0x00A9;
  t[63193] = 0x00A9;
  t[63720] = 0x00AE;
  t[63194] = 0x00AE;
  t[63722] = 0x2122;
  t[63195] = 0x2122;
  t[63729] = 0x23A7;
@@ -37971,19 +37982,19 @@ Object.defineProperty(exports, "__esModu
 });
 exports.getTilingPatternIR = getTilingPatternIR;
 exports.Pattern = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
 var _colorspace = __w_pdfjs_require__(25);
 
-var _primitives = __w_pdfjs_require__(12);
-
-var _core_utils = __w_pdfjs_require__(9);
+var _primitives = __w_pdfjs_require__(7);
+
+var _core_utils = __w_pdfjs_require__(10);
 
 var ShadingType = {
   FUNCTION_BASED: 1,
   AXIAL: 2,
   RADIAL: 3,
   FREE_FORM_MESH: 4,
   LATTICE_FORM_MESH: 5,
   COONS_PATCH_MESH: 6,
@@ -39194,17 +39205,17 @@ function bidi(str, startLevel, vertical)
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getMetrics = void 0;
 
-var _core_utils = __w_pdfjs_require__(9);
+var _core_utils = __w_pdfjs_require__(10);
 
 var getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) {
   t['Courier'] = 600;
   t['Courier-Bold'] = 600;
   t['Courier-BoldOblique'] = 600;
   t['Courier-Oblique'] = 600;
   t['Helvetica'] = (0, _core_utils.getLookupTableFactory)(function (t) {
     t['space'] = 278;
@@ -42151,17 +42162,17 @@ exports.getMetrics = getMetrics;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.isPDFFunction = isPDFFunction;
 exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunctionFactory = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _ps_parser = __w_pdfjs_require__(43);
 
 let IsEvalSupportedCached = {
   get value() {
     return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
   }
 
@@ -43508,17 +43519,17 @@ exports.PostScriptCompiler = PostScriptC
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.PostScriptParser = exports.PostScriptLexer = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 class PostScriptParser {
   constructor(lexer) {
     this.lexer = lexer;
     this.operators = [];
     this.token = null;
     this.prev = null;
   }
@@ -43965,17 +43976,17 @@ exports.NativeImageDecoder = NativeImage
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.PDFImage = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(12);
+var _primitives = __w_pdfjs_require__(7);
 
 var _colorspace = __w_pdfjs_require__(25);
 
 var _stream = __w_pdfjs_require__(14);
 
 var _jpeg_stream = __w_pdfjs_require__(20);
 
 var _jpx = __w_pdfjs_require__(23);
--- a/browser/extensions/pdfjs/moz.yaml
+++ b/browser/extensions/pdfjs/moz.yaml
@@ -15,15 +15,15 @@ origin:
   description: Portable Document Format (PDF) viewer that is built with HTML5
 
   # Full URL for the package's homepage/etc
   # Usually different from repository url
   url: https://github.com/mozilla/pdf.js
 
   # Human-readable identifier for this version/release
   # Generally "version NNN", "tag SSS", "bookmark SSS"
-  release: version 2.2.189
+  release: version 2.2.199
 
   # The package's license, where possible using the mnemonic from
   # https://spdx.org/licenses/
   # Multiple licenses can be specified (as a YAML list)
   # A "LICENSE" file must exist containing the full license text
   license: Apache-2.0
--- a/gfx/gl/GLContextProviderGLX.cpp
+++ b/gfx/gl/GLContextProviderGLX.cpp
@@ -75,17 +75,17 @@ bool GLXLibrary::EnsureInitialized() {
 
   if (!mOGLLibrary) {
     // see e.g. bug 608526: it is intrinsically interesting to know whether we
     // have dynamically linked to libGL.so.1 because at least the NVIDIA
     // implementation requires an executable stack, which causes mprotect calls,
     // which trigger glibc bug
     // http://sourceware.org/bugzilla/show_bug.cgi?id=12225
     const char* libGLfilename = "libGL.so.1";
-#ifdef __OpenBSD__
+#if defined(__OpenBSD__) || defined(__NetBSD__)
     libGLfilename = "libGL.so";
 #endif
 
     const bool forceFeatureReport = false;
     ScopedGfxFeatureReporter reporter(libGLfilename, forceFeatureReport);
     mOGLLibrary = PR_LoadLibrary(libGLfilename);
     if (!mOGLLibrary) {
       NS_WARNING("Couldn't load OpenGL shared library.");
--- a/gfx/src/gfxTelemetry.cpp
+++ b/gfx/src/gfxTelemetry.cpp
@@ -39,16 +39,22 @@ const char* FeatureStatusToString(Featur
     case FeatureStatus::BlockedScreenTooLarge:
       return "blocked-screen-too-large";
     case FeatureStatus::BlockedScreenUnknown:
       return "blocked-screen-unknown";
     case FeatureStatus::BlockedNoGfxInfo:
       return "blocked-no-gfx-info";
     case FeatureStatus::BlockedOverride:
       return "blocked-override";
+    case FeatureStatus::BlockedReleaseChannelIntel:
+      return "blocked-release-channel-intel";
+    case FeatureStatus::BlockedReleaseChannelAMD:
+      return "blocked-release-channel-amd";
+    case FeatureStatus::BlockedReleaseChannelBattery:
+      return "blocked-release-channel-battery";
     case FeatureStatus::Blacklisted:
       return "blacklisted";
     case FeatureStatus::OptIn:
       return "opt-in";
     case FeatureStatus::Failed:
       return "failed";
     case FeatureStatus::Disabled:
       return "disabled";
--- a/gfx/src/gfxTelemetry.h
+++ b/gfx/src/gfxTelemetry.h
@@ -35,16 +35,19 @@ enum class FeatureStatus {
   BlockedDeviceUnknown,
   BlockedDeviceTooOld,
   BlockedVendorUnsupported,
   BlockedHasBattery,
   BlockedScreenTooLarge,
   BlockedScreenUnknown,
   BlockedNoGfxInfo,
   BlockedOverride,
+  BlockedReleaseChannelIntel,
+  BlockedReleaseChannelAMD,
+  BlockedReleaseChannelBattery,
 
   // This feature has been blocked by the graphics blacklist.
   Blacklisted,
 
   // This feature is disabled by default, and so activation isn't attempted
   // unless something explicitly enables it.
   OptIn,
 
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -2612,65 +2612,50 @@ static FeatureState& WebRenderHardwareQu
       gfxInfo->GetAdapterDeviceID(adapterDeviceID);
       nsresult valid;
       int32_t deviceID = adapterDeviceID.ToInteger(&valid, 16);
       if (valid != NS_OK) {
         featureWebRenderQualified.Disable(
             FeatureStatus::BlockedDeviceUnknown, "Bad device id",
             NS_LITERAL_CSTRING("FEATURE_FAILURE_BAD_DEVICE_ID"));
       } else {
-#ifdef NIGHTLY_BUILD
-        // For AMD/Intel devices, if we have a battery, ignore it if the screen
-        // is small enough. Note that we always check for a battery with NVIDIA
-        // because we do not have a limited/curated set of devices to support
-        // WebRender on.
-        const int32_t kMaxPixelsBattery = 1920 * 1200;  // WUXGA
         const int32_t screenPixels = aScreenSize.width * aScreenSize.height;
-        bool disableForBattery = aHasBattery;
-        if ((adapterVendorID == u"0x8086" || adapterVendorID == u"0x1002") &&
-            screenPixels > 0 && screenPixels <= kMaxPixelsBattery) {
-          disableForBattery = false;
-        }
-#else
-        bool disableForBattery = aHasBattery;
-#endif
-
-        if (disableForBattery) {
-          featureWebRenderQualified.Disable(
-              FeatureStatus::BlockedHasBattery, "Has battery",
-              NS_LITERAL_CSTRING("FEATURE_FAILURE_WR_HAS_BATTERY"));
-        } else if (adapterVendorID == u"0x10de") {
+
+        if (adapterVendorID == u"0x10de") {
           if (deviceID < 0x6c0) {
             // 0x6c0 is the lowest Fermi device id. Unfortunately some Tesla
             // devices that don't support D3D 10.1 have higher deviceIDs. They
             // will be included, but blocked by ANGLE.
             featureWebRenderQualified.Disable(
                 FeatureStatus::BlockedDeviceTooOld, "Device too old",
                 NS_LITERAL_CSTRING("FEATURE_FAILURE_DEVICE_TOO_OLD"));
           }
-#ifdef EARLY_BETA_OR_EARLIER
         } else if (adapterVendorID == u"0x1002") {  // AMD
           // AMD deviceIDs are not very well ordered. This
           // condition is based off the information in gpu-db
           if ((deviceID >= 0x6600 && deviceID < 0x66b0) ||
               (deviceID >= 0x6700 && deviceID < 0x6720) ||
               (deviceID >= 0x6780 && deviceID < 0x6840) ||
               (deviceID >= 0x6860 && deviceID < 0x6880) ||
               (deviceID >= 0x6900 && deviceID < 0x6a00) ||
               (deviceID == 0x7300) ||
               (deviceID >= 0x9830 && deviceID < 0x9870) ||
               (deviceID >= 0x9900 && deviceID < 0x9a00)) {
             // we have a desktop CAYMAN, SI, CIK, VI, or GFX9 device
+#ifndef EARLY_BETA_OR_EARLIER
+            featureWebRenderQualified.Disable(
+                FeatureStatus::BlockedReleaseChannelAMD,
+                "Release channel and AMD",
+                NS_LITERAL_CSTRING("FEATURE_FAILURE_RELEASE_CHANNEL_AMD"));
+#endif  // !EARLY_BETA_OR_EARLIER
           } else {
             featureWebRenderQualified.Disable(
                 FeatureStatus::BlockedDeviceTooOld, "Device too old",
                 NS_LITERAL_CSTRING("FEATURE_FAILURE_DEVICE_TOO_OLD"));
           }
-#endif
-#ifdef NIGHTLY_BUILD
         } else if (adapterVendorID == u"0x8086") {  // Intel
           const uint16_t supportedDevices[] = {
               // skylake gt2+
               0x1912,
               0x1913,
               0x1915,
               0x1916,
               0x1917,
@@ -2752,43 +2737,73 @@ static FeatureState& WebRenderHardwareQu
           };
           bool supported = false;
           for (uint16_t id : supportedDevices) {
             if (deviceID == id) {
               supported = true;
               break;
             }
           }
-          if (!supported) {
-            featureWebRenderQualified.Disable(
-                FeatureStatus::BlockedDeviceTooOld, "Device too old",
-                NS_LITERAL_CSTRING("FEATURE_FAILURE_DEVICE_TOO_OLD"));
-          }
-#  ifdef MOZ_WIDGET_GTK
-          else {
+          if (supported) {
+#ifdef MOZ_WIDGET_GTK
             // Performance is not great on 4k screens with WebRender + Linux.
             // Disable it for now if it is too large.
             const int32_t kMaxPixelsLinux = 3440 * 1440;  // UWQHD
             if (screenPixels > kMaxPixelsLinux) {
               featureWebRenderQualified.Disable(
                   FeatureStatus::BlockedScreenTooLarge, "Screen size too large",
                   NS_LITERAL_CSTRING("FEATURE_FAILURE_SCREEN_SIZE_TOO_LARGE"));
             } else if (screenPixels <= 0) {
               featureWebRenderQualified.Disable(
                   FeatureStatus::BlockedScreenUnknown, "Screen size unknown",
                   NS_LITERAL_CSTRING("FEATURE_FAILURE_SCREEN_SIZE_UNKNOWN"));
+            } else {
+#endif  // MOZ_WIDGET_GTK
+#ifndef NIGHTLY_BUILD
+              featureWebRenderQualified.Disable(
+                  FeatureStatus::BlockedReleaseChannelIntel,
+                  "Release channel and Intel",
+                  NS_LITERAL_CSTRING("FEATURE_FAILURE_RELEASE_CHANNEL_INTEL"));
+#endif  // !NIGHTLY_BUILD
+#ifdef MOZ_WIDGET_GTK
             }
+#endif  // MOZ_WIDGET_GTK
+          } else {
+            featureWebRenderQualified.Disable(
+                FeatureStatus::BlockedDeviceTooOld, "Device too old",
+                NS_LITERAL_CSTRING("FEATURE_FAILURE_DEVICE_TOO_OLD"));
           }
-#  endif  // MOZ_WIDGET_GTK
-#endif    // NIGHTLY_BUILD
         } else {
           featureWebRenderQualified.Disable(
               FeatureStatus::BlockedVendorUnsupported, "Unsupported vendor",
               NS_LITERAL_CSTRING("FEATURE_FAILURE_UNSUPPORTED_VENDOR"));
         }
+
+        // We leave checking the battery for last because we would like to know
+        // which users were denied WebRender only because they have a battery.
+        if (featureWebRenderQualified.IsEnabled() && aHasBattery) {
+          // For AMD/Intel devices, if we have a battery, ignore it if the
+          // screen is small enough. Note that we always check for a battery
+          // with NVIDIA because we do not have a limited/curated set of devices
+          // to support WebRender on.
+          const int32_t kMaxPixelsBattery = 1920 * 1200;  // WUXGA
+          if ((adapterVendorID == u"0x8086" || adapterVendorID == u"0x1002") &&
+              screenPixels > 0 && screenPixels <= kMaxPixelsBattery) {
+#ifndef NIGHTLY_BUILD
+            featureWebRenderQualified.Disable(
+                FeatureStatus::BlockedReleaseChannelBattery,
+                "Release channel and battery",
+                NS_LITERAL_CSTRING("FEATURE_FAILURE_RELEASE_CHANNEL_BATTERY"));
+#endif  // !NIGHTLY_BUILD
+          } else {
+            featureWebRenderQualified.Disable(
+                FeatureStatus::BlockedHasBattery, "Has battery",
+                NS_LITERAL_CSTRING("FEATURE_FAILURE_WR_HAS_BATTERY"));
+          }
+        }
       }
     }
   } else {
     featureWebRenderQualified.Disable(
         FeatureStatus::BlockedNoGfxInfo, "gfxInfo is broken",
         NS_LITERAL_CSTRING("FEATURE_FAILURE_WR_NO_GFX_INFO"));
   }
   return featureWebRenderQualified;
--- a/layout/generic/nsBlockFrame.cpp
+++ b/layout/generic/nsBlockFrame.cpp
@@ -771,16 +771,19 @@ nscoord nsBlockFrame::GetMinISize(gfxCon
           data.mCurrentLine += StyleText()->mTextIndent.Resolve(0);
         }
         data.mLine = &line;
         data.SetLineContainer(curFrame);
         nsIFrame* kid = line->mFirstChild;
         for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
              ++i, kid = kid->GetNextSibling()) {
           kid->AddInlineMinISize(aRenderingContext, &data);
+          if (data.mTrailingWhitespace) {
+            data.OptionallyBreak();
+          }
         }
       }
 #ifdef DEBUG
       if (gNoisyIntrinsic) {
         IndentBy(stdout, gNoiseIndent);
         printf("min: [prevLines=%d currentLine=%d]\n", data.mPrevLines,
                data.mCurrentLine);
       }
--- a/layout/generic/nsContainerFrame.cpp
+++ b/layout/generic/nsContainerFrame.cpp
@@ -717,17 +717,17 @@ void nsContainerFrame::DoInlineIntrinsic
   // This frame is a first-in-flow, but it might have a previous bidi
   // continuation, in which case that continuation should handle the startSide
   // border.
   // For box-decoration-break:clone we setup clonePBM = startPBM + endPBM and
   // add that to each line.  For box-decoration-break:slice clonePBM is zero.
   nscoord clonePBM = 0;  // PBM = PaddingBorderMargin
   const bool sliceBreak =
       styleBorder->mBoxDecorationBreak == StyleBoxDecorationBreak::Slice;
-  if (!GetPrevContinuation()) {
+  if (!GetPrevContinuation() || MOZ_UNLIKELY(!sliceBreak)) {
     nscoord startPBM =
         // clamp negative calc() to 0
         std::max(GetCoord(stylePadding->mPadding.Get(startSide), 0), 0) +
         styleBorder->GetComputedBorderWidth(startSide) +
         GetCoord(styleMargin->mMargin.Get(startSide), 0);
     if (MOZ_LIKELY(sliceBreak)) {
       aData->mCurrentLine += startPBM;
     } else {
@@ -737,16 +737,17 @@ void nsContainerFrame::DoInlineIntrinsic
 
   nscoord endPBM =
       // clamp negative calc() to 0
       std::max(GetCoord(stylePadding->mPadding.Get(endSide), 0), 0) +
       styleBorder->GetComputedBorderWidth(endSide) +
       GetCoord(styleMargin->mMargin.Get(endSide), 0);
   if (MOZ_UNLIKELY(!sliceBreak)) {
     clonePBM += endPBM;
+    aData->mCurrentLine += clonePBM;
   }
 
   const nsLineList_iterator* savedLine = aData->mLine;
   nsIFrame* const savedLineContainer = aData->LineContainer();
 
   nsContainerFrame* lastInFlow;
   for (nsContainerFrame* nif = this; nif;
        nif = static_cast<nsContainerFrame*>(nif->GetNextInFlow())) {
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bidi/clone-intrinsic-size-bidi-ref.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Reference: min/max-content size on box-decoration-break:clone inline box with bidi text</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+  white-space: pre;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+  -webkit-box-decoration-break: clone;
+  box-decoration-break: clone;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div><span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><span> d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span> aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc </span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span> d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa</div>
+</f>
+
+<f class="min">
+<div><span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- FIXME -->
+<div style="white-space: normal;"><span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- FIXME -->
+<div style="white-space: normal;"><span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>bc</span><span></span><span>a</span><br><span>d&#x202e;e&#x202d;f</span></div>
+<div><span>&#x202e;a&#x202d;bc</span><br>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><br>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span></span><br><span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- FIXME -->
+<div style="white-space: normal;"><span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- FIXME -->
+<div style="white-space: normal;"><span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa</div>
+</f>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bidi/clone-intrinsic-size-bidi.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Test: min/max-content size on box-decoration-break:clone inline box with bidi text</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content">
+  <link rel="help" href="https://drafts.csswg.org/css-break-3/#break-decoration">
+  <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1552357">
+  <link rel="match" href="clone-intrinsic-size-bidi-ref.html">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+  -webkit-box-decoration-break: clone;
+  box-decoration-break: clone;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc </span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa </div>
+</f>
+
+<f class="min">
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- Bug 1556444 -->
+<div>
+  <span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- Bug 1556444 -->
+<div>
+  <span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc </span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span> d&#x202e;e&#x202d;f</span>
+</div>
+<!-- Bug 1556444 -->
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- Bug 1556444 -->
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa </div>
+</f>
--- a/layout/reftests/bidi/reftest.list
+++ b/layout/reftests/bidi/reftest.list
@@ -170,8 +170,10 @@ random-if(/^Windows\x20NT\x206\.1/.test(
 random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3a-rtl.html brackets-3a-rtl-ref.html # Bug 1392106
 random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3b-ltr.html brackets-3b-ltr-ref.html # Bug 1392106
 fuzzy-if(Android,207-207,32-32) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3b-rtl.html brackets-3b-rtl-ref.html # Bug 1392106
 == 1217833-1.html 1217833-1-ref.html
 == 1217833-2.html 1217833-2-ref.html
 == 1231175-1.html 1231175-1-ref.html
 == 1366623-1.html 1366623-1-ref.html
 random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1426042-1.html 1426042-1-ref.html # Bug 1392106
+== clone-intrinsic-size-bidi.html clone-intrinsic-size-bidi-ref.html
+== slice-intrinsic-size-bidi.html slice-intrinsic-size-bidi-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bidi/slice-intrinsic-size-bidi-ref.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Reference: min/max-content size on box-decoration-break:slice inline box with bidi text</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+  white-space: pre;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+}
+
+f { margin-right: 30px; float: left; }
+.l { margin-right:0; border-right-width:0; padding-right:0 }
+.r { margin-left:0; border-left-width:0; padding-left:0 }
+</style>
+<body>
+<f class="max">
+<div><span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><span> d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span> aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc </span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span> d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa</div>
+</f>
+
+<f class="min">
+<div><span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><br><span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- FIXME -->
+<div style="white-space:normal;"><span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span class="l">bc</span><span>&#x202e;a&#x202d;</span><br><span class="r">d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><br>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><br>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span class="l">bc</span>aa<span>&#x202e;a&#x202d;</span><br><span class="r">d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span><br>aa<br><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa<br><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div><span>&#x202e;a&#x202d;bc</span>aa</div>
+</f>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bidi/slice-intrinsic-size-bidi.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Test: min/max-content size on box-decoration-break:slice inline box with bidi text</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content">
+  <link rel="help" href="https://drafts.csswg.org/css-break-3/#break-decoration">
+  <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1552357">
+  <link rel="match" href="slice-intrinsic-size-bidi-ref.html">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc </span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa </div>
+</f>
+
+<f class="min">
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> <span>d&#x202e;e&#x202d;f</span>
+</div>
+<!-- Bug 1556444 -->
+<div>
+  <span>&#x202e;a&#x202d;bc </span><span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span><span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc </span>aa<span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa<span> d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span> aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa <span>d&#x202e;e&#x202d;f</span>
+</div>
+<div>
+  <span>&#x202e;a&#x202d;bc</span>aa </div>
+</f>
--- a/taskcluster/ci/build/android.yml
+++ b/taskcluster/ci/build/android.yml
@@ -1,1266 +1,534 @@
 # 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/.
 ---
 job-defaults:
-    run:
-        mozconfig-variant: null
-
-android-api-16/debug:
-    description: "Android 4.0 api-16+ Debug"
-    index:
-        product: mobile
-        job-name: android-api-16-debug
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-4-0-armv7-api16/debug
-        symbol: B
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: api-16-debug
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-x86/opt:
-    description: "Android 4.2 x86 Opt"
     index:
         product: mobile
-        job-name: android-x86-opt
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-4-2-x86/opt
-        symbol: B
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: x86
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-x86-fuzzing/debug:
-    description: "Android x86 Fuzzing Debug"
-    index:
-        product: mobile
-        job-name: android-x86-fuzzing-debug
-    treeherder:
-        platform: android-4-2-x86/debug
-        symbol: Bf
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: x86-fuzzing-debug
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-x86-nightly/opt:
-    description: "Android 4.2 x86 Nightly"
-    attributes:
-        nightly: true
-        enable-full-crashsymbols: true
-    shipping-phase: build
-    shipping-product: fennec
-    index:
-        product: mobile
-        job-name: android-x86-opt
-        type: android-nightly
-    treeherder:
-        platform: android-4-2-x86/opt
-        symbol: N
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build, multi-l10n]
-        config:
-            - builds/releng_base_android_64_builds.py
-            - taskcluster_nightly.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: x86
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-nasm
-        - linux64-node
-
-android-api-16/opt:
-    description: "Android 4.0 api-16+ Opt"
-    index:
-        product: mobile
-        job-name: android-api-16-opt
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-4-0-armv7-api16/opt
-        symbol: B
-    worker-type: b-linux
     worker:
         docker-image: {in-tree: android-build}
         max-run-time: 7200
         env:
             GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
         artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: api-16
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-api-16/pgo:
-    description: "Android 4.0 api-16+ PGO"
-    use-pgo: true
-    index:
-        product: mobile
-        job-name: android-api-16-pgo
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-4-0-armv7-api16/pgo
-        symbol: Bpgo(B)
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: api-16
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-nasm
-        - linux64-node
-
-android-api-16-without-google-play-services/opt:
-    description: "Android 4.0 api-16+ (without Google Play Services) Opt"
-    index:
-        product: mobile
-        job-name: android-api-16-without-google-play-services-opt
-    treeherder:
-        platform: android-4-0-armv7-api16/opt
-        symbol: BnoGPS
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            PERFHERDER_EXTRA_OPTIONS: android-api-16-without-google-play-services
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/geckoview_example-withGeckoBinaries.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: api-16-without-google-play-services
-        tooltool-downloads: internal
-    run-on-projects: ['mozilla-central']
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-api-16-nightly/opt:
-    description: "Android 4.0 api-16+ Nightly"
-    use-pgo: android-api-16/pgo
-    attributes:
-        nightly: true
-        enable-full-crashsymbols: true
-    shipping-phase: build
-    shipping-product: fennec
-    index:
-        product: mobile
-        job-name: android-api-16-opt
-        type: android-nightly-with-multi-l10n
-    treeherder:
-        platform: android-4-0-armv7-api16/opt
-        symbol: N
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build, multi-l10n]
-        config:
-            - builds/releng_base_android_64_builds.py
-            - taskcluster_nightly.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: api-16
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-nasm
-        - linux64-node
-
-android-aarch64/opt:
-    description: "Android 5.0 AArch64 Opt"
-    index:
-        product: mobile
-        job-name: android-aarch64-opt
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-5-0-aarch64/opt
-        symbol: B
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: aarch64
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-aarch64/pgo:
-    description: "Android 5.0 AArch64 PGO"
-    use-pgo: android-api-16/pgo
-    index:
-        product: mobile
-        job-name: android-aarch64-pgo
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-5-0-aarch64/pgo
-        symbol: Bpgo(B)
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: aarch64
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-nasm
-        - linux64-node
-
-android-aarch64/debug:
-    description: "Android 5.0 AArch64 Debug"
-    index:
-        product: mobile
-        job-name: android-aarch64-debug
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-5-0-aarch64/debug
-        symbol: B
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
             - name: public/build/target.maven.zip
               path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
               type: file
             - name: public/build/geckoview-androidTest.apk
               path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
               type: file
             - name: public/build/geckoview_example.apk
               path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
               type: file
             - name: public/build
               path: /builds/worker/artifacts/
               type: directory
     run:
         using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: aarch64-debug
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-aarch64-nightly/opt:
-    description: "Android 5.0 AArch64 Nightly"
-    use-pgo: android-api-16/pgo
-    attributes:
-        nightly: true
-        enable-full-crashsymbols: true
-    shipping-phase: build
-    shipping-product: fennec
-    index:
-        product: mobile
-        job-name: android-aarch64-opt
-        type: android-nightly
-    treeherder:
-        platform: android-5-0-aarch64/opt
-        symbol: N
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build, multi-l10n]
-        config:
-            - builds/releng_base_android_64_builds.py
-            - taskcluster_nightly.py
         script: "mozharness/scripts/fx_desktop_build.py"
         secrets: true
-        custom-build-variant-cfg: aarch64
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-nasm
-        - linux64-node
-
-android-x86_64/opt:
-    description: "Android 5.0 x86-64 Opt"
-    index:
-        product: mobile
-        job-name: android-x86_64-opt
-    attributes:
-        enable-full-crashsymbols: true
-    treeherder:
-        platform: android-5-0-x86_64/opt
-        symbol: B
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: x86_64
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-nasm
-        - linux64-node
-
-android-x86_64-nightly/opt:
-    description: "Android 5.0 x86-64 Nightly"
-    attributes:
-        nightly: true
-        enable-full-crashsymbols: true
-    shipping-phase: build
-    shipping-product: fennec
-    index:
-        product: mobile
-        job-name: android-x86_64-opt
-        type: android-nightly
-    treeherder:
-        platform: android-5-0-x86_64/opt
-        symbol: N
-    worker-type: b-linux
-    worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
-        env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
-            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
-    run:
-        using: mozharness
-        actions: [get-secrets, build, multi-l10n]
-        config:
-            - builds/releng_base_android_64_builds.py
-            - taskcluster_nightly.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: x86_64
+        mozconfig-variant: null
         tooltool-downloads: internal
     toolchains:
         - android-gradle-dependencies
         - android-ndk-linux
         - android-sdk-linux
         - linux64-clang
         - linux64-rust-android
         - linux64-rust-size
         - linux64-cbindgen
         - linux64-nasm
         - linux64-node
 
+android-api-16/debug:
+    description: "Android 4.0 api-16+ Debug"
+    index:
+        job-name: android-api-16-debug
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-4-0-armv7-api16/debug
+        symbol: B
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: api-16-debug
+    toolchains:
+        - linux64-sccache
+
+android-x86/opt:
+    description: "Android 4.2 x86 Opt"
+    index:
+        job-name: android-x86-opt
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-4-2-x86/opt
+        symbol: B
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: x86
+    toolchains:
+        - linux64-sccache
+
+android-x86-fuzzing/debug:
+    description: "Android x86 Fuzzing Debug"
+    index:
+        job-name: android-x86-fuzzing-debug
+    treeherder:
+        platform: android-4-2-x86/debug
+        symbol: Bf
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: x86-fuzzing-debug
+    toolchains:
+        - linux64-sccache
+
+android-x86-nightly/opt:
+    description: "Android 4.2 x86 Nightly"
+    attributes:
+        enable-full-crashsymbols: true
+        nightly: true
+    shipping-phase: build
+    shipping-product: fennec
+    index:
+        job-name: android-x86-opt
+        type: android-nightly
+    treeherder:
+        platform: android-4-2-x86/opt
+        symbol: N
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
+    run:
+        actions: [get-secrets, build, multi-l10n]
+        config:
+            - builds/releng_base_android_64_builds.py
+            - taskcluster_nightly.py
+        custom-build-variant-cfg: x86
+
+android-api-16/opt:
+    description: "Android 4.0 api-16+ Opt"
+    index:
+        job-name: android-api-16-opt
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-4-0-armv7-api16/opt
+        symbol: B
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: api-16
+    toolchains:
+        - linux64-sccache
+
+android-api-16/pgo:
+    description: "Android 4.0 api-16+ PGO"
+    use-pgo: true
+    index:
+        job-name: android-api-16-pgo
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-4-0-armv7-api16/pgo
+        symbol: Bpgo(B)
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: api-16
+
+android-api-16-without-google-play-services/opt:
+    description: "Android 4.0 api-16+ (without Google Play Services) Opt"
+    index:
+        job-name: android-api-16-without-google-play-services-opt
+    treeherder:
+        platform: android-4-0-armv7-api16/opt
+        symbol: BnoGPS
+    worker-type: b-linux
+    worker:
+        env:
+            PERFHERDER_EXTRA_OPTIONS: android-api-16-without-google-play-services
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: api-16-without-google-play-services
+    run-on-projects: ['mozilla-central']
+    toolchains:
+        - linux64-sccache
+
+android-api-16-nightly/opt:
+    description: "Android 4.0 api-16+ Nightly"
+    use-pgo: android-api-16/pgo
+    attributes:
+        enable-full-crashsymbols: true
+        nightly: true
+    shipping-phase: build
+    shipping-product: fennec
+    index:
+        job-name: android-api-16-opt
+        type: android-nightly-with-multi-l10n
+    treeherder:
+        platform: android-4-0-armv7-api16/opt
+        symbol: N
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build, multi-l10n]
+        config:
+            - builds/releng_base_android_64_builds.py
+            - taskcluster_nightly.py
+        custom-build-variant-cfg: api-16
+
+android-aarch64/opt:
+    description: "Android 5.0 AArch64 Opt"
+    index:
+        job-name: android-aarch64-opt
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-5-0-aarch64/opt
+        symbol: B
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: aarch64
+    toolchains:
+        - linux64-sccache
+
+android-aarch64/pgo:
+    description: "Android 5.0 AArch64 PGO"
+    use-pgo: android-api-16/pgo
+    index:
+        job-name: android-aarch64-pgo
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-5-0-aarch64/pgo
+        symbol: Bpgo(B)
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: aarch64
+
+android-aarch64/debug:
+    description: "Android 5.0 AArch64 Debug"
+    index:
+        job-name: android-aarch64-debug
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-5-0-aarch64/debug
+        symbol: B
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: aarch64-debug
+    toolchains:
+        - linux64-sccache
+
+android-aarch64-nightly/opt:
+    description: "Android 5.0 AArch64 Nightly"
+    use-pgo: android-api-16/pgo
+    attributes:
+        enable-full-crashsymbols: true
+        nightly: true
+    shipping-phase: build
+    shipping-product: fennec
+    index:
+        job-name: android-aarch64-opt
+        type: android-nightly
+    treeherder:
+        platform: android-5-0-aarch64/opt
+        symbol: N
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
+    run:
+        actions: [get-secrets, build, multi-l10n]
+        config:
+            - builds/releng_base_android_64_builds.py
+            - taskcluster_nightly.py
+        custom-build-variant-cfg: aarch64
+
+android-x86_64/opt:
+    description: "Android 5.0 x86-64 Opt"
+    index:
+        job-name: android-x86_64-opt
+    attributes:
+        enable-full-crashsymbols: true
+    treeherder:
+        platform: android-5-0-x86_64/opt
+        symbol: B
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
+    run:
+        actions: [get-secrets, build]
+        config: ["builds/releng_base_android_64_builds.py"]
+        custom-build-variant-cfg: x86_64
+    toolchains:
+        - linux64-sccache
+
+android-x86_64-nightly/opt:
+    description: "Android 5.0 x86-64 Nightly"
+    attributes:
+        enable-full-crashsymbols: true
+        nightly: true
+    shipping-phase: build
+    shipping-product: fennec
+    index:
+        job-name: android-x86_64-opt
+        type: android-nightly
+    treeherder:
+        platform: android-5-0-x86_64/opt
+        symbol: N
+    worker-type: b-linux
+    worker:
+        env:
+            TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
+    run:
+        actions: [get-secrets, build, multi-l10n]
+        config:
+            - builds/releng_base_android_64_builds.py
+            - taskcluster_nightly.py
+        custom-build-variant-cfg: x86_64
+
 android-x86_64/debug:
     description: "Android 5.0 x86-64 Debug"
     index:
-        product: mobile
         job-name: android-x86_64-debug
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-5-0-x86_64/debug
         symbol: B
     worker-type: b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: x86_64-debug
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
+
 
 android-api-16-gcp/debug:
     description: "Android 4.0 api-16+ Debug - built on GCP"
     index:
-        product: mobile
         job-name: android-api-16-gcp-debug
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-4-0-armv7-api16/debug
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: api-16-debug
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
+
 
 android-x86-gcp/opt:
     description: "Android 4.2 x86 Opt - built on GCP"
     index:
-        product: mobile
         job-name: android-x86-gcp-opt
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-4-2-x86/opt
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: x86
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-api-16-gcp/opt:
     description: "Android 4.0 api-16+ Opt - built on GCP"
     index:
-        product: mobile
         job-name: android-api-16-gcp-opt
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-4-0-armv7-api16/opt
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: api-16
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-aarch64-gcp/opt:
     description: "Android 5.0 AArch64 Opt - built on GCP"
     index:
-        product: mobile
         job-name: android-aarch64-gcp-opt
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-5-0-aarch64/opt
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: aarch64
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-aarch64-gcp/debug:
     description: "Android 5.0 AArch64 Debug - built on GCP"
     index:
-        product: mobile
         job-name: android-aarch64-gcp-debug
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-5-0-aarch64/debug
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: aarch64-debug
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-x86_64-gcp/opt:
     description: "Android 5.0 x86-64 Opt - built on GCP"
     index:
-        product: mobile
         job-name: android-x86_64-gcp-opt
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-5-0-x86_64/opt
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: x86_64
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-x86_64-gcp/debug:
     description: "Android 5.0 x86-64 Debug - built on GCP"
     index:
-        product: mobile
         job-name: android-x86_64-gcp-debug
     attributes:
         enable-full-crashsymbols: true
     treeherder:
         platform: android-5-0-x86_64/debug
         symbol: Bg
         tier: 3
     worker-type: gce/gecko-{level}-b-linux
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
-            GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-offline"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android-x86/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: gcp
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: x86_64-debug
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-geckoview-fat-aar/opt:
     description: "Android GeckoView multi-architecture fat AAR Opt"
     index:
-        product: mobile
         job-name: android-geckoview-fat-aar-opt
     treeherder:
         platform: android-4-0-geckoview-fat-aar/opt
         symbol: Bgv
     worker-type: b-linux
     dependencies:
         android-x86-opt: build-android-x86/opt
         android-x86_64-opt: build-android-x86_64/opt
         android-api-16-opt: build-android-api-16/opt
         android-aarch64-opt: build-android-aarch64/opt
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
             # Online in order to download the per-architecture AARs.
             GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-online"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: android-geckoview-fat-aar-opt
             MOZ_ANDROID_FAT_AAR_ARCHITECTURES: 'armeabi-v7a,arm64-v8a,x86,x86_64'
             USE_ARTIFACT: '1'
             MOZ_ARTIFACT_TASK: {task-reference: '<android-api-16-opt>'}
@@ -1271,110 +539,53 @@ android-geckoview-fat-aar/opt:
         artifacts:
             - name: public/android/maven
               # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
               path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
               type: directory
             - name: public/build/target.maven.zip
               path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
               type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build]
-        config:
-            - builds/releng_base_android_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
+        config: ["builds/releng_base_android_64_builds.py"]
         custom-build-variant-cfg: api-16
-        tooltool-downloads: internal
     toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
         - linux64-sccache
-        - linux64-nasm
-        - linux64-node
 
 android-geckoview-fat-aar-nightly/opt:
     description: "Android GeckoView multi-architecture fat AAR Nightly"
     attributes:
         nightly: true
         enable-full-crashsymbols: true
         disable-push-apk: true
         disable-build-signing: true
     shipping-phase: build
     shipping-product: fennec
     index:
-        product: mobile
         job-name: android-geckoview-fat-aar-nightly
         type: nightly-with-multi-l10n
     treeherder:
         platform: android-4-0-geckoview-fat-aar/opt
         symbol: Ngv
     worker-type: b-linux
     dependencies:
         android-x86-opt: build-android-x86-nightly/opt
         android-x86_64-opt: build-android-x86_64-nightly/opt
         android-api-16-opt: build-android-api-16-nightly/opt
         android-aarch64-opt: build-android-aarch64-nightly/opt
     worker:
-        docker-image: {in-tree: android-build}
-        max-run-time: 7200
         env:
             # Online in order to download the per-architecture AARs.
             GRADLE_USER_HOME: "/builds/worker/workspace/build/src/mobile/android/gradle/dotgradle-online"
             TOOLTOOL_MANIFEST: "mobile/android/config/tooltool-manifests/android/releng.manifest"
             PERFHERDER_EXTRA_OPTIONS: android-geckoview-fat-aar-nightly
             MOZ_ANDROID_FAT_AAR_ARCHITECTURES: 'armeabi-v7a,arm64-v8a,x86,x86_64'
             MOZ_ARTIFACT_TASK_ANDROID_API_16_OPT: {task-reference: '<android-api-16-opt>'}
             MOZ_ARTIFACT_TASK_ANDROID_AARCH64_OPT: {task-reference: '<android-aarch64-opt>'}
             MOZ_ARTIFACT_TASK_ANDROID_X86_OPT: {task-reference: '<android-x86-opt>'}
             MOZ_ARTIFACT_TASK_ANDROID_X86_64_OPT: {task-reference: '<android-x86_64-opt>'}
-        artifacts:
-            - name: public/android/maven
-              # TODO Bug 1433198. Remove the following entry once target.maven.zip is uploaded to a maven repository
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/maven/
-              type: directory
-            - name: public/build/target.maven.zip
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/target.maven.zip
-              type: file
-            - name: public/build/geckoview-androidTest.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview/outputs/apk/androidTest/withGeckoBinaries/debug/geckoview-withGeckoBinaries-debug-androidTest.apk
-              type: file
-            - name: public/build/geckoview_example.apk
-              path: /builds/worker/workspace/build/src/obj-firefox/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/debug/geckoview_example-withGeckoBinaries-debug.apk
-              type: file
-            - name: public/build
-              path: /builds/worker/artifacts/
-              type: directory
     run:
-        using: mozharness
         actions: [get-secrets, build, multi-l10n]
         config:
             - builds/releng_base_android_64_builds.py
             - taskcluster_nightly.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
         custom-build-variant-cfg: api-16
-        tooltool-downloads: internal
-    toolchains:
-        - android-gradle-dependencies
-        - android-ndk-linux
-        - android-sdk-linux
-        - linux64-clang
-        - linux64-rust-android
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-nasm
-        - linux64-node
--- a/testing/mochitest/browser-test.js
+++ b/testing/mochitest/browser-test.js
@@ -525,19 +525,18 @@ Tester.prototype = {
 
   async waitForWindowsReady() {
     await this.setupDefaultTheme();
     await new Promise(resolve => this.waitForGraphicsTestWindowToBeGone(resolve));
     await this.promiseMainWindowReady();
   },
 
   async promiseMainWindowReady() {
-    if (window.gBrowserInit && !gBrowserInit.idleTasksFinished) {
-      await this.TestUtils.topicObserved("browser-idle-startup-tasks-finished",
-                                         subject => subject === window);
+    if (window.gBrowserInit) {
+      await window.gBrowserInit.idleTasksFinishedPromise;
     }
   },
 
   async setupDefaultTheme() {
     // Developer Edition enables the wrong theme by default. Make sure
     // the ordinary default theme is enabled.
     let theme = await AddonManager.getAddonByID("default-theme@mozilla.org");
     await theme.enable();
--- a/testing/mozbase/mozcrash/mozcrash/mozcrash.py
+++ b/testing/mozbase/mozcrash/mozcrash/mozcrash.py
@@ -134,21 +134,39 @@ def log_crashes(logger,
         logger.crash(process=process, test=test, **kwargs)
     return crash_count
 
 
 # Function signatures of abort functions which should be ignored when
 # determining the appropriate frame for the crash signature.
 ABORT_SIGNATURES = (
     "Abort(char const*)",
+    "GeckoCrash",
     "NS_DebugBreak",
+    # This signature is part of Rust panic stacks on some platforms. On
+    # others, it includes a template parameter containing "core::panic::" and
+    # is automatically filtered out by that pattern.
+    "core::ops::function::Fn::call",
+    "gkrust_shared::panic_hook",
+    "intentional_panic",
     "mozalloc_abort",
     "static void Abort(const char *)",
 )
 
+# Similar to above, but matches if the substring appears anywhere in the
+# frame's signature.
+ABORT_SUBSTRINGS = (
+    # On some platforms, Rust panic frames unfortunately appear without the
+    # std::panicking or core::panic namespaces.
+    "_panic_",
+    "core::panic::",
+    "core::result::unwrap_failed",
+    "std::panicking::",
+)
+
 
 class CrashInfo(object):
     """Get information about a crash based on dump files.
 
     Typical usage is to iterate over the CrashInfo object. This returns StackInfo
     objects, one for each crash dump file that is found in the dump_directory.
 
     :param dump_directory: Path to search for minidump files
@@ -291,17 +309,19 @@ class CrashInfo(object):
                             if not line.startswith(" "):
                                 break
 
                             match = re.search(r"^ \d  (?:.*!)?(?:void )?([^\[]+)", line)
                             if match:
                                 func = match.group(1).strip()
                                 signature = "@ %s" % func
 
-                                if func not in ABORT_SIGNATURES:
+                                if not (func in ABORT_SIGNATURES or
+                                        any(pat in func
+                                            for pat in ABORT_SUBSTRINGS)):
                                     break
                         break
             else:
                 include_stderr = True
 
         else:
             if not self.symbols_path:
                 errors.append("No symbols path given, can't process dump.")
--- a/testing/talos/talos/talos-powers/api.js
+++ b/testing/talos/talos/talos-powers/api.js
@@ -243,26 +243,18 @@ TalosPowersService.prototype = {
       }
     }
 
     // Check to see if the top-most browser window still needs to fire its
     // idle tasks notification. If so, we'll wait for it before shutting
     // down, since some caching that can influence future runs in this profile
     // keys off of that notification.
     let topWin = BrowserWindowTracker.getTopWindow();
-    if (topWin &&
-        topWin.gBrowserInit &&
-        !topWin.gBrowserInit.idleTasksFinished) {
-      await new Promise(resolve => {
-        let obs = (subject, topic, data) => {
-          Services.obs.removeObserver(obs, "browser-idle-startup-tasks-finished");
-          resolve();
-        };
-        Services.obs.addObserver(obs, "browser-idle-startup-tasks-finished");
-      });
+    if (topWin && topWin.gBrowserInit) {
+      await topWin.gBrowserInit.idleTasksFinishedPromise;
     }
 
     for (let domWindow of Services.wm.getEnumerator(null)) {
       domWindow.close();
     }
 
     try {
       Services.startup.quit(Services.startup.eForceQuit);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-sizing/clone-intrinsic-size-ref.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Reference: min/max-content size on box-decoration-break:clone inline box</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+  white-space: pre;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+  -webkit-box-decoration-break: clone;
+  box-decoration-break: clone;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div><span>aaa</span><span>aaa</span>
+</div>
+<div><span>aaa</span>aa<span>aaa</span>
+</div>
+<div><span>aaa</span> <span>aaa</span>
+</div>
+<div><span>aaa </span><span>aaa</span>
+</div>
+<div><span>aaa</span><span> aaa</span>
+</div>
+<div><span>aaa</span> aa<span>aaa</span>
+</div>
+<div><span>aaa </span>aa<span>aaa</span>
+</div>
+<div><span>aaa</span>aa<span> aaa</span>
+</div>
+<div><span>aaa</span> aa <span>aaa</span>
+</div>
+<div><span>aaa</span>aa <span>aaa</span>
+</div>
+<div><span>aaa</span>aa</div>
+</f>
+
+<f class="min">
+<div><span>aaa</span><span>aaa</span>
+</div>
+<div><span>aaa</span>aa<span>aaa</span>
+</div>
+<div><span>aaa</span><br><span>aaa</span>
+</div>
+<div><span>aaa</span><br><span>aaa</span>
+</div>
+<div><span>aaa</span><span><br>aaa</span>
+</div>
+<div><span>aaa</span><br>aa<span>aaa</span>
+</div>
+<div><span>aaa</span><br>aa<span>aaa</span>
+</div>
+<div><span>aaa</span>aa<span><br>aaa</span>
+</div>
+<div><span>aaa</span><br>aa<br><span>aaa</span>
+</div>
+<div><span>aaa</span>aa<br><span>aaa</span>
+</div>
+<div><span>aaa</span>aa</div>
+</f>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-sizing/clone-intrinsic-size.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Test: min/max-content size on box-decoration-break:clone inline box</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content">
+  <link rel="help" href="https://drafts.csswg.org/css-break-3/#break-decoration">
+  <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1552357">
+  <link rel="match" href="clone-intrinsic-size-ref.html">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+  -webkit-box-decoration-break: clone;
+  box-decoration-break: clone;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div>
+  <span>aaa</span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span> <span>aaa</span>
+</div>
+<div>
+  <span>aaa </span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span><span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa </span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa </div>
+</f>
+
+<f class="min">
+<div>
+  <span>aaa</span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span> <span>aaa</span>
+</div>
+<div>
+  <span>aaa </span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span><span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa </span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa </div>
+</f>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-sizing/slice-intrinsic-size-ref.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Reference: min/max-content size on box-decoration-break:slice inline box</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+  white-space: pre;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div><span>aaa</span><span>aaa</span></div>
+<div><span>aaa</span>aa<span>aaa</span></div>
+<div><span>aaa</span> <span>aaa</span></div>
+<div><span>aaa </span><span>aaa</span></div>
+<div><span>aaa</span><span> aaa</span></div>
+<div><span>aaa</span> aa<span>aaa</span></div>
+<div><span>aaa </span>aa<span>aaa</span></div>
+<div><span>aaa</span>aa<span> aaa</span></div>
+<div><span>aaa</span> aa <span>aaa</span></div>
+<div><span>aaa</span>aa <span>aaa</span></div>
+<div><span>aaa</span>aa</div>
+</f>
+
+<f class="min">
+<div><span>aaa</span><span>aaa</span></div>
+<div><span>aaa</span>aa<span>aaa</span></div>
+<div><span>aaa</span><br><span>aaa</span></div>
+<div><span>aaa</span><br><span>aaa</span></div>
+<div><span>aaa</span><span><br>aaa</span></div>
+<div><span>aaa</span><br>aa<span>aaa</span></div>
+<div><span>aaa</span><br>aa<span>aaa</span></div>
+<div><span>aaa</span>aa<span><br>aaa</span></div>
+<div><span>aaa</span><br>aa<br><span>aaa</span></div>
+<div><span>aaa</span>aa<br><span>aaa</span></div>
+<div><span>aaa</span>aa</div>
+</f>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-sizing/slice-intrinsic-size.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<head>
+  <title>CSS Test: min/max-content size on box-decoration-break:slice inline box</title>
+  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content">
+  <link rel="help" href="https://drafts.csswg.org/css-break-3/#break-decoration">
+  <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1552357">
+  <link rel="match" href="slice-intrinsic-size-ref.html">
+<style>
+html,body {
+  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+}
+
+div {
+  border: 5px solid blue;
+}
+.max > div {
+  width: -moz-max-content;
+  width: -webkit-max-content;
+  width: max-content;
+}
+.min > div {
+  width: -moz-min-content;
+  width: -webkit-min-content;
+  width: min-content;
+}
+
+span {
+  border: 2px solid gray;
+  padding: 0 10px 0 6px;
+  border-width: 0 8px 0 5px;
+  margin: 0 4px 0 3px;
+  background: yellow;
+  /* for clarity: */
+  -webkit-box-decoration-break: slice;
+  box-decoration-break: slice;
+}
+
+f { margin-right: 30px; float: left; }
+</style>
+<body>
+<f class="max">
+<div>
+  <span>aaa</span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span> <span>aaa</span>
+</div>
+<div>
+  <span>aaa </span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span><span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa </span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa </div>
+</f>
+
+<f class="min">
+<div>
+  <span>aaa</span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span> <span>aaa</span>
+</div>
+<div>
+  <span>aaa </span><span>aaa</span>
+</div>
+<div>
+  <span>aaa</span><span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa </span>aa<span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa<span> aaa</span>
+</div>
+<div>
+  <span>aaa</span> aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa <span>aaa</span>
+</div>
+<div>
+  <span>aaa</span>aa </div>
+</f>
--- a/toolkit/xre/glxtest.cpp
+++ b/toolkit/xre/glxtest.cpp
@@ -196,17 +196,17 @@ void glxtest() {
   for (int i = 1; i < fd; i++) dup2(fd, i);
   close(fd);
 
   if (getenv("MOZ_AVOID_OPENGL_ALTOGETHER"))
     fatal_error(
         "The MOZ_AVOID_OPENGL_ALTOGETHER environment variable is defined");
 
     ///// Open libGL and load needed symbols /////
-#ifdef __OpenBSD__
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 #  define LIBGL_FILENAME "libGL.so"
 #else
 #  define LIBGL_FILENAME "libGL.so.1"
 #endif
   void* libgl = dlopen(LIBGL_FILENAME, RTLD_LAZY);
   if (!libgl) fatal_error("Unable to load " LIBGL_FILENAME);
 
   typedef void* (*PFNGLXGETPROCADDRESS)(const char*);
--- a/tools/quitter/manifest.json
+++ b/tools/quitter/manifest.json
@@ -2,17 +2,17 @@
   "manifest_version": 2,
 
   "applications": {
     "gecko": {"id": "quitter@mozilla.org"}
   },
 
   "name": "Quitter",
   "description": "Quit",
-  "version": "2018.04.03",
+  "version": "2019.06.03",
   "author": "Mozilla",
 
   "background": {
     "scripts": ["background.js"]
   },
 
   "content_scripts": [{
     "js": ["contentscript.js"],
--- a/tools/quitter/parent.js
+++ b/tools/quitter/parent.js
@@ -3,15 +3,19 @@
 /* globals ExtensionAPI */
 
 const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
 
 this.quitter = class extends ExtensionAPI {
   getAPI(context) {
     return {
       quitter: {
-        quit() {
+        async quit() {
+          let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
+          if (browserWindow && browserWindow.gBrowserInit) {
+            await browserWindow.gBrowserInit.idleTasksFinishedPromise;
+          }
           Services.startup.quit(Ci.nsIAppStartup.eForceQuit);
         },
       },
     };
   }
 };
index e111a44b5354725892519ba57da17dd975c04dd1..4da43cc820c6788db8e879ff5bed63ee3772d94b
GIT binary patch
literal 6266
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
R_}|x&0hy264iNlW{SS*(<M#jn