Date: Fri, 16 Mar 2018 13:26:43 +0000 (UTC) From: Jan Beich <jbeich@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-branches@freebsd.org Subject: svn commit: r464685 - in branches/2018Q1/www/waterfox: . files Message-ID: <201803161326.w2GDQhCr009154@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@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@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@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@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@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@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@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@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@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@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@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@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@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 ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201803161326.w2GDQhCr009154>