svn commit: r464685 - in branches/2018Q1/www/waterfox: . files
Jan Beich
jbeich at FreeBSD.org
Fri Mar 16 13:26:46 UTC 2018
Author: jbeich
Date: Fri Mar 16 13:26:43 2018
New Revision: 464685
URL: https://svnweb.freebsd.org/changeset/ports/464685
Log:
MFH: r464679
www/waterfox: apply more FF59 fixes
Some are left for later:
https://bugzilla.mozilla.org/buglist.cgi?bug_id=1431371,1429768,1297740,1432855,1442318,1422631,1426603,1373934,1416940
Approved by: ports-secteam blanket
Added:
branches/2018Q1/www/waterfox/files/patch-bug1366357
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1366357
branches/2018Q1/www/waterfox/files/patch-bug1414768
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1414768
branches/2018Q1/www/waterfox/files/patch-bug1419166
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1419166
branches/2018Q1/www/waterfox/files/patch-bug1421963
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1421963
branches/2018Q1/www/waterfox/files/patch-bug1422643
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1422643
branches/2018Q1/www/waterfox/files/patch-bug1423173
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1423173
branches/2018Q1/www/waterfox/files/patch-bug1424261
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1424261
branches/2018Q1/www/waterfox/files/patch-bug1426002
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1426002
branches/2018Q1/www/waterfox/files/patch-bug1430511
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1430511
branches/2018Q1/www/waterfox/files/patch-bug1438425
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1438425
branches/2018Q1/www/waterfox/files/patch-bug1439396
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1439396
branches/2018Q1/www/waterfox/files/patch-bug1440717
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1440717
branches/2018Q1/www/waterfox/files/patch-bug1443865
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1443865
branches/2018Q1/www/waterfox/files/patch-bug1446062
- copied unchanged from r464679, head/www/waterfox/files/patch-bug1446062
Modified:
branches/2018Q1/www/waterfox/Makefile
branches/2018Q1/www/waterfox/files/patch-bug1425780
Directory Properties:
branches/2018Q1/ (props changed)
Modified: branches/2018Q1/www/waterfox/Makefile
==============================================================================
--- branches/2018Q1/www/waterfox/Makefile Fri Mar 16 13:25:30 2018 (r464684)
+++ branches/2018Q1/www/waterfox/Makefile Fri Mar 16 13:26:43 2018 (r464685)
@@ -3,7 +3,7 @@
PORTNAME= waterfox
DISTVERSION= 56.0.4-36
DISTVERSIONSUFFIX= -g79492ecca478
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= www ipv6
MAINTAINER= jbeich at FreeBSD.org
Copied: branches/2018Q1/www/waterfox/files/patch-bug1366357 (from r464679, head/www/waterfox/files/patch-bug1366357)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1366357 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1366357)
@@ -0,0 +1,141 @@
+commit 15353262e8f3
+Author: Johann Hofmann <jhofmann at mozilla.com>
+Date: Tue Jun 13 12:10:39 2017 +0200
+
+ Bug 1366357 - Use origin instead of documentURI for WebRTC permission requests. r=florian
+
+ MozReview-Commit-ID: IkccA65Ma3a
+
+ --HG--
+ extra : rebase_source : 9c1f2c895949b1dae617b0c2a1039a5494cd8b2a
+---
+ .../test/popupNotifications/browser_displayURI.js | 79 ++++++++++++++++++----
+ browser/modules/ContentWebRTC.jsm | 1 +
+ browser/modules/webrtcUI.jsm | 8 ++-
+ 3 files changed, 73 insertions(+), 15 deletions(-)
+
+diff --git browser/base/content/test/popupNotifications/browser_displayURI.js browser/base/content/test/popupNotifications/browser_displayURI.js
+index 10a8199dab54..df2bfb54fe25 100644
+--- browser/base/content/test/popupNotifications/browser_displayURI.js
++++ browser/base/content/test/popupNotifications/browser_displayURI.js
+@@ -1,19 +1,11 @@
+ /*
+- * Make sure that the origin is shown for ContentPermissionPrompt
+- * consumers e.g. geolocation.
+-*/
+-
+-add_task(async function test_displayURI() {
+- await BrowserTestUtils.withNewTab({
+- gBrowser,
+- url: "https://test1.example.com/",
+- }, async function(browser) {
++ * Make sure that the correct origin is shown for permission prompts.
++ */
++
++async function check(contentTask) {
++ await BrowserTestUtils.withNewTab("https://test1.example.com/", async function(browser) {
+ let popupShownPromise = waitForNotificationPanel();
+- await ContentTask.spawn(browser, null, async function() {
+- content.navigator.geolocation.getCurrentPosition(function(pos) {
+- // Do nothing
+- });
+- });
++ await ContentTask.spawn(browser, null, contentTask);
+ let panel = await popupShownPromise;
+ let notification = panel.children[0];
+ let body = document.getAnonymousElementByAttribute(notification,
+@@ -21,4 +13,63 @@ add_task(async function test_displayURI() {
+ "popup-notification-body");
+ ok(body.innerHTML.includes("example.com"), "Check that at least the eTLD+1 is present in the markup");
+ });
++
++ let channel = NetUtil.newChannel({
++ uri: getRootDirectory(gTestPath),
++ loadUsingSystemPrincipal: true,
++ });
++ channel = channel.QueryInterface(Ci.nsIFileChannel);
++
++ return BrowserTestUtils.withNewTab(channel.file.path, async function(browser) {
++ let popupShownPromise = waitForNotificationPanel();
++ await ContentTask.spawn(browser, null, contentTask);
++ let panel = await popupShownPromise;
++ let notification = panel.children[0];
++ let body = document.getAnonymousElementByAttribute(notification,
++ "class",
++ "popup-notification-body");
++ if (notification.id == "geolocation-notification") {
++ ok(body.innerHTML.includes("local file"), `file:// URIs should be displayed as local file.`);
++ } else {
++ ok(body.innerHTML.includes("Unknown origin"), "file:// URIs should be displayed as unknown origin.");
++ }
++ });
++}
++
++add_task(async function setup() {
++ await SpecialPowers.pushPrefEnv({set: [
++ ["media.navigator.permission.fake", true],
++ ["media.navigator.permission.force", true],
++ ]});
+ });
++
++add_task(async function test_displayURI_geo() {
++ await check(async function() {
++ content.navigator.geolocation.getCurrentPosition(() => {});
++ });
++});
++
++add_task(async function test_displayURI_camera() {
++ await check(async function() {
++ content.navigator.mediaDevices.getUserMedia({video: true, fake: true});
++ });
++});
++
++add_task(async function test_displayURI_geo_blob() {
++ await check(async function() {
++ let text = "<script>navigator.geolocation.getCurrentPosition(() => {})</script>";
++ let blob = new Blob([text], {type: "text/html"});
++ let url = content.URL.createObjectURL(blob);
++ content.location.href = url;
++ });
++});
++
++add_task(async function test_displayURI_camera_blob() {
++ await check(async function() {
++ let text = "<script>navigator.mediaDevices.getUserMedia({video: true, fake: true})</script>";
++ let blob = new Blob([text], {type: "text/html"});
++ let url = content.URL.createObjectURL(blob);
++ content.location.href = url;
++ });
++});
++
+diff --git browser/modules/ContentWebRTC.jsm browser/modules/ContentWebRTC.jsm
+index f717f6abbc0a..1cbe0832cba1 100644
+--- browser/modules/ContentWebRTC.jsm
++++ browser/modules/ContentWebRTC.jsm
+@@ -216,6 +216,7 @@ function prompt(aContentWindow, aWindowID, aCallID, aConstraints, aDevices, aSec
+ let request = {
+ callID: aCallID,
+ windowID: aWindowID,
++ origin: aContentWindow.origin,
+ documentURI: aContentWindow.document.documentURI,
+ secure: aSecure,
+ requestTypes,
+diff --git browser/modules/webrtcUI.jsm browser/modules/webrtcUI.jsm
+index 6bc97eb7305c..3efdf946352b 100644
+--- browser/modules/webrtcUI.jsm
++++ browser/modules/webrtcUI.jsm
+@@ -368,7 +368,13 @@ function prompt(aBrowser, aRequest) {
+ aBrowser.dispatchEvent(new aBrowser.ownerGlobal
+ .CustomEvent("PermissionStateChange"));
+
+- let uri = Services.io.newURI(aRequest.documentURI);
++ let uri;
++ try {
++ // This fails for principals that serialize to "null", e.g. file URIs.
++ uri = Services.io.newURI(aRequest.origin);
++ } catch (e) {
++ uri = Services.io.newURI(aRequest.documentURI);
++ }
+ let host = getHost(uri);
+ let chromeDoc = aBrowser.ownerDocument;
+ let stringBundle = chromeDoc.defaultView.gNavigatorBundle;
Copied: branches/2018Q1/www/waterfox/files/patch-bug1414768 (from r464679, head/www/waterfox/files/patch-bug1414768)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1414768 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1414768)
@@ -0,0 +1,325 @@
+commit cb494b100bfb
+Author: Jason Orendorff <jorendorff at mozilla.com>
+Date: Tue Nov 7 16:59:00 2017 -0600
+
+ Bug 1414768 - Handle same-compartment wrappers in TypedArray methods. r=bz
+
+ CallTypedArrayMethodIfWrapped (and the CallNonGeneric machinery throughout
+ the engine) unwraps the `this` argument, but the other arguments are only
+ rewrapped for the target compartment.
+
+ The pattern being used before this patch to get the length of a TypedArray
+ or possible TypedArray wrapper is:
+
+ callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength")
+
+ The first O is the `this` value and the second is an argument.
+ If O is a cross-compartment wrapper, this works fine. The first O is unwrapped,
+ revealing the actual TypedArray object; the second O is rewrapped for that
+ TypedArray's compartment, producing the same TypedArray.
+
+ However, if O is a same-compartment wrapper, this doesn't work. The first O
+ is unwrapped, revealing the actual TypedArray object in the same compartment;
+ rewrapping the other O does nothing to it, since it is already an object in the
+ target compartment. Thus TypedArrayLength receives a `this` value that's an
+ unwrapped TypedArray, but an argument that is still a wrapper.
+
+ The fix is to have CallTypedArrayMethodIfWrapped targets only expect `this`
+ to be an unwrapped TypedArray.
+
+ --HG--
+ extra : rebase_source : 468453beebc9e48dcbc63162f400069a11f413b9
+---
+ js/src/builtin/TypedArray.js | 73 ++++++++++------------
+ .../jit-test/tests/proxy/testWrapWithProtoIter.js | 1 +
+ .../tests/proxy/testWrapWithProtoTypedArray.js | 19 ++++++
+ 3 files changed, 54 insertions(+), 39 deletions(-)
+
+diff --git js/src/builtin/TypedArray.js js/src/builtin/TypedArray.js
+index 0ee07634822d..8e29657f167e 100644
+--- js/src/builtin/TypedArray.js
++++ js/src/builtin/TypedArray.js
+@@ -33,6 +33,10 @@ function IsDetachedBuffer(buffer) {
+ return (flags & JS_ARRAYBUFFER_DETACHED_FLAG) !== 0;
+ }
+
++function TypedArrayLengthMethod() {
++ return TypedArrayLength(this);
++}
++
+ function GetAttachedArrayBuffer(tarray) {
+ var buffer = ViewedArrayBufferIfReified(tarray);
+ if (IsDetachedBuffer(buffer))
+@@ -40,6 +44,10 @@ function GetAttachedArrayBuffer(tarray) {
+ return buffer;
+ }
+
++function GetAttachedArrayBufferMethod() {
++ return GetAttachedArrayBuffer(this);
++}
++
+ // A function which ensures that the argument is either a typed array or a
+ // cross-compartment wrapper for a typed array and that the typed array involved
+ // has an attached array buffer. If one of those conditions doesn't hold (wrong
+@@ -52,10 +60,7 @@ function IsTypedArrayEnsuringArrayBuffer(arg) {
+ return true;
+ }
+
+- // This is a bit hacky but gets the job done: the first `arg` is used to
+- // test for a wrapped typed array, the second as an argument to
+- // GetAttachedArrayBuffer.
+- callFunction(CallTypedArrayMethodIfWrapped, arg, arg, "GetAttachedArrayBuffer");
++ callFunction(CallTypedArrayMethodIfWrapped, arg, "GetAttachedArrayBufferMethod");
+ return false;
+ }
+
+@@ -96,8 +101,8 @@ function TypedArrayCreateWithLength(constructor, length) {
+ if (isTypedArray) {
+ len = TypedArrayLength(newTypedArray);
+ } else {
+- len = callFunction(CallTypedArrayMethodIfWrapped, newTypedArray, newTypedArray,
+- "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, newTypedArray,
++ "TypedArrayLengthMethod");
+ }
+
+ if (len < length)
+@@ -257,15 +262,14 @@ function TypedArrayEvery(callbackfn/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Steps 3-5.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 6.
+ if (arguments.length === 0)
+@@ -361,15 +365,14 @@ function TypedArrayFilter(callbackfn/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Step 3.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 4.
+ if (arguments.length === 0)
+@@ -423,15 +426,14 @@ function TypedArrayFind(predicate/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Steps 3-5.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 6.
+ if (arguments.length === 0)
+@@ -465,15 +467,14 @@ function TypedArrayFindIndex(predicate/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Steps 3-5.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 6.
+ if (arguments.length === 0)
+@@ -505,15 +506,14 @@ function TypedArrayForEach(callbackfn/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Step 3-4.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 5.
+ if (arguments.length === 0)
+@@ -703,15 +703,14 @@ function TypedArrayMap(callbackfn/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Step 3.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 4.
+ if (arguments.length === 0)
+@@ -747,15 +746,14 @@ function TypedArrayReduce(callbackfn/*, initialValue*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Steps 3-5.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 6.
+ if (arguments.length === 0)
+@@ -793,15 +791,14 @@ function TypedArrayReduceRight(callbackfn/*, initialValue*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Steps 3-5.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 6.
+ if (arguments.length === 0)
+@@ -1066,15 +1063,14 @@ function TypedArraySome(callbackfn/*, thisArg*/) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(O);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Steps 3-5.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(O);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, O, "TypedArrayLengthMethod");
+
+ // Step 6.
+ if (arguments.length === 0)
+@@ -1176,7 +1172,7 @@ function TypedArraySort(comparefn) {
+ if (isTypedArray) {
+ buffer = GetAttachedArrayBuffer(obj);
+ } else {
+- buffer = callFunction(CallTypedArrayMethodIfWrapped, obj, obj, "GetAttachedArrayBuffer");
++ buffer = callFunction(CallTypedArrayMethodIfWrapped, obj, "GetAttachedArrayBufferMethod");
+ }
+
+ // Step 4.
+@@ -1184,7 +1180,7 @@ function TypedArraySort(comparefn) {
+ if (isTypedArray) {
+ len = TypedArrayLength(obj);
+ } else {
+- len = callFunction(CallTypedArrayMethodIfWrapped, obj, obj, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, obj, "TypedArrayLengthMethod");
+ }
+
+ // Arrays with less than two elements remain unchanged when sorted.
+@@ -1221,7 +1217,7 @@ function TypedArraySort(comparefn) {
+ if (isTypedArray) {
+ length = TypedArrayLength(obj);
+ } else {
+- length = callFunction(CallTypedArrayMethodIfWrapped, obj, obj, "TypedArrayLength");
++ length = callFunction(CallTypedArrayMethodIfWrapped, obj, "TypedArrayLengthMethod");
+ }
+
+ // It's faster for us to check the typed array's length than to check
+@@ -1253,15 +1249,14 @@ function TypedArrayToLocaleString(locales = undefined, options = undefined) {
+ // We want to make sure that we have an attached buffer, per spec prose.
+ var isTypedArray = IsTypedArrayEnsuringArrayBuffer(array);
+
+- // If we got here, `this` is either a typed array or a cross-compartment
+- // wrapper for one.
++ // If we got here, `this` is either a typed array or a wrapper for one.
+
+ // Step 2.
+ var len;
+ if (isTypedArray)
+ len = TypedArrayLength(array);
+ else
+- len = callFunction(CallTypedArrayMethodIfWrapped, array, array, "TypedArrayLength");
++ len = callFunction(CallTypedArrayMethodIfWrapped, array, "TypedArrayLengthMethod");
+
+ // Step 4.
+ if (len === 0)
+diff --git js/src/jit-test/tests/proxy/testWrapWithProtoIter.js js/src/jit-test/tests/proxy/testWrapWithProtoIter.js
+new file mode 100644
+index 000000000000..c6854b206786
+--- /dev/null
++++ js/src/jit-test/tests/proxy/testWrapWithProtoIter.js
+@@ -0,0 +1 @@
++[...wrapWithProto(new Int8Array(), new Int8Array())]
+diff --git js/src/jit-test/tests/proxy/testWrapWithProtoTypedArray.js js/src/jit-test/tests/proxy/testWrapWithProtoTypedArray.js
+new file mode 100644
+index 000000000000..1b805d30a119
+--- /dev/null
++++ js/src/jit-test/tests/proxy/testWrapWithProtoTypedArray.js
+@@ -0,0 +1,19 @@
++let a = wrapWithProto(new Int8Array([1, 3, 5, 6, 9]), new Int8Array());
++
++assertEq([...a].toString(), "1,3,5,6,9");
++assertEq(a.every(e => e < 100), true);
++assertEq(a.filter(e => e % 2 == 1).toString(), "1,3,5,9");
++assertEq(a.find(e => e > 3), 5);
++assertEq(a.findIndex(e => e % 2 == 0), 3);
++assertEq(a.map(e => e * 10).toString(), "10,30,50,60,90");
++assertEq(a.reduce((a, b) => a + b, ""), "13569");
++assertEq(a.reduceRight((acc, e) => "(" + e + acc + ")", ""), "(1(3(5(6(9)))))");
++assertEq(a.some(e => e % 2 == 0), true);
++
++let s = "";
++assertEq(a.forEach(e => s += e), undefined);
++assertEq(s, "13569");
++
++a.sort((a, b) => b - a);
++assertEq(a.toString(), "9,6,5,3,1");
++
Copied: branches/2018Q1/www/waterfox/files/patch-bug1419166 (from r464679, head/www/waterfox/files/patch-bug1419166)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1419166 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1419166)
@@ -0,0 +1,144 @@
+commit 2b3039c02109
+Author: Andrea Marchesini <amarchesini at mozilla.com>
+Date: Mon Nov 27 17:07:39 2017 +0100
+
+ Bug 1419166 - Use nsIPrincipal to decide if a SharedWorker should be shared, r=bkelly
+---
+ dom/workers/RuntimeService.cpp | 80 +++++++++++++++++-------------------------
+ dom/workers/RuntimeService.h | 2 +-
+ 2 files changed, 33 insertions(+), 49 deletions(-)
+
+diff --git dom/workers/RuntimeService.cpp dom/workers/RuntimeService.cpp
+index 452f623aef2d..8e34fb398e10 100644
+--- dom/workers/RuntimeService.cpp
++++ dom/workers/RuntimeService.cpp
+@@ -253,26 +253,6 @@ GetWorkerPref(const nsACString& aPref,
+ return result;
+ }
+
+-// This fn creates a key for a SharedWorker that contains the name, script
+-// spec, and the serialized origin attributes:
+-// "name|scriptSpec^key1=val1&key2=val2&key3=val3"
+-void
+-GenerateSharedWorkerKey(const nsACString& aScriptSpec,
+- const nsAString& aName,
+- const OriginAttributes& aAttrs,
+- nsCString& aKey)
+-{
+- nsAutoCString suffix;
+- aAttrs.CreateSuffix(suffix);
+-
+- aKey.Truncate();
+- aKey.SetCapacity(aName.Length() + aScriptSpec.Length() + suffix.Length() + 2);
+- aKey.Append(NS_ConvertUTF16toUTF8(aName));
+- aKey.Append('|');
+- aKey.Append(aScriptSpec);
+- aKey.Append(suffix);
+-}
+-
+ void
+ LoadContextOptions(const char* aPrefName, void* /* aClosure */)
+ {
+@@ -1602,16 +1582,23 @@ RuntimeService::RegisterWorker(WorkerPrivate* aWorkerPrivate)
+ }
+
+ if (isSharedWorker) {
+- const nsString& sharedWorkerName(aWorkerPrivate->WorkerName());
+- nsAutoCString key;
+- GenerateSharedWorkerKey(sharedWorkerScriptSpec, sharedWorkerName,
+- aWorkerPrivate->GetOriginAttributes(), key);
+- MOZ_ASSERT(!domainInfo->mSharedWorkerInfos.Get(key));
++#ifdef DEBUG
++ for (const UniquePtr<SharedWorkerInfo>& data : domainInfo->mSharedWorkerInfos) {
++ if (data->mScriptSpec == sharedWorkerScriptSpec &&
++ data->mName == aWorkerPrivate->WorkerName() &&
++ // We want to be sure that the window's principal subsumes the
++ // SharedWorker's principal and vice versa.
++ data->mWorkerPrivate->GetPrincipal()->Subsumes(aWorkerPrivate->GetPrincipal()) &&
++ aWorkerPrivate->GetPrincipal()->Subsumes(data->mWorkerPrivate->GetPrincipal())) {
++ MOZ_CRASH("We should not instantiate a new SharedWorker!");
++ }
++ }
++#endif
+
+- SharedWorkerInfo* sharedWorkerInfo =
++ UniquePtr<SharedWorkerInfo> sharedWorkerInfo(
+ new SharedWorkerInfo(aWorkerPrivate, sharedWorkerScriptSpec,
+- sharedWorkerName);
+- domainInfo->mSharedWorkerInfos.Put(key, sharedWorkerInfo);
++ aWorkerPrivate->WorkerName()));
++ domainInfo->mSharedWorkerInfos.AppendElement(Move(sharedWorkerInfo));
+ }
+ }
+
+@@ -1671,18 +1658,11 @@ void
+ RuntimeService::RemoveSharedWorker(WorkerDomainInfo* aDomainInfo,
+ WorkerPrivate* aWorkerPrivate)
+ {
+- for (auto iter = aDomainInfo->mSharedWorkerInfos.Iter();
+- !iter.Done();
+- iter.Next()) {
+- SharedWorkerInfo* data = iter.UserData();
++ for (uint32_t i = 0; i < aDomainInfo->mSharedWorkerInfos.Length(); ++i) {
++ const UniquePtr<SharedWorkerInfo>& data =
++ aDomainInfo->mSharedWorkerInfos[i];
+ if (data->mWorkerPrivate == aWorkerPrivate) {
+-#ifdef DEBUG
+- nsAutoCString key;
+- GenerateSharedWorkerKey(data->mScriptSpec, data->mName,
+- aWorkerPrivate->GetOriginAttributes(), key);
+- MOZ_ASSERT(iter.Key() == key);
+-#endif
+- iter.Remove();
++ aDomainInfo->mSharedWorkerInfos.RemoveElementAt(i);
+ break;
+ }
+ }
+@@ -2499,21 +2479,25 @@ RuntimeService::CreateSharedWorkerFromLoadInfo(JSContext* aCx,
+ {
+ MutexAutoLock lock(mMutex);
+
+- WorkerDomainInfo* domainInfo;
+- SharedWorkerInfo* sharedWorkerInfo;
+-
+ nsCString scriptSpec;
+ nsresult rv = aLoadInfo->mResolvedScriptURI->GetSpec(scriptSpec);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ MOZ_ASSERT(aLoadInfo->mPrincipal);
+- nsAutoCString key;
+- GenerateSharedWorkerKey(scriptSpec, aName,
+- aLoadInfo->mPrincipal->OriginAttributesRef(), key);
+
+- if (mDomainMap.Get(aLoadInfo->mDomain, &domainInfo) &&
+- domainInfo->mSharedWorkerInfos.Get(key, &sharedWorkerInfo)) {
+- workerPrivate = sharedWorkerInfo->mWorkerPrivate;
++ WorkerDomainInfo* domainInfo;
++ if (mDomainMap.Get(aLoadInfo->mDomain, &domainInfo)) {
++ for (const UniquePtr<SharedWorkerInfo>& data : domainInfo->mSharedWorkerInfos) {
++ if (data->mScriptSpec == scriptSpec &&
++ data->mName == aName &&
++ // We want to be sure that the window's principal subsumes the
++ // SharedWorker's principal and vice versa.
++ aLoadInfo->mPrincipal->Subsumes(data->mWorkerPrivate->GetPrincipal()) &&
++ data->mWorkerPrivate->GetPrincipal()->Subsumes(aLoadInfo->mPrincipal)) {
++ workerPrivate = data->mWorkerPrivate;
++ break;
++ }
++ }
+ }
+ }
+
+diff --git dom/workers/RuntimeService.h dom/workers/RuntimeService.h
+index f7334896cd4c..45c8642adc85 100644
+--- dom/workers/RuntimeService.h
++++ dom/workers/RuntimeService.h
+@@ -45,7 +45,7 @@ class RuntimeService final : public nsIObserver
+ nsTArray<WorkerPrivate*> mActiveWorkers;
+ nsTArray<WorkerPrivate*> mActiveServiceWorkers;
+ nsTArray<WorkerPrivate*> mQueuedWorkers;
+- nsClassHashtable<nsCStringHashKey, SharedWorkerInfo> mSharedWorkerInfos;
++ nsTArray<UniquePtr<SharedWorkerInfo>> mSharedWorkerInfos;
+ uint32_t mChildWorkerCount;
+
+ WorkerDomainInfo()
Copied: branches/2018Q1/www/waterfox/files/patch-bug1421963 (from r464679, head/www/waterfox/files/patch-bug1421963)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1421963 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1421963)
@@ -0,0 +1,39 @@
+commit edbe55cb9057
+Author: Randell Jesup <rjesup at jesup.org>
+Date: Thu Dec 7 13:24:46 2017 -0500
+
+ Bug 1421963: lock around SCTP input processing, not just the receive callback r=drno
+---
+ netwerk/sctp/datachannel/DataChannel.cpp | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git netwerk/sctp/datachannel/DataChannel.cpp netwerk/sctp/datachannel/DataChannel.cpp
+index 4a0432469a80..6f13826ed7c6 100644
+--- netwerk/sctp/datachannel/DataChannel.cpp
++++ netwerk/sctp/datachannel/DataChannel.cpp
+@@ -817,6 +817,7 @@ DataChannelConnection::SctpDtlsInput(TransportFlow *flow,
+ }
+ }
+ // Pass the data to SCTP
++ MutexAutoLock lock(mLock);
+ usrsctp_conninput(static_cast<void *>(this), data, len, 0);
+ }
+
+@@ -1224,7 +1225,7 @@ DataChannelConnection::SendDeferredMessages()
+ RefPtr<DataChannel> channel; // we may null out the refs to this
+
+ // This may block while something is modifying channels, but should not block for IO
+- MutexAutoLock lock(mLock);
++ mLock.AssertCurrentThreadOwns();
+
+ LOG(("SendDeferredMessages called, pending type: %d", mPendingType));
+ if (!mPendingType) {
+@@ -2307,7 +2308,7 @@ DataChannelConnection::ReceiveCallback(struct socket* sock, void *data, size_t d
+ if (!data) {
+ usrsctp_close(sock); // SCTP has finished shutting down
+ } else {
+- MutexAutoLock lock(mLock);
++ mLock.AssertCurrentThreadOwns();
+ if (flags & MSG_NOTIFICATION) {
+ HandleNotification(static_cast<union sctp_notification *>(data), datalen);
+ } else {
Copied: branches/2018Q1/www/waterfox/files/patch-bug1422643 (from r464679, head/www/waterfox/files/patch-bug1422643)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1422643 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1422643)
@@ -0,0 +1,80 @@
+commit dd719e911e2c
+Author: Gijs Kruitbosch <gijskruitbosch at gmail.com>
+Date: Wed Dec 20 18:57:48 2017 +0000
+
+ Bug 1422643 - deal with tabs in the protocol in js paste detection code, r=florian,valentin
+
+ MozReview-Commit-ID: Ax5LGkIedkY
+
+ --HG--
+ extra : rebase_source : 85a9871a4de44652fe3bbfd455af389fe27d7714
+ extra : source : 6ad5ec88a8982d83b8097fd76a2383aae94711c6
+---
+ browser/base/content/browser.js | 20 ++++++++++++--------
+ .../browser_removeUnsafeProtocolsFromURLBarPaste.js | 15 +++++++++++++++
+ 2 files changed, 27 insertions(+), 8 deletions(-)
+
+diff --git browser/base/content/browser.js browser/base/content/browser.js
+index e6e60cd202a0..5306800ebaca 100755
+--- browser/base/content/browser.js
++++ browser/base/content/browser.js
+@@ -6053,14 +6053,18 @@ function middleMousePaste(event) {
+ function stripUnsafeProtocolOnPaste(pasteData) {
+ // Don't allow pasting javascript URIs since we don't support
+ // LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL for those.
+- let changed = false;
+- let pasteDataNoJS = pasteData.replace(/\r?\n/g, "")
+- .replace(/^(?:\W*javascript:)+/i,
+- () => {
+- changed = true;
+- return "";
+- });
+- return changed ? pasteDataNoJS : pasteData;
++ while (true) {
++ let scheme = "";
++ try {
++ scheme = Services.io.extractScheme(pasteData);
++ } catch (ex) { }
++ if (scheme != "javascript") {
++ break;
++ }
++
++ pasteData = pasteData.substring(pasteData.indexOf(":") + 1);
++ }
++ return pasteData;
+ }
+
+ // handleDroppedLink has the following 2 overloads:
+diff --git browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
+index 27129297b0a3..70ecaa048626 100644
+--- browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
++++ browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
+@@ -9,6 +9,7 @@ var pairs = [
+ ["javascript:document.domain", "document.domain"],
+ [" \u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009javascript:document.domain", "document.domain"],
+ ["java\nscript:foo", "foo"],
++ ["java\tscript:foo", "foo"],
+ ["http://\nexample.com", "http://example.com"],
+ ["http://\nexample.com\n", "http://example.com"],
+ ["data:text/html,<body>hi</body>", "data:text/html,<body>hi</body>"],
+@@ -20,6 +21,20 @@ var pairs = [
+ ["data:data:text/html,javascript:alert('hi!')", "data:data:text/html,javascript:alert('hi!')"],
+ ];
+
++let supportsNullBytes = AppConstants.platform == "macosx";
++// Note that \u000d (\r) is missing here; we test it separately because it
++// makes the test sad on Windows.
++let gobbledygook = "\u000a\u000b\u000c\u000e\u000f\u0010\u0011\u0012\u0013\u0014javascript:foo";
++if (supportsNullBytes) {
++ gobbledygook = "\u0000" + gobbledygook;
++}
++pairs.push([gobbledygook, "foo"]);
++
++let supportsReturnWithoutNewline = AppConstants.platform != "win";
++if (supportsReturnWithoutNewline) {
++ pairs.push(["java\rscript:foo", "foo"]);
++}
++
+ var clipboardHelper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
+
+ function paste(input, cb) {
Copied: branches/2018Q1/www/waterfox/files/patch-bug1423173 (from r464679, head/www/waterfox/files/patch-bug1423173)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1423173 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1423173)
@@ -0,0 +1,43 @@
+commit 46e3052bc347
+Author: Kannan Vijayan <kvijayan at mozilla.com>
+Date: Thu Jan 4 14:36:07 2018 -0500
+
+ Bug 1423173 - Check for shadowing indexed properties when adding elements. r=jandem
+---
+ js/src/jit-test/tests/arrays/bug1423173.js | 13 +++++++++++++
+ js/src/jit/CacheIR.cpp | 3 +++
+ 2 files changed, 16 insertions(+)
+
+diff --git js/src/jit-test/tests/arrays/bug1423173.js js/src/jit-test/tests/arrays/bug1423173.js
+new file mode 100644
+index 000000000000..38e584ce3655
+--- /dev/null
++++ js/src/jit-test/tests/arrays/bug1423173.js
+@@ -0,0 +1,13 @@
++// |jit-test| --baseline-eager
++Array.prototype.push(1);
++Object.freeze([].__proto__);
++var x = [];
++var c = 0;
++for (var j = 0; j < 5; ++j) {
++ try {
++ x.push(function() {});
++ } catch (e) {
++ c++;
++ }
++}
++assertEq(c, j);
+diff --git js/src/jit/CacheIR.cpp js/src/jit/CacheIR.cpp
+index 507788a7c182..fa5fc6bc6f91 100644
+--- js/src/jit/CacheIR.cpp
++++ js/src/jit/CacheIR.cpp
+@@ -3406,6 +3406,9 @@ CanAttachAddElement(JSObject* obj, bool isInit)
+ if (!proto->isNative())
+ return false;
+
++ if (proto->as<NativeObject>().denseElementsAreFrozen())
++ return false;
++
+ obj = proto;
+ } while (true);
+
Copied: branches/2018Q1/www/waterfox/files/patch-bug1424261 (from r464679, head/www/waterfox/files/patch-bug1424261)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1424261 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1424261)
@@ -0,0 +1,66 @@
+commit 0d38343e3589
+Author: Gijs Kruitbosch <gijskruitbosch at gmail.com>
+Date: Tue Dec 12 10:53:10 2017 -0600
+
+ Bug 1424261, r=bz
+
+ --HG--
+ extra : rebase_source : 2bead652bbfd4cd251b431e04e3002c38c1a7a7b
+---
+ caps/nsScriptSecurityManager.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git caps/nsScriptSecurityManager.cpp caps/nsScriptSecurityManager.cpp
+index 736eab415b8d..e557f4f1a0b7 100644
+--- caps/nsScriptSecurityManager.cpp
++++ caps/nsScriptSecurityManager.cpp
+@@ -840,7 +840,7 @@ nsScriptSecurityManager::CheckLoadURIFlags(nsIURI *aSourceURI,
+
+ // Check for chrome target URI
+ bool hasFlags = false;
+- rv = NS_URIChainHasFlags(aTargetBaseURI,
++ rv = NS_URIChainHasFlags(aTargetURI,
+ nsIProtocolHandler::URI_IS_UI_RESOURCE,
+ &hasFlags);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+commit 3c59d5240166
+Author: Gijs Kruitbosch <gijskruitbosch at gmail.com>
+Date: Tue Dec 12 10:53:50 2017 -0600
+
+ Bug 1424261, r=valentin
+
+ --HG--
+ extra : rebase_source : 9f4c9c619dbccc2575b2a9d3e4304a54d41acad5
+---
+ image/decoders/icon/nsIconURI.cpp | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git image/decoders/icon/nsIconURI.cpp image/decoders/icon/nsIconURI.cpp
+index 5958bd9d1436..5f096674bd35 100644
+--- image/decoders/icon/nsIconURI.cpp
++++ image/decoders/icon/nsIconURI.cpp
+@@ -218,7 +218,10 @@ nsMozIconURI::SetSpec(const nsACString& aSpec)
+
+ nsAutoCString iconSpec(aSpec);
+ if (!Substring(iconSpec, 0,
+- MOZICON_SCHEME_LEN).EqualsLiteral(MOZICON_SCHEME)) {
++ MOZICON_SCHEME_LEN).EqualsLiteral(MOZICON_SCHEME) ||
++ (!Substring(iconSpec, MOZICON_SCHEME_LEN, 7).EqualsLiteral("file://") &&
++ // Checking for the leading '//' will match both the '//stock/' and '//.foo' cases:
++ !Substring(iconSpec, MOZICON_SCHEME_LEN, 2).EqualsLiteral("//"))) {
+ return NS_ERROR_MALFORMED_URI;
+ }
+
+@@ -298,6 +301,11 @@ nsMozIconURI::SetSpec(const nsACString& aSpec)
+ ioService->NewURI(iconPath, nullptr, nullptr, getter_AddRefs(uri));
+ mIconURL = do_QueryInterface(uri);
+ if (mIconURL) {
++ // The inner URI should be a 'file:' one. If not, bail.
++ bool isFile = false;
++ if (!NS_SUCCEEDED(mIconURL->SchemeIs("file", &isFile)) || !isFile) {
++ return NS_ERROR_MALFORMED_URI;
++ }
+ mFileName.Truncate();
+ } else if (mFileName.IsEmpty()) {
+ return NS_ERROR_MALFORMED_URI;
Modified: branches/2018Q1/www/waterfox/files/patch-bug1425780
==============================================================================
--- branches/2018Q1/www/waterfox/files/patch-bug1425780 Fri Mar 16 13:25:30 2018 (r464684)
+++ branches/2018Q1/www/waterfox/files/patch-bug1425780 Fri Mar 16 13:26:43 2018 (r464685)
@@ -1,4 +1,4 @@
-commit e5fb39219394 (release/branches/default/tip, origin/release)
+commit e5fb39219394
Author: Michael Froman <mfroman at mozilla.com>
Date: Thu Jan 11 21:38:36 2018 -0500
Copied: branches/2018Q1/www/waterfox/files/patch-bug1426002 (from r464679, head/www/waterfox/files/patch-bug1426002)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1426002 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1426002)
@@ -0,0 +1,34 @@
+commit 7ee28da3b920
+Author: Boris Zbarsky <bzbarsky at mit.edu>
+Date: Thu Dec 21 15:08:49 2017 -0500
+
+ Bug 1426002. Bail out of document.open if beforeunload tears things down. r=mystor
+
+ MozReview-Commit-ID: GDozCq4Qbni
+---
+ dom/html/nsHTMLDocument.cpp | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git dom/html/nsHTMLDocument.cpp dom/html/nsHTMLDocument.cpp
+index 5ad609c0802b..ce974748034f 100644
+--- dom/html/nsHTMLDocument.cpp
++++ dom/html/nsHTMLDocument.cpp
+@@ -1598,6 +1598,18 @@ nsHTMLDocument::Open(JSContext* cx,
+ nsCOMPtr<nsIDocument> ret = this;
+ return ret.forget();
+ }
++
++ // Now double-check that our invariants still hold.
++ if (!mScriptGlobalObject) {
++ nsCOMPtr<nsIDocument> ret = this;
++ return ret.forget();
++ }
++
++ nsPIDOMWindowOuter* outer = GetWindow();
++ if (!outer || (GetInnerWindow() != outer->GetCurrentInnerWindow())) {
++ nsCOMPtr<nsIDocument> ret = this;
++ return ret.forget();
++ }
+ }
+
+ nsCOMPtr<nsIWebNavigation> webnav(do_QueryInterface(shell));
Copied: branches/2018Q1/www/waterfox/files/patch-bug1430511 (from r464679, head/www/waterfox/files/patch-bug1430511)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1430511 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1430511)
@@ -0,0 +1,72 @@
+commit 2050bcb92e39
+Author: Gijs Kruitbosch <gijskruitbosch at gmail.com>
+Date: Wed Jan 17 00:08:32 2018 +0000
+
+ Bug 1430511, r=jaws
+
+ --HG--
+ extra : rebase_source : e5ecfb98c1bbd1cd5f9a71be13416a1d041350ef
+---
+ browser/components/preferences/in-content/findInPage.js | 16 +++++++++++++---
+ .../chrome/browser/preferences/preferences.properties | 8 +++++---
+ 2 files changed, 18 insertions(+), 6 deletions(-)
+
+diff --git browser/base/content/test/static/browser_misused_characters_in_strings.js browser/base/content/test/static/browser_misused_characters_in_strings.js
+index 9a8168bdb360..10b6796d3580 100644
+--- browser/base/content/test/static/browser_misused_characters_in_strings.js
++++ browser/base/content/test/static/browser_misused_characters_in_strings.js
+@@ -110,7 +110,7 @@ let gWhitelist = [{
+ type: "single-quote"
+ }, {
+ file: "preferences.properties",
+- key: "searchResults.needHelp2",
++ key: "searchResults.needHelp3",
+ type: "double-quote"
+ }
+ ];
+diff --git browser/components/preferences/in-content-new/findInPage.js browser/components/preferences/in-content-new/findInPage.js
+index a822ec04e728..d54ba7b0e355 100644
+--- browser/components/preferences/in-content-new/findInPage.js
++++ browser/components/preferences/in-content-new/findInPage.js
+@@ -264,9 +264,19 @@ var gSearchResultsPane = {
+ strings.getFormattedString("searchResults.sorryMessageUnix", [this.query]);
+ let helpUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "preferences";
+ let brandName = document.getElementById("bundleBrand").getString("brandShortName");
+- // eslint-disable-next-line no-unsanitized/property
+- document.getElementById("need-help").innerHTML =
+- strings.getFormattedString("searchResults.needHelp2", [helpUrl, brandName]);
++ let helpString = strings.getString("searchResults.needHelp3");
++ let helpItems = helpString.split(/%(?:\$1)?S/);
++ let helpContainer = document.getElementById("need-help");
++ helpContainer.innerHTML = "";
++ helpContainer.appendChild(document.createTextNode(helpItems[0]));
++ let link = document.createElement("label");
++ link.className = "text-link";
++ link.setAttribute("href", helpUrl);
++ link.textContent = strings.getFormattedString("searchResults.needHelpSupportLink", [brandName]);
++ helpContainer.appendChild(link);
++ if (helpItems[1]) {
++ helpContainer.appendChild(document.createTextNode(helpItems[1]));
++ }
+ } else {
+ // Creating tooltips for all the instances found
+ this.listSearchTooltips.forEach((anchorNode) => this.createSearchTooltip(anchorNode, this.query));
+diff --git browser/locales/en-US/chrome/browser/preferences/preferences.properties browser/locales/en-US/chrome/browser/preferences/preferences.properties
+index 9066145c3c48..73410a196ebf 100644
+--- browser/locales/en-US/chrome/browser/preferences/preferences.properties
++++ browser/locales/en-US/chrome/browser/preferences/preferences.properties
+@@ -263,9 +263,11 @@ searchInput.labelUnix=Find in Preferences
+ # LOCALIZATION NOTE %S will be replaced by the word being searched
+ searchResults.sorryMessageWin=Sorry! There are no results in Options for “%S”.
+ searchResults.sorryMessageUnix=Sorry! There are no results in Preferences for “%S”.
+-# LOCALIZATION NOTE (searchResults.needHelp2): %1$S is a link to SUMO, %2$S is
+-# the browser name
+-searchResults.needHelp2=Need help? Visit <html:a id="need-help-link" target="_blank" href="%1$S">%2$S Support</html:a>
++# LOCALIZATION NOTE (searchResults.needHelp3): %S will be replaced with a link to the support page.
++# The label of the link is in searchResults.needHelpSupportLink .
++searchResults.needHelp3=Need help? Visit %S
++# LOCALIZATION NOTE (searchResults.needHelpSupportLink): %S will be replaced with the browser name.
++searchResults.needHelpSupportLink=%S Support
+
+ # LOCALIZATION NOTE %S is the default value of the `dom.ipc.processCount` pref.
+ defaultContentProcessCount=%S (default)
Copied: branches/2018Q1/www/waterfox/files/patch-bug1438425 (from r464679, head/www/waterfox/files/patch-bug1438425)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/2018Q1/www/waterfox/files/patch-bug1438425 Fri Mar 16 13:26:43 2018 (r464685, copy of r464679, head/www/waterfox/files/patch-bug1438425)
@@ -0,0 +1,662 @@
+commit f324bee78e24
+Author: Jeff Muizelaar <jmuizelaar at mozilla.com>
+Date: Wed Mar 7 11:54:01 2018 -0500
+
+ Bug 1438425 - Delete DocumentRenderer. r=jesup, r=jgilbert, a=RyanVM
+
+ It is unused.
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-ports-all
mailing list