Merge remote-tracking branch 'origin/master' into custom

This commit is contained in:
Roy Tam 2020-03-20 09:12:43 +08:00
commit cf086d4da7
27 changed files with 321 additions and 384 deletions

View file

@ -83,6 +83,9 @@ tools repackage:: $(DIST)/bin/$(MOZ_APP_NAME)
sed -e 's/%MAC_APP_NAME%/$(MAC_APP_NAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > '$(dist_dest)/$(LPROJ)/InfoPlist.strings'
rsync -a --exclude-from='$(srcdir)/macbuild/Contents/MacOS-files.in' $(DIST)/bin/ '$(dist_dest)/Contents/Resources'
rsync -a --include-from='$(srcdir)/macbuild/Contents/MacOS-files.in' --exclude '*' $(DIST)/bin/ '$(dist_dest)/Contents/MacOS'
# MacOS-files-copy.in is a list of files that should be copies rather
# than symlinks and placed in .app/Contents/MacOS.
rsync -aL --include-from='$(srcdir)/macbuild/Contents/MacOS-files-copy.in' --exclude '*' $(DIST)/bin/ '$(dist_dest)/Contents/MacOS'
$(RM) '$(dist_dest)/Contents/MacOS/$(MOZ_APP_NAME)'
rsync -aL $(DIST)/bin/$(MOZ_APP_NAME) '$(dist_dest)/Contents/MacOS'
cp -RL $(DIST)/branding/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'

View file

@ -0,0 +1,11 @@
# Specifies files that should be copied (via deep copy, resolving symlinks)
# from dist/bin to the .app/Contents/MacOS directory. Linking is preferred to
# reduce disk I/O during builds, so just include dylibs which need to be in the
# same directory as returned by dladdr(3).
#
# Some of these dylibs load other dylibs which are assumed to be siblings in
# the same directory obtained from dladdr(3). With macOS 10.15, dladdr returns
# absolute resolved paths which breaks this assumption if symlinks are used
# because the symlink targets are in different directories. Hence the need for
# them to be copied to the same directory.
/*.dylib

View file

@ -1,5 +1,4 @@
/*.app/***
/*.dylib
/certutil
/firefox-bin
/gtest/***

View file

@ -9,38 +9,30 @@
#define GK_SLICE Gecko/20100101
#define FX_SLICE Firefox/@GK_VERSION@
#ifdef XP_UNIX
#ifndef XP_MACOSX
#define OS_SLICE X11; Linux x86_64;
#else
#define OS_SLICE Macintosh; Intel Mac OS X 10.11;
#endif
#else
#define OS_SLICE Windows NT 6.1; WOW64;
#endif
// %OS_SLICE% macro is resolved at runtime, see MoonchildProductions/UXP#1473
// Mozilla overrides
pref("@GUAO_PREF@.accounts.firefox.com", "Mozilla/5.0 (@OS_SLICE@ rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
pref("@GUAO_PREF@.addons.mozilla.org", "Mozilla/5.0 (@OS_SLICE@ rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
pref("@GUAO_PREF@.accounts.firefox.com", "Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
pref("@GUAO_PREF@.addons.mozilla.org", "Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
// Required for domains that have proven unresponsive to requests from users
pref("@GUAO_PREF@.youtube.com","Mozilla/5.0 (@OS_SLICE@ rv:62.0) @GK_SLICE@ Firefox/62.0 @APP_SLICE@");
pref("@GUAO_PREF@.gaming.youtube.com","Mozilla/5.0 (@OS_SLICE@ rv:62.0) @GK_SLICE@ Firefox/62.0");
pref("@GUAO_PREF@.netflix.com","Mozilla/5.0 (@OS_SLICE@ rv:42.0) @GK_SLICE@ Firefox/42.0 @APP_SLICE@");
pref("@GUAO_PREF@.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:62.0) @GK_SLICE@ Firefox/62.0 @APP_SLICE@");
pref("@GUAO_PREF@.gaming.youtube.com","Mozilla/5.0 (%OS_SLICE% rv:62.0) @GK_SLICE@ Firefox/62.0");
pref("@GUAO_PREF@.netflix.com","Mozilla/5.0 (%OS_SLICE% rv:42.0) @GK_SLICE@ Firefox/42.0 @APP_SLICE@");
// The never-ending Facebook debacle...
// UA-Sniffing domains below are pending responses from their operators - temp workaround
// Daily motion only likes strict Firefox UAs
pref("@GUAO_PREF@.dailymotion.com","Mozilla/5.0 (@OS_SLICE@ rv:52.0) @GK_SLICE@ Firefox/52.0");
pref("@GUAO_PREF@.dailymotion.com","Mozilla/5.0 (%OS_SLICE% rv:52.0) @GK_SLICE@ Firefox/52.0");
// The following requires native mode. Or it blocks.. "too old firefox", breakage, etc.
// UA-Sniffing domains below have indicated no interest in supporting Pale Moon (BOO!)
pref("@GUAO_PREF@.whatsapp.com","Mozilla/5.0 (@OS_SLICE@ rv:68.0) @GK_SLICE@ Firefox/68.0");
pref("@GUAO_PREF@.whatsapp.com","Mozilla/5.0 (%OS_SLICE% rv:68.0) @GK_SLICE@ Firefox/68.0");
// UA-sniffing domains that are "app/vendor-specific" and do not like Pale Moon
// The following domains do not like the Goanna slice
pref("@GUAO_PREF@.hitbox.tv","Mozilla/5.0 (@OS_SLICE@ rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
pref("@GUAO_PREF@.yuku.com","Mozilla/5.0 (@OS_SLICE@ rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ @APP_SLICE@");
pref("@GUAO_PREF@.hitbox.tv","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@");
pref("@GUAO_PREF@.yuku.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ @APP_SLICE@");

View file

@ -88,6 +88,9 @@ tools repackage:: $(PROGRAM)
sed -e 's/%MAC_APP_NAME%/$(MAC_APP_NAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > '$(dist_dest)/Contents/Resources/$(AB).lproj/InfoPlist.strings'
rsync -a --exclude-from='$(srcdir)/macbuild/Contents/MacOS-files.in' $(DIST)/bin/ '$(dist_dest)/Contents/Resources'
rsync -a --include-from='$(srcdir)/macbuild/Contents/MacOS-files.in' --exclude '*' $(DIST)/bin/ '$(dist_dest)/Contents/MacOS'
# MacOS-files-copy.in is a list of files that should be copies rather
# than symlinks and placed in .app/Contents/MacOS.
rsync -aL --include-from='$(srcdir)/macbuild/Contents/MacOS-files-copy.in' --exclude '*' $(DIST)/bin/ '$(dist_dest)/Contents/MacOS'
$(RM) '$(dist_dest)/Contents/MacOS/$(PROGRAM)'
rsync -aL $(PROGRAM) '$(dist_dest)/Contents/MacOS'
cp -RL $(DIST)/branding/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'

View file

@ -0,0 +1,11 @@
# Specifies files that should be copied (via deep copy, resolving symlinks)
# from dist/bin to the .app/Contents/MacOS directory. Linking is preferred to
# reduce disk I/O during builds, so just include dylibs which need to be in the
# same directory as returned by dladdr(3).
#
# Some of these dylibs load other dylibs which are assumed to be siblings in
# the same directory obtained from dladdr(3). With macOS 10.15, dladdr returns
# absolute resolved paths which breaks this assumption if symlinks are used
# because the symlink targets are in different directories. Hence the need for
# them to be copied to the same directory.
/*.dylib

View file

@ -1,5 +1,4 @@
/*.app/***
/*.dylib
/certutil
/firefox-bin
/gtest/***

View file

@ -58,9 +58,21 @@ const Curl = {
* A cURL command.
*/
generateCommand: function (data) {
let utils = CurlUtils;
const utils = CurlUtils;
let command = ["curl"];
// Make sure to use the following helpers to sanitize arguments before execution.
const addParam = value => {
const safe = /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value);
command.push(safe);
};
const addPostData = value => {
const safe = /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value);
postData.push(safe);
};
let ignoredHeaders = new Set();
// The cURL command is expected to run on the same platform that Firefox runs
@ -69,7 +81,7 @@ const Curl = {
utils.escapeStringWin : utils.escapeStringPosix;
// Add URL.
command.push(escapeString(data.url));
addParam(data.url);
let postDataText = null;
let multipartRequest = utils.isMultipartRequest(data);
@ -79,15 +91,15 @@ const Curl = {
if (utils.isUrlEncodedRequest(data) ||
["PUT", "POST", "PATCH"].includes(data.method)) {
postDataText = data.postDataText;
postData.push("--data");
postData.push(escapeString(utils.writePostDataTextParams(postDataText)));
addPostData("--data");
addPostData(utils.writePostDataTextParams(postDataText));
ignoredHeaders.add("content-length");
} else if (multipartRequest) {
postDataText = data.postDataText;
postData.push("--data-binary");
addPostData("--data-binary");
let boundary = utils.getMultipartBoundary(data);
let text = utils.removeBinaryDataFromMultipartText(postDataText, boundary);
postData.push(escapeString(text));
addPostData(text);
ignoredHeaders.add("content-length");
}
@ -95,15 +107,15 @@ const Curl = {
// For GET and POST requests this is not necessary as GET is the
// default. If --data or --binary is added POST is the default.
if (!(data.method == "GET" || data.method == "POST")) {
command.push("-X");
command.push(data.method);
addParam("-X");
addParam(data.method);
}
// Add -I (HEAD)
// For servers that supports HEAD.
// This will fetch the header of a document only.
if (data.method == "HEAD") {
command.push("-I");
addParam("-I");
}
// Add http version.
@ -114,7 +126,7 @@ const Curl = {
// data.httpVersion are HTTP/1.0, HTTP/1.1 and HTTP/2.0
// So in case of HTTP/2.0 (which should ideally be HTTP/2) we are using
// only major version, and full version in other cases
command.push("--http" + (version == "2.0" ? version.split(".")[0] : version));
addParam("--http" + (version == "2.0" ? version.split(".")[0] : version));
}
// Add request headers.
@ -126,14 +138,14 @@ const Curl = {
for (let i = 0; i < headers.length; i++) {
let header = headers[i];
if (header.name.toLowerCase() === "accept-encoding") {
command.push("--compressed");
addParam("--compressed");
continue;
}
if (ignoredHeaders.has(header.name.toLowerCase())) {
continue;
}
command.push("-H");
command.push(escapeString(header.name + ": " + header.value));
addParam("-H");
addParam(header.name + ": " + header.value);
}
// Add post data.

View file

@ -1261,6 +1261,15 @@ nsFocusManager::SetFocusInner(nsIContent* aNewContent, int32_t aFlags,
isElementInActiveWindow = (mActiveWindow && newRootWindow == mActiveWindow);
}
// Exit fullscreen if a website focuses another window
if (!isElementInActiveWindow && aFlags & FLAG_RAISE) {
if (nsIDocument* doc = mActiveWindow ? mActiveWindow->GetDoc() : nullptr) {
if (doc && doc->GetFullscreenElement()) {
nsIDocument::AsyncExitFullscreen(doc);
}
}
}
// Exit fullscreen if we're focusing a windowed plugin on a non-MacOSX
// system. We don't control event dispatch to windowed plugins on non-MacOSX,
// so we can't display the "Press ESC to leave fullscreen mode" warning on

View file

@ -1297,6 +1297,12 @@ nsWindowWatcher::OpenWindowInternal(mozIDOMWindowProxy* aParent,
}
}
// If a website opens a popup exit DOM fullscreen
if (windowIsNew && aCalledFromJS && !hasChromeParent && !isCallerChrome &&
parentWindow) {
nsIDocument::AsyncExitFullscreen(parentWindow->GetDoc());
}
if (aForceNoOpener && windowIsNew) {
NS_RELEASE(*aResult);
}

View file

@ -1497,14 +1497,6 @@ OptimizeMIR(MIRGenerator* mir)
if (mir->shouldCancel("Start"))
return false;
if (!mir->compilingWasm()) {
if (!MakeMRegExpHoistable(mir, graph))
return false;
if (mir->shouldCancel("Make MRegExp Hoistable"))
return false;
}
gs.spewPass("BuildSSA");
AssertBasicGraphCoherency(graph);

View file

@ -1975,274 +1975,6 @@ jit::ApplyTypeInformation(MIRGenerator* mir, MIRGraph& graph)
return true;
}
// Check if `def` is only the N-th operand of `useDef`.
static inline size_t
IsExclusiveNthOperand(MDefinition* useDef, size_t n, MDefinition* def)
{
uint32_t num = useDef->numOperands();
if (n >= num || useDef->getOperand(n) != def)
return false;
for (uint32_t i = 0; i < num; i++) {
if (i == n)
continue;
if (useDef->getOperand(i) == def)
return false;
}
return true;
}
static size_t
IsExclusiveThisArg(MCall* call, MDefinition* def)
{
return IsExclusiveNthOperand(call, MCall::IndexOfThis(), def);
}
static size_t
IsExclusiveFirstArg(MCall* call, MDefinition* def)
{
return IsExclusiveNthOperand(call, MCall::IndexOfArgument(0), def);
}
static bool
IsRegExpHoistableCall(MCall* call, MDefinition* def)
{
if (call->isConstructing())
return false;
JSAtom* name;
if (WrappedFunction* fun = call->getSingleTarget()) {
if (!fun->isSelfHostedBuiltin())
return false;
name = GetSelfHostedFunctionName(fun->rawJSFunction());
} else {
MDefinition* funDef = call->getFunction();
if (funDef->isDebugCheckSelfHosted())
funDef = funDef->toDebugCheckSelfHosted()->input();
if (funDef->isTypeBarrier())
funDef = funDef->toTypeBarrier()->input();
if (!funDef->isCallGetIntrinsicValue())
return false;
name = funDef->toCallGetIntrinsicValue()->name();
}
// Hoistable only if the RegExp is the first argument of RegExpBuiltinExec.
CompileRuntime* runtime = GetJitContext()->runtime;
if (name == runtime->names().RegExpBuiltinExec ||
name == runtime->names().UnwrapAndCallRegExpBuiltinExec ||
name == runtime->names().RegExpMatcher ||
name == runtime->names().RegExpTester ||
name == runtime->names().RegExpSearcher)
{
return IsExclusiveFirstArg(call, def);
}
if (name == runtime->names().RegExp_prototype_Exec)
return IsExclusiveThisArg(call, def);
return false;
}
static bool
CanCompareRegExp(MCompare* compare, MDefinition* def)
{
MDefinition* value;
if (compare->lhs() == def) {
value = compare->rhs();
} else {
MOZ_ASSERT(compare->rhs() == def);
value = compare->lhs();
}
// Comparing two regexp that weren't cloned will give different result
// than if they were cloned.
if (value->mightBeType(MIRType::Object))
return false;
// Make sure @@toPrimitive is not called which could notice
// the difference between a not cloned/cloned regexp.
JSOp op = compare->jsop();
// Strict equality comparison won't invoke @@toPrimitive.
if (op == JSOP_STRICTEQ || op == JSOP_STRICTNE)
return true;
if (op != JSOP_EQ && op != JSOP_NE) {
// Relational comparison always invoke @@toPrimitive.
MOZ_ASSERT(op == JSOP_GT || op == JSOP_GE || op == JSOP_LT || op == JSOP_LE);
return false;
}
// Loose equality comparison can invoke @@toPrimitive.
if (value->mightBeType(MIRType::Boolean) || value->mightBeType(MIRType::String) ||
value->mightBeType(MIRType::Int32) ||
value->mightBeType(MIRType::Double) || value->mightBeType(MIRType::Float32) ||
value->mightBeType(MIRType::Symbol))
{
return false;
}
return true;
}
static inline void
SetNotInWorklist(MDefinitionVector& worklist)
{
for (size_t i = 0; i < worklist.length(); i++)
worklist[i]->setNotInWorklist();
}
static bool
IsRegExpHoistable(MIRGenerator* mir, MDefinition* regexp, MDefinitionVector& worklist,
bool* hoistable)
{
MOZ_ASSERT(worklist.length() == 0);
if (!worklist.append(regexp))
return false;
regexp->setInWorklist();
for (size_t i = 0; i < worklist.length(); i++) {
MDefinition* def = worklist[i];
if (mir->shouldCancel("IsRegExpHoistable outer loop"))
return false;
for (MUseIterator use = def->usesBegin(); use != def->usesEnd(); use++) {
if (mir->shouldCancel("IsRegExpHoistable inner loop"))
return false;
// Ignore resume points. At this point all uses are listed.
// No DCE or GVN or something has happened.
if (use->consumer()->isResumePoint())
continue;
MDefinition* useDef = use->consumer()->toDefinition();
// Step through a few white-listed ops.
if (useDef->isPhi() || useDef->isFilterTypeSet() || useDef->isGuardShape()) {
if (useDef->isInWorklist())
continue;
if (!worklist.append(useDef))
return false;
useDef->setInWorklist();
continue;
}
// Instructions that doesn't invoke unknown code that may modify
// RegExp instance or pass it to elsewhere.
if (useDef->isRegExpMatcher() || useDef->isRegExpTester() ||
useDef->isRegExpSearcher())
{
if (IsExclusiveNthOperand(useDef, 0, def))
continue;
} else if (useDef->isLoadFixedSlot() || useDef->isTypeOf()) {
continue;
} else if (useDef->isCompare()) {
if (CanCompareRegExp(useDef->toCompare(), def))
continue;
}
// Instructions that modifies `lastIndex` property.
else if (useDef->isStoreFixedSlot()) {
if (IsExclusiveNthOperand(useDef, 0, def)) {
MStoreFixedSlot* store = useDef->toStoreFixedSlot();
if (store->slot() == RegExpObject::lastIndexSlot())
continue;
}
} else if (useDef->isSetPropertyCache()) {
if (IsExclusiveNthOperand(useDef, 0, def)) {
MSetPropertyCache* setProp = useDef->toSetPropertyCache();
if (setProp->idval()->isConstant()) {
Value propIdVal = setProp->idval()->toConstant()->toJSValue();
if (propIdVal.isString()) {
CompileRuntime* runtime = GetJitContext()->runtime;
if (propIdVal.toString() == runtime->names().lastIndex)
continue;
}
}
}
}
// MCall is safe only for some known safe functions.
else if (useDef->isCall()) {
if (IsRegExpHoistableCall(useDef->toCall(), def))
continue;
}
// Everything else is unsafe.
SetNotInWorklist(worklist);
worklist.clear();
*hoistable = false;
return true;
}
}
SetNotInWorklist(worklist);
worklist.clear();
*hoistable = true;
return true;
}
bool
jit::MakeMRegExpHoistable(MIRGenerator* mir, MIRGraph& graph)
{
// If we are compiling try blocks, regular expressions may be observable
// from catch blocks (which Ion does not compile). For now just disable the
// pass in this case.
if (graph.hasTryBlock())
return true;
MDefinitionVector worklist(graph.alloc());
for (ReversePostorderIterator block(graph.rpoBegin()); block != graph.rpoEnd(); block++) {
if (mir->shouldCancel("MakeMRegExpHoistable outer loop"))
return false;
for (MDefinitionIterator iter(*block); iter; iter++) {
if (!*iter)
MOZ_CRASH("confirm bug 1263794.");
if (mir->shouldCancel("MakeMRegExpHoistable inner loop"))
return false;
if (!iter->isRegExp())
continue;
MRegExp* regexp = iter->toRegExp();
bool hoistable = false;
if (!IsRegExpHoistable(mir, regexp, worklist, &hoistable))
return false;
if (!hoistable)
continue;
// Make MRegExp hoistable
regexp->setMovable();
regexp->setDoNotClone();
// That would be incorrect for global/sticky, because lastIndex
// could be wrong. Therefore setting the lastIndex to 0. That is
// faster than a not movable regexp.
RegExpObject* source = regexp->source();
if (source->sticky() || source->global()) {
if (!graph.alloc().ensureBallast())
return false;
MConstant* zero = MConstant::New(graph.alloc(), Int32Value(0));
regexp->block()->insertAfter(regexp, zero);
MStoreFixedSlot* lastIndex =
MStoreFixedSlot::New(graph.alloc(), regexp, RegExpObject::lastIndexSlot(), zero);
regexp->block()->insertAfter(zero, lastIndex);
}
}
}
return true;
}
void
jit::RenumberBlocks(MIRGraph& graph)
{

View file

@ -56,9 +56,6 @@ EliminateDeadCode(MIRGenerator* mir, MIRGraph& graph);
MOZ_MUST_USE bool
ApplyTypeInformation(MIRGenerator* mir, MIRGraph& graph);
MOZ_MUST_USE bool
MakeMRegExpHoistable(MIRGenerator* mir, MIRGraph& graph);
void
RenumberBlocks(MIRGraph& graph);

View file

@ -2297,14 +2297,9 @@ LIRGenerator::visitToObjectOrNull(MToObjectOrNull* ins)
void
LIRGenerator::visitRegExp(MRegExp* ins)
{
if (ins->mustClone()) {
LRegExp* lir = new(alloc()) LRegExp();
defineReturn(lir, ins);
assignSafepoint(lir, ins);
} else {
RegExpObject* source = ins->source();
define(new(alloc()) LPointer(source), ins);
}
LRegExp* lir = new(alloc()) LRegExp();
defineReturn(lir, ins);
assignSafepoint(lir, ins);
}
void

View file

@ -8102,11 +8102,9 @@ class MDefFun
class MRegExp : public MNullaryInstruction
{
CompilerGCPointer<RegExpObject*> source_;
bool mustClone_;
MRegExp(CompilerConstraintList* constraints, RegExpObject* source)
: source_(source),
mustClone_(true)
: source_(source)
{
setResultType(MIRType::Object);
setResultTypeSet(MakeSingletonTypeSet(constraints, source));
@ -8116,12 +8114,6 @@ class MRegExp : public MNullaryInstruction
INSTRUCTION_HEADER(RegExp)
TRIVIAL_NEW_WRAPPERS
void setDoNotClone() {
mustClone_ = false;
}
bool mustClone() const {
return mustClone_;
}
RegExpObject* source() const {
return source_;
}

View file

@ -281,13 +281,8 @@
macro(proxy, proxy, "proxy") \
macro(raw, raw, "raw") \
macro(reason, reason, "reason") \
macro(RegExpBuiltinExec, RegExpBuiltinExec, "RegExpBuiltinExec") \
macro(RegExpFlagsGetter, RegExpFlagsGetter, "RegExpFlagsGetter") \
macro(RegExpMatcher, RegExpMatcher, "RegExpMatcher") \
macro(RegExpSearcher, RegExpSearcher, "RegExpSearcher") \
macro(RegExpStringIterator, RegExpStringIterator, "RegExp String Iterator") \
macro(RegExpTester, RegExpTester, "RegExpTester") \
macro(RegExp_prototype_Exec, RegExp_prototype_Exec, "RegExp_prototype_Exec") \
macro(Reify, Reify, "Reify") \
macro(reject, reject, "reject") \
macro(rejected, rejected, "rejected") \
@ -360,7 +355,6 @@
macro(uninitialized, uninitialized, "uninitialized") \
macro(unsized, unsized, "unsized") \
macro(unwatch, unwatch, "unwatch") \
macro(UnwrapAndCallRegExpBuiltinExec, UnwrapAndCallRegExpBuiltinExec, "UnwrapAndCallRegExpBuiltinExec") \
macro(url, url, "url") \
macro(usage, usage, "usage") \
macro(useAsm, useAsm, "use asm") \

View file

@ -4822,14 +4822,14 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
: ri->ComputedMaxISize();
}
Maybe<nsTArray<TrackSize>> origSizes;
bool applyMinMax = (minSize != 0 || maxSize != NS_UNCONSTRAINEDSIZE) &&
aAvailableSize == NS_UNCONSTRAINEDSIZE;
// We iterate twice at most. The 2nd time if the grid size changed after
// applying a min/max-size (can only occur if aAvailableSize is indefinite).
while (true) {
float fr = FindUsedFlexFraction(aState, aGridItems, flexTracks,
aFunctions, aAvailableSize);
if (fr != 0.0f) {
bool applyMinMax = (minSize != 0 || maxSize != NS_UNCONSTRAINEDSIZE) &&
aAvailableSize == NS_UNCONSTRAINEDSIZE;
for (uint32_t i : flexTracks) {
float flexFactor = aFunctions.MaxSizingFor(i).GetFlexFractionValue();
nscoord flexLength = NSToCoordRound(flexFactor * fr);
@ -4841,36 +4841,36 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
base = flexLength;
}
}
if (applyMinMax && origSizes.isSome()) {
// https://drafts.csswg.org/css-grid/#algo-flex-tracks
// "If using this flex fraction would cause the grid to be smaller than
// the grid containers min-width/height (or larger than the grid
// containers max-width/height), then redo this step, treating the free
// space as definite [...]"
nscoord newSize = 0;
for (auto& sz : mSizes) {
newSize += sz.mBase;
}
const auto sumOfGridGaps = SumOfGridGaps();
newSize += sumOfGridGaps;
if (newSize > maxSize) {
aAvailableSize = maxSize;
} else if (newSize < minSize) {
aAvailableSize = minSize;
}
if (aAvailableSize != NS_UNCONSTRAINEDSIZE) {
// Reset min/max-size to ensure 'applyMinMax' becomes false next time.
minSize = 0;
maxSize = NS_UNCONSTRAINEDSIZE;
aAvailableSize = std::max(0, aAvailableSize - sumOfGridGaps);
// Restart with the original track sizes and definite aAvailableSize.
}
if (applyMinMax) {
applyMinMax = false;
// https://drafts.csswg.org/css-grid/#algo-flex-tracks
// "If using this flex fraction would cause the grid to be smaller than
// the grid containers min-width/height (or larger than the grid
// containers max-width/height), then redo this step, treating the free
// space as definite [...]"
nscoord newSize = 0;
for (auto& sz : mSizes) {
newSize += sz.mBase;
}
const auto sumOfGridGaps = SumOfGridGaps();
newSize += sumOfGridGaps;
if (newSize > maxSize) {
aAvailableSize = maxSize;
} else if (newSize < minSize) {
aAvailableSize = minSize;
}
if (aAvailableSize != NS_UNCONSTRAINEDSIZE) {
aAvailableSize = std::max(0, aAvailableSize - sumOfGridGaps);
// Restart with the original track sizes and definite aAvailableSize.
if (origSizes.isSome()) {
mSizes = Move(*origSizes);
origSizes.reset();
if (aAvailableSize == 0) {
break; // zero available size wouldn't change any sizes though...
}
continue;
} // else, no mSizes[].mBase were changed above so it's still correct
if (aAvailableSize == 0) {
break; // zero available size wouldn't change any sizes though...
}
continue;
}
}
break;

View file

@ -107,4 +107,28 @@
<div class="item"></div>
</div>
<pre>The first 6 grids should look the same:</pre>
<div class="grid rows" style="grid: 1fr / 30px; height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; height:83px">
<div class="item" style="grid-row:span 2"></div>
</div>
<div class="grid rows" style="grid: 1fr / 30px; height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr auto / 30px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; grid-row-gap:10px; height:83px">
<div class="item" style="grid-row:span 2"><div style="height:40px"></div></div>
<div class="item"><div style="height:40px"></div></div>
</div>
</body></html>

View file

@ -105,4 +105,28 @@
<div class="item"></div>
</div>
<pre>The first 6 grids should look the same:</pre>
<div class="grid rows" style="grid: 1fr / 30px; min-height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; min-height:83px">
<div class="item" style="grid-row:span 2"></div>
</div>
<div class="grid rows" style="grid: 1fr / 30px; max-height:30px; min-height:83px">
<div class="item"></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr auto / 30px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 10px 1fr / 30px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:90px"></div></div>
</div>
<div class="grid rows" style="grid: 1fr 1fr / 30px; grid-row-gap:10px; max-height:83px">
<div class="item" style="grid-row:span 2"><div style="height:40px"></div></div>
<div class="item"><div style="height:40px"></div></div>
</div>
</body></html>

View file

@ -1268,6 +1268,74 @@ PaintRowGroupBackgroundByColIdx(nsTableRowGroupFrame* aRowGroup,
}
}
static inline bool FrameHasBorder(nsIFrame* f)
{
if (!f->StyleVisibility()->IsVisible()) {
return false;
}
if (f->StyleBorder()->HasBorder()) {
return true;
}
return false;
}
void nsTableFrame::CalcHasBCBorders()
{
if (!IsBorderCollapse()) {
SetHasBCBorders(false);
return;
}
if (FrameHasBorder(this)) {
SetHasBCBorders(true);
return;
}
// Check col and col group has borders.
for (nsIFrame* f : this->GetChildList(kColGroupList)) {
if (FrameHasBorder(f)) {
SetHasBCBorders(true);
return;
}
nsTableColGroupFrame *colGroup = static_cast<nsTableColGroupFrame*>(f);
for (nsTableColFrame* col = colGroup->GetFirstColumn(); col; col = col->GetNextCol()) {
if (FrameHasBorder(col)) {
SetHasBCBorders(true);
return;
}
}
}
// check row group, row and cell has borders.
RowGroupArray rowGroups;
OrderRowGroups(rowGroups);
for (nsTableRowGroupFrame* rowGroup : rowGroups) {
if (FrameHasBorder(rowGroup)) {
SetHasBCBorders(true);
return;
}
for (nsTableRowFrame* row = rowGroup->GetFirstRow(); row; row = row->GetNextRow()) {
if (FrameHasBorder(row)) {
SetHasBCBorders(true);
return;
}
for (nsTableCellFrame* cell = row->GetFirstCell(); cell; cell = cell->GetNextCell()) {
if (FrameHasBorder(cell)) {
SetHasBCBorders(true);
return;
}
}
}
}
SetHasBCBorders(false);
}
/* static */ void
nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
nsFrame* aFrame,
@ -1375,11 +1443,16 @@ nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
nsTableFrame* table = static_cast<nsTableFrame*>(aFrame);
// In the collapsed border model, overlay all collapsed borders.
if (table->IsBorderCollapse()) {
aLists.BorderBackground()->AppendNewToTop(
new (aBuilder) nsDisplayTableBorderCollapse(aBuilder, table));
if (table->HasBCBorders()) {
aLists.BorderBackground()->AppendNewToTop(
new (aBuilder) nsDisplayTableBorderCollapse(aBuilder, table));
}
} else {
aLists.BorderBackground()->AppendNewToTop(
new (aBuilder) nsDisplayBorder(aBuilder, table));
const nsStyleBorder* borderStyle = aFrame->StyleBorder();
if (borderStyle->HasBorder()) {
aLists.BorderBackground()->AppendNewToTop(
new (aBuilder) nsDisplayBorder(aBuilder, table));
}
}
}
}
@ -4101,6 +4174,7 @@ nsTableFrame::AddBCDamageArea(const TableArea& aValue)
#endif
SetNeedToCalcBCBorders(true);
SetNeedToCalcHasBCBorders(true);
// Get the property
BCPropertyData* value = GetOrCreateBCProperty();
if (value) {
@ -4141,6 +4215,7 @@ nsTableFrame::SetFullBCDamageArea()
NS_ASSERTION(IsBorderCollapse(), "invalid SetFullBCDamageArea call");
SetNeedToCalcBCBorders(true);
SetNeedToCalcHasBCBorders(true);
BCPropertyData* value = GetOrCreateBCProperty();
if (value) {

View file

@ -761,6 +761,13 @@ public:
bool NeedToCollapse() const;
void SetNeedToCollapse(bool aValue);
bool NeedToCalcHasBCBorders() const;
void SetNeedToCalcHasBCBorders(bool aValue);
void CalcHasBCBorders();
bool HasBCBorders();
void SetHasBCBorders(bool aValue);
/** The GeometryDirty bit is similar to the NS_FRAME_IS_DIRTY frame
* state bit, which implies that all descendants are dirty. The
* GeometryDirty still implies that all the parts of the table are
@ -870,6 +877,8 @@ protected:
uint32_t mIStartContBCBorder:8;
uint32_t mNeedToCollapse:1; // rows, cols that have visibility:collapse need to be collapsed
uint32_t mResizedColumns:1; // have we resized columns since last reflow?
uint32_t mNeedToCalcHasBCBorders:1;
uint32_t mHasBCBorders:1;
} mBits;
nsTableCellMap* mCellMap; // maintains the relationships between rows, cols, and cells
@ -965,6 +974,30 @@ inline void nsTableFrame::SetNeedToCalcBCBorders(bool aValue)
mBits.mNeedToCalcBCBorders = (unsigned)aValue;
}
inline bool nsTableFrame::NeedToCalcHasBCBorders() const
{
return (bool)mBits.mNeedToCalcHasBCBorders;
}
inline void nsTableFrame::SetNeedToCalcHasBCBorders(bool aValue)
{
mBits.mNeedToCalcHasBCBorders = (unsigned)aValue;
}
inline bool nsTableFrame::HasBCBorders()
{
if (NeedToCalcHasBCBorders()) {
CalcHasBCBorders();
SetNeedToCalcHasBCBorders(false);
}
return (bool)mBits.mHasBCBorders;
}
inline void nsTableFrame::SetHasBCBorders(bool aValue)
{
mBits.mHasBCBorders = (unsigned)aValue;
}
inline nscoord
nsTableFrame::GetContinuousIStartBCBorderWidth() const
{

View file

@ -30,6 +30,7 @@ XPCOMUtils.defineLazyServiceGetter(this, "ppmm",
var gPrefBranch;
var gOverrides = new Map;
var gUpdatedOverrides;
var gOldDynOverrides;
var gOverrideForHostCache = new Map;
var gInitialized = false;
var gOverrideFunctions = [
@ -55,7 +56,10 @@ this.UserAgentOverrides = {
}
UserAgentUpdates.init(function(overrides) {
gOverrideForHostCache.clear();
if (overrides == gOldDynOverrides) {
return;
}
gOldDynOverrides = overrides;
if (overrides) {
for (let domain in overrides) {
overrides[domain] = getUserAgentFromOverride(overrides[domain]);
@ -63,6 +67,7 @@ this.UserAgentOverrides = {
overrides.get = function(key) { return this[key]; };
}
gUpdatedOverrides = overrides;
buildOverrides();
});
buildOverrides();
@ -159,15 +164,22 @@ function buildOverrides() {
if (!Services.prefs.getBoolPref(PREF_OVERRIDES_ENABLED))
return;
let builtUAs = new Map;
let domains = gPrefBranch.getChildList("");
// Since the static override map has the highest priority, we build it so
// that it includes only domains with user-set overrides and domains with
// default pre-set overrides that are not overridden by dynamic updates.
for (let domain of domains) {
let override = gPrefBranch.getCharPref(domain);
let userAgent = getUserAgentFromOverride(override);
if (!(gUpdatedOverrides && gUpdatedOverrides.get(domain)) ||
gPrefBranch.prefHasUserValue(domain)) {
// Here we selected domains that are not dynamically overridden
// or have a user-set override.
let override = gPrefBranch.getCharPref(domain);
let userAgent = getUserAgentFromOverride(override);
if (userAgent != DEFAULT_UA) {
gOverrides.set(domain, userAgent);
if (userAgent != DEFAULT_UA) {
gOverrides.set(domain, userAgent);
}
}
}
}

View file

@ -32,7 +32,7 @@
#ifdef __FreeBSD__
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: head/sys/netinet/sctp.h 279859 2015-03-10 19:49:25Z tuexen $");
__FBSDID("$FreeBSD: head/sys/netinet/sctp.h 356270 2020-01-02 13:55:10Z tuexen $");
#endif
#ifndef _NETINET_SCTP_H_
@ -598,7 +598,10 @@ struct sctp_error_no_user_data {
#define SCTP_MOBILITY_PRIM_DELETED 0x00000004
#define SCTP_SMALLEST_PMTU 512 /* smallest pmtu allowed when disabling PMTU discovery */
/* Smallest PMTU allowed when disabling PMTU discovery */
#define SCTP_SMALLEST_PMTU 512
/* Largest PMTU allowed when disabling PMTU discovery */
#define SCTP_LARGEST_PMTU 65536
#if defined(__Userspace_os_Windows)
#pragma pack()

View file

@ -32,7 +32,7 @@
#ifdef __FreeBSD__
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: head/sys/netinet/sctp_auth.c 271673 2014-09-16 14:20:33Z tuexen $");
__FBSDID("$FreeBSD: head/sys/netinet/sctp_auth.c 355931 2019-12-20 15:25:08Z tuexen $");
#endif
#include <netinet/sctp_os.h>
@ -1450,7 +1450,8 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m,
ptype = ntohs(phdr->param_type);
plen = ntohs(phdr->param_length);
if ((plen == 0) || (offset + plen > length))
if ((plen < sizeof(struct sctp_paramhdr)) ||
(offset + plen > length))
break;
if (ptype == SCTP_RANDOM) {

View file

@ -32,7 +32,7 @@
#ifdef __FreeBSD__
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 280459 2015-03-24 21:12:45Z tuexen $");
__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 355931 2019-12-20 15:25:08Z tuexen $");
#endif
#include <netinet/sctp_os.h>
@ -7213,7 +7213,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
if (offset + plen > limit) {
break;
}
if (plen == 0) {
if (plen < sizeof(struct sctp_paramhdr)) {
break;
}
#ifdef INET
@ -7413,6 +7413,9 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
if (plen > sizeof(lstore)) {
return (-23);
}
if (plen < sizeof(struct sctp_asconf_addrv4_param)) {
return (-101);
}
phdr = sctp_get_next_param(m, offset,
(struct sctp_paramhdr *)&lstore,
min(plen,sizeof(lstore)));

View file

@ -32,7 +32,7 @@
#ifdef __FreeBSD__
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 280459 2015-03-24 21:12:45Z tuexen $");
__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 356270 2020-01-02 13:55:10Z tuexen $");
#endif
#include <netinet/sctp_os.h>
@ -5995,6 +5995,14 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
return (EINVAL);
}
if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) &&
((paddrp->spp_pathmtu < SCTP_SMALLEST_PMTU) ||
(paddrp->spp_pathmtu > SCTP_LARGEST_PMTU))) {
if (stcb)
SCTP_TCB_UNLOCK(stcb);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
return (EINVAL);
}
if (stcb != NULL) {
/************************TCB SPECIFIC SET ******************/
@ -6038,7 +6046,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SOCKOPT, SCTP_SO_LOCKED);
sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net);
}
if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) && (paddrp->spp_pathmtu >= SCTP_SMALLEST_PMTU)) {
if (paddrp->spp_flags & SPP_PMTUD_DISABLE) {
if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
SCTP_FROM_SCTP_USRREQ+SCTP_LOC_10);
@ -6160,7 +6168,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
}
sctp_stcb_feature_on(inp, stcb, SCTP_PCB_FLAGS_DONOT_HEARTBEAT);
}
if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) && (paddrp->spp_pathmtu >= SCTP_SMALLEST_PMTU)) {
if (paddrp->spp_flags & SPP_PMTUD_DISABLE) {
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,

View file

@ -352,6 +352,13 @@ class MozbuildObject(ProcessExecutionMixin):
return _config_guess_output[0]
p = os.path.join(self.topsrcdir, 'build', 'autoconf', 'config.guess')
# Try looking for mozilla, for comm-central
if not os.path.isfile(p):
p = os.path.join(self.topsrcdir, 'mozilla', 'build', 'autoconf', 'config.guess')
if not os.path.isfile(p):
p = os.path.join(self.topsrcdir, 'platform', 'build', 'autoconf', 'config.guess')
# This is a little kludgy. We need access to the normalize_command
# function. However, that's a method of a mach mixin, so we need a