mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-27 09:37:31 +09:00
Merge remote-tracking branch 'origin/master' into custom
This commit is contained in:
commit
cf086d4da7
27 changed files with 321 additions and 384 deletions
|
|
@ -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'
|
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 --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'
|
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)'
|
$(RM) '$(dist_dest)/Contents/MacOS/$(MOZ_APP_NAME)'
|
||||||
rsync -aL $(DIST)/bin/$(MOZ_APP_NAME) '$(dist_dest)/Contents/MacOS'
|
rsync -aL $(DIST)/bin/$(MOZ_APP_NAME) '$(dist_dest)/Contents/MacOS'
|
||||||
cp -RL $(DIST)/branding/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'
|
cp -RL $(DIST)/branding/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/*.app/***
|
/*.app/***
|
||||||
/*.dylib
|
|
||||||
/certutil
|
/certutil
|
||||||
/firefox-bin
|
/firefox-bin
|
||||||
/gtest/***
|
/gtest/***
|
||||||
|
|
|
||||||
|
|
@ -9,38 +9,30 @@
|
||||||
#define GK_SLICE Gecko/20100101
|
#define GK_SLICE Gecko/20100101
|
||||||
#define FX_SLICE Firefox/@GK_VERSION@
|
#define FX_SLICE Firefox/@GK_VERSION@
|
||||||
|
|
||||||
#ifdef XP_UNIX
|
// %OS_SLICE% macro is resolved at runtime, see MoonchildProductions/UXP#1473
|
||||||
#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
|
|
||||||
|
|
||||||
// Mozilla overrides
|
// Mozilla overrides
|
||||||
pref("@GUAO_PREF@.accounts.firefox.com", "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@");
|
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
|
// 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@.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@.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@.netflix.com","Mozilla/5.0 (%OS_SLICE% rv:42.0) @GK_SLICE@ Firefox/42.0 @APP_SLICE@");
|
||||||
|
|
||||||
// The never-ending Facebook debacle...
|
// The never-ending Facebook debacle...
|
||||||
|
|
||||||
// UA-Sniffing domains below are pending responses from their operators - temp workaround
|
// UA-Sniffing domains below are pending responses from their operators - temp workaround
|
||||||
// Daily motion only likes strict Firefox UAs
|
// 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.
|
// 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!)
|
// 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
|
// UA-sniffing domains that are "app/vendor-specific" and do not like Pale Moon
|
||||||
|
|
||||||
// The following domains do not like the Goanna slice
|
// 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@.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@.yuku.com","Mozilla/5.0 (%OS_SLICE% rv:@GK_VERSION@) @GK_SLICE@ @FX_SLICE@ @APP_SLICE@");
|
||||||
|
|
|
||||||
|
|
@ -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'
|
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 --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'
|
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)'
|
$(RM) '$(dist_dest)/Contents/MacOS/$(PROGRAM)'
|
||||||
rsync -aL $(PROGRAM) '$(dist_dest)/Contents/MacOS'
|
rsync -aL $(PROGRAM) '$(dist_dest)/Contents/MacOS'
|
||||||
cp -RL $(DIST)/branding/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'
|
cp -RL $(DIST)/branding/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
/*.app/***
|
/*.app/***
|
||||||
/*.dylib
|
|
||||||
/certutil
|
/certutil
|
||||||
/firefox-bin
|
/firefox-bin
|
||||||
/gtest/***
|
/gtest/***
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,21 @@ const Curl = {
|
||||||
* A cURL command.
|
* A cURL command.
|
||||||
*/
|
*/
|
||||||
generateCommand: function (data) {
|
generateCommand: function (data) {
|
||||||
let utils = CurlUtils;
|
const utils = CurlUtils;
|
||||||
|
|
||||||
let command = ["curl"];
|
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();
|
let ignoredHeaders = new Set();
|
||||||
|
|
||||||
// The cURL command is expected to run on the same platform that Firefox runs
|
// The cURL command is expected to run on the same platform that Firefox runs
|
||||||
|
|
@ -69,7 +81,7 @@ const Curl = {
|
||||||
utils.escapeStringWin : utils.escapeStringPosix;
|
utils.escapeStringWin : utils.escapeStringPosix;
|
||||||
|
|
||||||
// Add URL.
|
// Add URL.
|
||||||
command.push(escapeString(data.url));
|
addParam(data.url);
|
||||||
|
|
||||||
let postDataText = null;
|
let postDataText = null;
|
||||||
let multipartRequest = utils.isMultipartRequest(data);
|
let multipartRequest = utils.isMultipartRequest(data);
|
||||||
|
|
@ -79,15 +91,15 @@ const Curl = {
|
||||||
if (utils.isUrlEncodedRequest(data) ||
|
if (utils.isUrlEncodedRequest(data) ||
|
||||||
["PUT", "POST", "PATCH"].includes(data.method)) {
|
["PUT", "POST", "PATCH"].includes(data.method)) {
|
||||||
postDataText = data.postDataText;
|
postDataText = data.postDataText;
|
||||||
postData.push("--data");
|
addPostData("--data");
|
||||||
postData.push(escapeString(utils.writePostDataTextParams(postDataText)));
|
addPostData(utils.writePostDataTextParams(postDataText));
|
||||||
ignoredHeaders.add("content-length");
|
ignoredHeaders.add("content-length");
|
||||||
} else if (multipartRequest) {
|
} else if (multipartRequest) {
|
||||||
postDataText = data.postDataText;
|
postDataText = data.postDataText;
|
||||||
postData.push("--data-binary");
|
addPostData("--data-binary");
|
||||||
let boundary = utils.getMultipartBoundary(data);
|
let boundary = utils.getMultipartBoundary(data);
|
||||||
let text = utils.removeBinaryDataFromMultipartText(postDataText, boundary);
|
let text = utils.removeBinaryDataFromMultipartText(postDataText, boundary);
|
||||||
postData.push(escapeString(text));
|
addPostData(text);
|
||||||
ignoredHeaders.add("content-length");
|
ignoredHeaders.add("content-length");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -95,15 +107,15 @@ const Curl = {
|
||||||
// For GET and POST requests this is not necessary as GET is the
|
// For GET and POST requests this is not necessary as GET is the
|
||||||
// default. If --data or --binary is added POST is the default.
|
// default. If --data or --binary is added POST is the default.
|
||||||
if (!(data.method == "GET" || data.method == "POST")) {
|
if (!(data.method == "GET" || data.method == "POST")) {
|
||||||
command.push("-X");
|
addParam("-X");
|
||||||
command.push(data.method);
|
addParam(data.method);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add -I (HEAD)
|
// Add -I (HEAD)
|
||||||
// For servers that supports HEAD.
|
// For servers that supports HEAD.
|
||||||
// This will fetch the header of a document only.
|
// This will fetch the header of a document only.
|
||||||
if (data.method == "HEAD") {
|
if (data.method == "HEAD") {
|
||||||
command.push("-I");
|
addParam("-I");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add http version.
|
// Add http version.
|
||||||
|
|
@ -114,7 +126,7 @@ const Curl = {
|
||||||
// data.httpVersion are HTTP/1.0, HTTP/1.1 and HTTP/2.0
|
// 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
|
// 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
|
// 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.
|
// Add request headers.
|
||||||
|
|
@ -126,14 +138,14 @@ const Curl = {
|
||||||
for (let i = 0; i < headers.length; i++) {
|
for (let i = 0; i < headers.length; i++) {
|
||||||
let header = headers[i];
|
let header = headers[i];
|
||||||
if (header.name.toLowerCase() === "accept-encoding") {
|
if (header.name.toLowerCase() === "accept-encoding") {
|
||||||
command.push("--compressed");
|
addParam("--compressed");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (ignoredHeaders.has(header.name.toLowerCase())) {
|
if (ignoredHeaders.has(header.name.toLowerCase())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
command.push("-H");
|
addParam("-H");
|
||||||
command.push(escapeString(header.name + ": " + header.value));
|
addParam(header.name + ": " + header.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add post data.
|
// Add post data.
|
||||||
|
|
|
||||||
|
|
@ -1261,6 +1261,15 @@ nsFocusManager::SetFocusInner(nsIContent* aNewContent, int32_t aFlags,
|
||||||
isElementInActiveWindow = (mActiveWindow && newRootWindow == mActiveWindow);
|
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
|
// 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,
|
// 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
|
// so we can't display the "Press ESC to leave fullscreen mode" warning on
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
if (aForceNoOpener && windowIsNew) {
|
||||||
NS_RELEASE(*aResult);
|
NS_RELEASE(*aResult);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1497,14 +1497,6 @@ OptimizeMIR(MIRGenerator* mir)
|
||||||
if (mir->shouldCancel("Start"))
|
if (mir->shouldCancel("Start"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!mir->compilingWasm()) {
|
|
||||||
if (!MakeMRegExpHoistable(mir, graph))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (mir->shouldCancel("Make MRegExp Hoistable"))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gs.spewPass("BuildSSA");
|
gs.spewPass("BuildSSA");
|
||||||
AssertBasicGraphCoherency(graph);
|
AssertBasicGraphCoherency(graph);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1975,274 +1975,6 @@ jit::ApplyTypeInformation(MIRGenerator* mir, MIRGraph& graph)
|
||||||
return true;
|
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
|
void
|
||||||
jit::RenumberBlocks(MIRGraph& graph)
|
jit::RenumberBlocks(MIRGraph& graph)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,6 @@ EliminateDeadCode(MIRGenerator* mir, MIRGraph& graph);
|
||||||
MOZ_MUST_USE bool
|
MOZ_MUST_USE bool
|
||||||
ApplyTypeInformation(MIRGenerator* mir, MIRGraph& graph);
|
ApplyTypeInformation(MIRGenerator* mir, MIRGraph& graph);
|
||||||
|
|
||||||
MOZ_MUST_USE bool
|
|
||||||
MakeMRegExpHoistable(MIRGenerator* mir, MIRGraph& graph);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
RenumberBlocks(MIRGraph& graph);
|
RenumberBlocks(MIRGraph& graph);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2297,14 +2297,9 @@ LIRGenerator::visitToObjectOrNull(MToObjectOrNull* ins)
|
||||||
void
|
void
|
||||||
LIRGenerator::visitRegExp(MRegExp* ins)
|
LIRGenerator::visitRegExp(MRegExp* ins)
|
||||||
{
|
{
|
||||||
if (ins->mustClone()) {
|
|
||||||
LRegExp* lir = new(alloc()) LRegExp();
|
LRegExp* lir = new(alloc()) LRegExp();
|
||||||
defineReturn(lir, ins);
|
defineReturn(lir, ins);
|
||||||
assignSafepoint(lir, ins);
|
assignSafepoint(lir, ins);
|
||||||
} else {
|
|
||||||
RegExpObject* source = ins->source();
|
|
||||||
define(new(alloc()) LPointer(source), ins);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -8102,11 +8102,9 @@ class MDefFun
|
||||||
class MRegExp : public MNullaryInstruction
|
class MRegExp : public MNullaryInstruction
|
||||||
{
|
{
|
||||||
CompilerGCPointer<RegExpObject*> source_;
|
CompilerGCPointer<RegExpObject*> source_;
|
||||||
bool mustClone_;
|
|
||||||
|
|
||||||
MRegExp(CompilerConstraintList* constraints, RegExpObject* source)
|
MRegExp(CompilerConstraintList* constraints, RegExpObject* source)
|
||||||
: source_(source),
|
: source_(source)
|
||||||
mustClone_(true)
|
|
||||||
{
|
{
|
||||||
setResultType(MIRType::Object);
|
setResultType(MIRType::Object);
|
||||||
setResultTypeSet(MakeSingletonTypeSet(constraints, source));
|
setResultTypeSet(MakeSingletonTypeSet(constraints, source));
|
||||||
|
|
@ -8116,12 +8114,6 @@ class MRegExp : public MNullaryInstruction
|
||||||
INSTRUCTION_HEADER(RegExp)
|
INSTRUCTION_HEADER(RegExp)
|
||||||
TRIVIAL_NEW_WRAPPERS
|
TRIVIAL_NEW_WRAPPERS
|
||||||
|
|
||||||
void setDoNotClone() {
|
|
||||||
mustClone_ = false;
|
|
||||||
}
|
|
||||||
bool mustClone() const {
|
|
||||||
return mustClone_;
|
|
||||||
}
|
|
||||||
RegExpObject* source() const {
|
RegExpObject* source() const {
|
||||||
return source_;
|
return source_;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -281,13 +281,8 @@
|
||||||
macro(proxy, proxy, "proxy") \
|
macro(proxy, proxy, "proxy") \
|
||||||
macro(raw, raw, "raw") \
|
macro(raw, raw, "raw") \
|
||||||
macro(reason, reason, "reason") \
|
macro(reason, reason, "reason") \
|
||||||
macro(RegExpBuiltinExec, RegExpBuiltinExec, "RegExpBuiltinExec") \
|
|
||||||
macro(RegExpFlagsGetter, RegExpFlagsGetter, "RegExpFlagsGetter") \
|
macro(RegExpFlagsGetter, RegExpFlagsGetter, "RegExpFlagsGetter") \
|
||||||
macro(RegExpMatcher, RegExpMatcher, "RegExpMatcher") \
|
|
||||||
macro(RegExpSearcher, RegExpSearcher, "RegExpSearcher") \
|
|
||||||
macro(RegExpStringIterator, RegExpStringIterator, "RegExp String Iterator") \
|
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(Reify, Reify, "Reify") \
|
||||||
macro(reject, reject, "reject") \
|
macro(reject, reject, "reject") \
|
||||||
macro(rejected, rejected, "rejected") \
|
macro(rejected, rejected, "rejected") \
|
||||||
|
|
@ -360,7 +355,6 @@
|
||||||
macro(uninitialized, uninitialized, "uninitialized") \
|
macro(uninitialized, uninitialized, "uninitialized") \
|
||||||
macro(unsized, unsized, "unsized") \
|
macro(unsized, unsized, "unsized") \
|
||||||
macro(unwatch, unwatch, "unwatch") \
|
macro(unwatch, unwatch, "unwatch") \
|
||||||
macro(UnwrapAndCallRegExpBuiltinExec, UnwrapAndCallRegExpBuiltinExec, "UnwrapAndCallRegExpBuiltinExec") \
|
|
||||||
macro(url, url, "url") \
|
macro(url, url, "url") \
|
||||||
macro(usage, usage, "usage") \
|
macro(usage, usage, "usage") \
|
||||||
macro(useAsm, useAsm, "use asm") \
|
macro(useAsm, useAsm, "use asm") \
|
||||||
|
|
|
||||||
|
|
@ -4822,14 +4822,14 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
|
||||||
: ri->ComputedMaxISize();
|
: ri->ComputedMaxISize();
|
||||||
}
|
}
|
||||||
Maybe<nsTArray<TrackSize>> origSizes;
|
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
|
// 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).
|
// applying a min/max-size (can only occur if aAvailableSize is indefinite).
|
||||||
while (true) {
|
while (true) {
|
||||||
float fr = FindUsedFlexFraction(aState, aGridItems, flexTracks,
|
float fr = FindUsedFlexFraction(aState, aGridItems, flexTracks,
|
||||||
aFunctions, aAvailableSize);
|
aFunctions, aAvailableSize);
|
||||||
if (fr != 0.0f) {
|
if (fr != 0.0f) {
|
||||||
bool applyMinMax = (minSize != 0 || maxSize != NS_UNCONSTRAINEDSIZE) &&
|
|
||||||
aAvailableSize == NS_UNCONSTRAINEDSIZE;
|
|
||||||
for (uint32_t i : flexTracks) {
|
for (uint32_t i : flexTracks) {
|
||||||
float flexFactor = aFunctions.MaxSizingFor(i).GetFlexFractionValue();
|
float flexFactor = aFunctions.MaxSizingFor(i).GetFlexFractionValue();
|
||||||
nscoord flexLength = NSToCoordRound(flexFactor * fr);
|
nscoord flexLength = NSToCoordRound(flexFactor * fr);
|
||||||
|
|
@ -4841,7 +4841,9 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
|
||||||
base = flexLength;
|
base = flexLength;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (applyMinMax && origSizes.isSome()) {
|
}
|
||||||
|
if (applyMinMax) {
|
||||||
|
applyMinMax = false;
|
||||||
// https://drafts.csswg.org/css-grid/#algo-flex-tracks
|
// https://drafts.csswg.org/css-grid/#algo-flex-tracks
|
||||||
// "If using this flex fraction would cause the grid to be smaller than
|
// "If using this flex fraction would cause the grid to be smaller than
|
||||||
// the grid container’s min-width/height (or larger than the grid
|
// the grid container’s min-width/height (or larger than the grid
|
||||||
|
|
@ -4859,20 +4861,18 @@ nsGridContainerFrame::Tracks::StretchFlexibleTracks(
|
||||||
aAvailableSize = minSize;
|
aAvailableSize = minSize;
|
||||||
}
|
}
|
||||||
if (aAvailableSize != NS_UNCONSTRAINEDSIZE) {
|
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);
|
aAvailableSize = std::max(0, aAvailableSize - sumOfGridGaps);
|
||||||
// Restart with the original track sizes and definite aAvailableSize.
|
// Restart with the original track sizes and definite aAvailableSize.
|
||||||
|
if (origSizes.isSome()) {
|
||||||
mSizes = Move(*origSizes);
|
mSizes = Move(*origSizes);
|
||||||
origSizes.reset();
|
origSizes.reset();
|
||||||
|
} // else, no mSizes[].mBase were changed above so it's still correct
|
||||||
if (aAvailableSize == 0) {
|
if (aAvailableSize == 0) {
|
||||||
break; // zero available size wouldn't change any sizes though...
|
break; // zero available size wouldn't change any sizes though...
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -107,4 +107,28 @@
|
||||||
<div class="item"></div>
|
<div class="item"></div>
|
||||||
</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>
|
</body></html>
|
||||||
|
|
|
||||||
|
|
@ -105,4 +105,28 @@
|
||||||
<div class="item"></div>
|
<div class="item"></div>
|
||||||
</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>
|
</body></html>
|
||||||
|
|
|
||||||
|
|
@ -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
|
/* static */ void
|
||||||
nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
|
nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
|
||||||
nsFrame* aFrame,
|
nsFrame* aFrame,
|
||||||
|
|
@ -1375,14 +1443,19 @@ nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
|
||||||
nsTableFrame* table = static_cast<nsTableFrame*>(aFrame);
|
nsTableFrame* table = static_cast<nsTableFrame*>(aFrame);
|
||||||
// In the collapsed border model, overlay all collapsed borders.
|
// In the collapsed border model, overlay all collapsed borders.
|
||||||
if (table->IsBorderCollapse()) {
|
if (table->IsBorderCollapse()) {
|
||||||
|
if (table->HasBCBorders()) {
|
||||||
aLists.BorderBackground()->AppendNewToTop(
|
aLists.BorderBackground()->AppendNewToTop(
|
||||||
new (aBuilder) nsDisplayTableBorderCollapse(aBuilder, table));
|
new (aBuilder) nsDisplayTableBorderCollapse(aBuilder, table));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
const nsStyleBorder* borderStyle = aFrame->StyleBorder();
|
||||||
|
if (borderStyle->HasBorder()) {
|
||||||
aLists.BorderBackground()->AppendNewToTop(
|
aLists.BorderBackground()->AppendNewToTop(
|
||||||
new (aBuilder) nsDisplayBorder(aBuilder, table));
|
new (aBuilder) nsDisplayBorder(aBuilder, table));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
aFrame->DisplayOutline(aBuilder, aLists);
|
aFrame->DisplayOutline(aBuilder, aLists);
|
||||||
}
|
}
|
||||||
|
|
@ -4101,6 +4174,7 @@ nsTableFrame::AddBCDamageArea(const TableArea& aValue)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SetNeedToCalcBCBorders(true);
|
SetNeedToCalcBCBorders(true);
|
||||||
|
SetNeedToCalcHasBCBorders(true);
|
||||||
// Get the property
|
// Get the property
|
||||||
BCPropertyData* value = GetOrCreateBCProperty();
|
BCPropertyData* value = GetOrCreateBCProperty();
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|
@ -4141,6 +4215,7 @@ nsTableFrame::SetFullBCDamageArea()
|
||||||
NS_ASSERTION(IsBorderCollapse(), "invalid SetFullBCDamageArea call");
|
NS_ASSERTION(IsBorderCollapse(), "invalid SetFullBCDamageArea call");
|
||||||
|
|
||||||
SetNeedToCalcBCBorders(true);
|
SetNeedToCalcBCBorders(true);
|
||||||
|
SetNeedToCalcHasBCBorders(true);
|
||||||
|
|
||||||
BCPropertyData* value = GetOrCreateBCProperty();
|
BCPropertyData* value = GetOrCreateBCProperty();
|
||||||
if (value) {
|
if (value) {
|
||||||
|
|
|
||||||
|
|
@ -761,6 +761,13 @@ public:
|
||||||
bool NeedToCollapse() const;
|
bool NeedToCollapse() const;
|
||||||
void SetNeedToCollapse(bool aValue);
|
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
|
/** The GeometryDirty bit is similar to the NS_FRAME_IS_DIRTY frame
|
||||||
* state bit, which implies that all descendants are dirty. The
|
* state bit, which implies that all descendants are dirty. The
|
||||||
* GeometryDirty still implies that all the parts of the table are
|
* GeometryDirty still implies that all the parts of the table are
|
||||||
|
|
@ -870,6 +877,8 @@ protected:
|
||||||
uint32_t mIStartContBCBorder:8;
|
uint32_t mIStartContBCBorder:8;
|
||||||
uint32_t mNeedToCollapse:1; // rows, cols that have visibility:collapse need to be collapsed
|
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 mResizedColumns:1; // have we resized columns since last reflow?
|
||||||
|
uint32_t mNeedToCalcHasBCBorders:1;
|
||||||
|
uint32_t mHasBCBorders:1;
|
||||||
} mBits;
|
} mBits;
|
||||||
|
|
||||||
nsTableCellMap* mCellMap; // maintains the relationships between rows, cols, and cells
|
nsTableCellMap* mCellMap; // maintains the relationships between rows, cols, and cells
|
||||||
|
|
@ -965,6 +974,30 @@ inline void nsTableFrame::SetNeedToCalcBCBorders(bool aValue)
|
||||||
mBits.mNeedToCalcBCBorders = (unsigned)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
|
inline nscoord
|
||||||
nsTableFrame::GetContinuousIStartBCBorderWidth() const
|
nsTableFrame::GetContinuousIStartBCBorderWidth() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ XPCOMUtils.defineLazyServiceGetter(this, "ppmm",
|
||||||
var gPrefBranch;
|
var gPrefBranch;
|
||||||
var gOverrides = new Map;
|
var gOverrides = new Map;
|
||||||
var gUpdatedOverrides;
|
var gUpdatedOverrides;
|
||||||
|
var gOldDynOverrides;
|
||||||
var gOverrideForHostCache = new Map;
|
var gOverrideForHostCache = new Map;
|
||||||
var gInitialized = false;
|
var gInitialized = false;
|
||||||
var gOverrideFunctions = [
|
var gOverrideFunctions = [
|
||||||
|
|
@ -55,7 +56,10 @@ this.UserAgentOverrides = {
|
||||||
}
|
}
|
||||||
|
|
||||||
UserAgentUpdates.init(function(overrides) {
|
UserAgentUpdates.init(function(overrides) {
|
||||||
gOverrideForHostCache.clear();
|
if (overrides == gOldDynOverrides) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gOldDynOverrides = overrides;
|
||||||
if (overrides) {
|
if (overrides) {
|
||||||
for (let domain in overrides) {
|
for (let domain in overrides) {
|
||||||
overrides[domain] = getUserAgentFromOverride(overrides[domain]);
|
overrides[domain] = getUserAgentFromOverride(overrides[domain]);
|
||||||
|
|
@ -63,6 +67,7 @@ this.UserAgentOverrides = {
|
||||||
overrides.get = function(key) { return this[key]; };
|
overrides.get = function(key) { return this[key]; };
|
||||||
}
|
}
|
||||||
gUpdatedOverrides = overrides;
|
gUpdatedOverrides = overrides;
|
||||||
|
buildOverrides();
|
||||||
});
|
});
|
||||||
|
|
||||||
buildOverrides();
|
buildOverrides();
|
||||||
|
|
@ -159,10 +164,16 @@ function buildOverrides() {
|
||||||
if (!Services.prefs.getBoolPref(PREF_OVERRIDES_ENABLED))
|
if (!Services.prefs.getBoolPref(PREF_OVERRIDES_ENABLED))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let builtUAs = new Map;
|
|
||||||
let domains = gPrefBranch.getChildList("");
|
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) {
|
for (let domain of domains) {
|
||||||
|
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 override = gPrefBranch.getCharPref(domain);
|
||||||
let userAgent = getUserAgentFromOverride(override);
|
let userAgent = getUserAgentFromOverride(override);
|
||||||
|
|
||||||
|
|
@ -170,6 +181,7 @@ function buildOverrides() {
|
||||||
gOverrides.set(domain, userAgent);
|
gOverrides.set(domain, userAgent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function HTTP_on_modify_request(aSubject, aTopic, aData) {
|
function HTTP_on_modify_request(aSubject, aTopic, aData) {
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <sys/cdefs.h>
|
#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
|
#endif
|
||||||
|
|
||||||
#ifndef _NETINET_SCTP_H_
|
#ifndef _NETINET_SCTP_H_
|
||||||
|
|
@ -598,7 +598,10 @@ struct sctp_error_no_user_data {
|
||||||
#define SCTP_MOBILITY_PRIM_DELETED 0x00000004
|
#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)
|
#if defined(__Userspace_os_Windows)
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <sys/cdefs.h>
|
#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
|
#endif
|
||||||
|
|
||||||
#include <netinet/sctp_os.h>
|
#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);
|
ptype = ntohs(phdr->param_type);
|
||||||
plen = ntohs(phdr->param_length);
|
plen = ntohs(phdr->param_length);
|
||||||
|
|
||||||
if ((plen == 0) || (offset + plen > length))
|
if ((plen < sizeof(struct sctp_paramhdr)) ||
|
||||||
|
(offset + plen > length))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (ptype == SCTP_RANDOM) {
|
if (ptype == SCTP_RANDOM) {
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <sys/cdefs.h>
|
#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
|
#endif
|
||||||
|
|
||||||
#include <netinet/sctp_os.h>
|
#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) {
|
if (offset + plen > limit) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (plen == 0) {
|
if (plen < sizeof(struct sctp_paramhdr)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef INET
|
#ifdef INET
|
||||||
|
|
@ -7413,6 +7413,9 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
|
||||||
if (plen > sizeof(lstore)) {
|
if (plen > sizeof(lstore)) {
|
||||||
return (-23);
|
return (-23);
|
||||||
}
|
}
|
||||||
|
if (plen < sizeof(struct sctp_asconf_addrv4_param)) {
|
||||||
|
return (-101);
|
||||||
|
}
|
||||||
phdr = sctp_get_next_param(m, offset,
|
phdr = sctp_get_next_param(m, offset,
|
||||||
(struct sctp_paramhdr *)&lstore,
|
(struct sctp_paramhdr *)&lstore,
|
||||||
min(plen,sizeof(lstore)));
|
min(plen,sizeof(lstore)));
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <sys/cdefs.h>
|
#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
|
#endif
|
||||||
|
|
||||||
#include <netinet/sctp_os.h>
|
#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);
|
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||||
return (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) {
|
if (stcb != NULL) {
|
||||||
/************************TCB SPECIFIC SET ******************/
|
/************************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_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SOCKOPT, SCTP_SO_LOCKED);
|
||||||
sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net);
|
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)) {
|
if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
|
||||||
sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
|
sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
|
||||||
SCTP_FROM_SCTP_USRREQ+SCTP_LOC_10);
|
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);
|
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) {
|
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
||||||
if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
|
if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
|
||||||
sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
|
sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,13 @@ class MozbuildObject(ProcessExecutionMixin):
|
||||||
|
|
||||||
p = os.path.join(self.topsrcdir, 'build', 'autoconf', 'config.guess')
|
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
|
# 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
|
# function. However, that's a method of a mach mixin, so we need a
|
||||||
# class instance. Ideally the function should be accessible as a
|
# class instance. Ideally the function should be accessible as a
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue