Merge mozilla-central to autoland.

This commit is contained in:
Cosmin Sabou 2018-11-28 06:11:15 +02:00
Родитель 0504c51e3b e1e8f2ea69
Коммит 20c5475d6d
187 изменённых файлов: 2921 добавлений и 1419 удалений

52
Cargo.lock сгенерированный
Просмотреть файл

@ -161,8 +161,8 @@ name = "baldrdash"
version = "0.1.0"
dependencies = [
"bindgen 0.43.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-wasm 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-wasm 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"target-lexicon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -457,20 +457,20 @@ dependencies = [
[[package]]
name = "cranelift-bforest"
version = "0.23.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-entity 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cranelift-codegen"
version = "0.23.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-bforest 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen-meta 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-bforest 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen-meta 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
@ -479,39 +479,39 @@ dependencies = [
[[package]]
name = "cranelift-codegen-meta"
version = "0.23.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-entity 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cranelift-entity"
version = "0.23.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "cranelift-frontend"
version = "0.23.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-codegen 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"target-lexicon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cranelift-wasm"
version = "0.23.0"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cranelift-codegen 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-frontend 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-codegen 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-entity 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cranelift-frontend 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"wasmparser 0.21.8 (registry+https://github.com/rust-lang/crates.io-index)",
"wasmparser 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -2900,7 +2900,7 @@ dependencies = [
[[package]]
name = "wasmparser"
version = "0.21.8"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
@ -3163,12 +3163,12 @@ dependencies = [
"checksum core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3f46450d6f2397261af420b4ccce23807add2e45fa206410a03d66fb7f050ae"
"checksum cose 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "72fa26cb151d3ae4b70f63d67d0fed57ce04220feafafbae7f503bef7aae590d"
"checksum cose-c 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "49726015ab0ca765144fcca61e4a7a543a16b795a777fa53f554da2fffff9a94"
"checksum cranelift-bforest 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c5f8e1ab4f73b59a98531a8013d8ed3ca7edb4e36984cb301d9c06f6892787b"
"checksum cranelift-codegen 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437ec8212686e6cdacfea75aaedb4ab8b013869be1e8693a4cb97a60f135035"
"checksum cranelift-codegen-meta 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4eac16097b96e9f609df735555f2d1658531750fbc3805bca1daca7671aef9eb"
"checksum cranelift-entity 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9be3f82369346201c2e0cff720522e6eb55459e51c916b2199f25cff2058ca96"
"checksum cranelift-frontend 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5d18ab2bc89a09b4275442a9559dc0f947b9a8ad9ae9ee89452a057df54ced"
"checksum cranelift-wasm 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e5906a111814d43d84002ef974eb0c023804fd4d1866b34f43c1bb588a759ad8"
"checksum cranelift-bforest 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b2d527b241af388ff017d72f2b0b323929a70cf97342c6ec1534e3b0f4dfaa0"
"checksum cranelift-codegen 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e92fa0fa287cf00a6739c46aba114957e0a8eeeb4f0d1aa65d6ed0699c34ca6b"
"checksum cranelift-codegen-meta 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "963262697a05d9aa63ca40f4670a7243e4525f4a098e10d654c3f5143fcef686"
"checksum cranelift-entity 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc9a0329208e5e0d7d4d6e64cd50985d4c4cbfdbeeb594ae2157a094b98e8dcc"
"checksum cranelift-frontend 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98d9eb4a2343435d520499236c805725c88d6d55eefb9a6ad0819b7970c76bdd"
"checksum cranelift-wasm 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5022a3a3d1044fdc8c97909b5e8d701884982dcfb43885034d004cfdd9b7d577"
"checksum crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5d02c0aac6bd68393ed69e00bbc2457f3e89075c6349db7189618dc4ddc1d7"
"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
"checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7"
@ -3393,7 +3393,7 @@ dependencies = [
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
"checksum walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "63636bd0eb3d00ccb8b9036381b526efac53caf112b7783b730ab3f8e44da369"
"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
"checksum wasmparser 0.21.8 (registry+https://github.com/rust-lang/crates.io-index)" = "202e4cd4d99aa8adb8fe6280e099fdd2e5003c8d09c27de6969ff04dba60ef39"
"checksum wasmparser 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b4e0f66e314a8e63ff5c3cc5103f7d0a3de9ee98bb61a960adcf7f1d9debd2f"
"checksum webidl 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f807f7488d680893f7188aa09d7672a3a0a8461975a098a2edf0a52e3fee29"
"checksum which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4be6cfa54dab45266e98b5d7be2f8ce959ddd49abd141a05d52dce4b07f803bb"
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"

Просмотреть файл

@ -113,6 +113,12 @@
"optional": true,
"description": "The URL of the page where the menu item was clicked. This property is not set if the click occured in a context where there is no current page, such as in a launcher context menu."
},
"frameId": {
"type": "integer",
"optional": true,
"minimum": 0,
"description": "The id of the frame of the element where the context menu was clicked."
},
"frameUrl": {
"type": "string",
"optional": true,

Просмотреть файл

@ -412,12 +412,12 @@ export default class AddressForm extends PaymentStateSubscriberMixin(PaymentRequ
return paymentDetails.shippingAddressErrors;
}
case "selectedPayerAddress": {
return paymentDetails.payer;
return paymentDetails.payerErrors;
}
case "basic-card-page|billingAddressGUID": {
// `paymentMethod` can be null.
return (paymentDetails.paymentMethod
&& paymentDetails.paymentMethod.billingAddress) || {};
return (paymentDetails.paymentMethodErrors
&& paymentDetails.paymentMethodErrors.billingAddress) || {};
}
default: {
throw new Error("Unknown selectedStateKey");

Просмотреть файл

@ -53,8 +53,8 @@ let REQUEST_1 = {
},
},
],
payer: {},
paymentMethod: {},
payerErrors: {},
paymentMethodErrors: {},
shippingAddressErrors: {},
shippingOptions: [
{
@ -135,8 +135,8 @@ let REQUEST_2 = {
},
},
],
payer: {},
paymentMethod: {},
payerErrors: {},
paymentMethoErrors: {},
shippingAddressErrors: {},
shippingOptions: [
{
@ -487,7 +487,7 @@ let buttonActions = {
setBasicCardErrors() {
let request = Object.assign({}, requestStore.getState().request);
request.paymentDetails = Object.assign({}, requestStore.getState().request.paymentDetails);
request.paymentDetails.paymentMethod = {
request.paymentDetails.paymentMethodErrors = {
cardNumber: "",
cardholderName: "",
cardSecurityCode: "",
@ -530,7 +530,7 @@ let buttonActions = {
setPayerErrors() {
let request = Object.assign({}, requestStore.getState().request);
request.paymentDetails = Object.assign({}, requestStore.getState().request.paymentDetails);
request.paymentDetails.payer = {
request.paymentDetails.payerErrors = {
email: "Only @mozilla.com emails are supported",
name: "Payer name must start with M",
phone: "Payer area codes must start with 1",

Просмотреть файл

@ -46,8 +46,8 @@ export let requestStore = new PaymentsStore({
id: null,
totalItem: {label: null, amount: {currency: null, value: 0}},
displayItems: [],
payer: {},
paymentMethod: null,
payerErrors: {},
paymentMethodErrors: null,
shippingAddressErrors: {},
shippingOptions: [],
modifiers: null,

Просмотреть файл

@ -708,7 +708,7 @@ add_task(async function test_customMerchantValidity_billingAddressForm() {
await form.requestStore.setState({
request: {
paymentDetails: {
paymentMethod: {
paymentMethodErrors: {
billingAddress: {
addressLine: "Billing Street address needs to start with a D",
city: "Billing City needs to start with a B",
@ -753,7 +753,7 @@ add_task(async function test_merchantPayerAddressErrors() {
},
request: {
paymentDetails: {
payer: {
payerErrors: {
email: "Email must be @mozilla.org",
name: "Name needs to start with a W",
phone: "Telephone needs to start with a 1",
@ -771,7 +771,7 @@ add_task(async function test_merchantPayerAddressErrors() {
function checkValidationMessage(selector, property) {
is(form.form.querySelector(selector).validationMessage,
state.request.paymentDetails.payer[property],
state.request.paymentDetails.payerErrors[property],
"Validation message should match for " + selector);
}
@ -786,7 +786,7 @@ add_task(async function test_merchantPayerAddressErrors() {
await form.requestStore.setState({
request: {
paymentDetails: {
payer: {},
payerErrors: {},
},
paymentOptions: {},
},

Просмотреть файл

@ -256,10 +256,10 @@ add_task(async function test_merchantError() {
info("Set billing address and payer errors which aren't relevant to this picker");
let requestWithNonShippingAddressErrors = deepClone(request);
Object.assign(requestWithNonShippingAddressErrors.paymentDetails, {
payer: {
payerErrors: {
name: "Your name is too short",
},
paymentMethod: {
paymentMethodErrors: {
billingAddress: {
country: "Your billing country is not supported",
},

Просмотреть файл

@ -9,6 +9,7 @@ support-files =
[browser_UrlbarInput_formatValue.js]
[browser_UrlbarInput_overflow.js]
[browser_UrlbarInput_tooltip.js]
skip-if = asan # Bug 1504985
[browser_UrlbarInput_trimURLs.js]
subsuite = clipboard
[browser_UrlbarInput_unit.js]

Просмотреть файл

@ -748,6 +748,7 @@ class AsyncTabSwitcher {
if (time != -1) {
TelemetryStopwatch.finish("FX_TAB_SWITCH_COMPOSITE_E10S_MS", this.window);
this.log("DEBUG: tab switch time including compositing = " + time);
this._tabSwitchStopWatchRunning = false;
}
}
this.addMarker("AsyncTabSwitch:Composited");

Просмотреть файл

@ -504,7 +504,7 @@ class Automation(object):
debuggerInfo = None, symbolsPath = None,
timeout = -1, maxTime = None, onLaunch = None,
detectShutdownLeaks = False, screenshotOnFail=False, testPath=None, bisectChunk=None,
valgrindPath=None, valgrindArgs=None, valgrindSuppFiles=None, outputHandler=None):
valgrindPath=None, valgrindArgs=None, valgrindSuppFiles=None, outputHandler=None, e10s=True):
"""
Run the app, log the duration it took to execute, return the status code.
Kills the app if it runs for longer than |maxTime| seconds, or outputs nothing for |timeout| seconds.

Просмотреть файл

@ -28,24 +28,59 @@ class RemoteAutomation(Automation):
def __init__(self, device, appName='', remoteProfile=None, remoteLog=None,
processArgs=None):
self._device = device
self._appName = appName
self._remoteProfile = remoteProfile
self._remoteLog = remoteLog
self._processArgs = processArgs or {}
self.device = device
self.appName = appName
self.remoteProfile = remoteProfile
self.remoteLog = remoteLog
self.processArgs = processArgs or {}
self.lastTestSeen = "remoteautomation.py"
Automation.__init__(self)
def runApp(self, testURL, env, app, profileDir, extraArgs,
utilityPath=None, xrePath=None, debuggerInfo=None, symbolsPath=None,
timeout=-1, maxTime=None, e10s=True, **kwargs):
"""
Run the app, log the duration it took to execute, return the status code.
Kills the app if it runs for longer than |maxTime| seconds, or outputs nothing
for |timeout| seconds.
"""
if utilityPath is None:
utilityPath = self.DIST_BIN
if xrePath is None:
xrePath = self.DIST_BIN
if timeout == -1:
timeout = self.DEFAULT_TIMEOUT
self.utilityPath = utilityPath
cmd, args = self.buildCommandLine(app, debuggerInfo, profileDir, testURL, extraArgs)
startTime = datetime.datetime.now()
self.lastTestSeen = "remoteautomation.py"
self.launchApp([cmd] + args,
env=self.environment(env=env, crashreporter=not debuggerInfo),
e10s=e10s, **self.processArgs)
self.log.info("remoteautomation.py | Application pid: %d", self.pid)
status = self.waitForFinish(timeout, maxTime)
self.log.info("remoteautomation.py | Application ran for: %s",
str(datetime.datetime.now() - startTime))
crashed = self.checkForCrashes(symbolsPath)
if crashed:
status = 1
return status, self.lastTestSeen
# Set up what we need for the remote environment
def environment(self, env=None, xrePath=None, crashreporter=True, debugger=False,
lsanPath=None, ubsanPath=None):
def environment(self, env=None, crashreporter=True, **kwargs):
# Because we are running remote, we don't want to mimic the local env
# so no copying of os.environ
if env is None:
env = {}
if crashreporter and not debugger:
if crashreporter:
env['MOZ_CRASHREPORTER_NO_REPORT'] = '1'
env['MOZ_CRASHREPORTER'] = '1'
env['MOZ_CRASHREPORTER_SHUTDOWN'] = '1'
@ -75,56 +110,54 @@ class RemoteAutomation(Automation):
return env
def waitForFinish(self, proc, utilityPath, timeout, maxTime, startTime, debuggerInfo,
symbolsPath, outputHandler=None):
def waitForFinish(self, timeout, maxTime):
""" Wait for tests to finish.
If maxTime seconds elapse or no output is detected for timeout
seconds, kill the process and fail the test.
"""
proc.utilityPath = utilityPath
# maxTime is used to override the default timeout, we should honor that
status = proc.wait(timeout=maxTime, noOutputTimeout=timeout)
self.lastTestSeen = proc.getLastTestSeen
status = self.wait(timeout=maxTime, noOutputTimeout=timeout)
topActivity = self._device.get_top_activity(timeout=60)
if topActivity == proc.procName:
print("Browser unexpectedly found running. Killing...")
proc.kill(True)
topActivity = self.device.get_top_activity(timeout=60)
if topActivity == self.procName:
self.log.info("%s unexpectedly found running. Killing..." % self.procName)
self.kill(True)
if status == 1:
if maxTime:
print("TEST-UNEXPECTED-FAIL | %s | application ran for longer than "
"allowed maximum time of %s seconds" % (
self.lastTestSeen, maxTime))
self.log.error("TEST-UNEXPECTED-FAIL | %s | "
"application ran for longer than allowed maximum time "
"of %s seconds" % (self.lastTestSeen, maxTime))
else:
print("TEST-UNEXPECTED-FAIL | %s | application ran for longer than "
"allowed maximum time" % (self.lastTestSeen))
self.log.error("TEST-UNEXPECTED-FAIL | %s | "
"application ran for longer than allowed maximum time"
% self.lastTestSeen)
if status == 2:
print("TEST-UNEXPECTED-FAIL | %s | application timed out after %d "
"seconds with no output"
% (self.lastTestSeen, int(timeout)))
self.log.error("TEST-UNEXPECTED-FAIL | %s | "
"application timed out after %d seconds with no output"
% (self.lastTestSeen, int(timeout)))
return status
def deleteANRs(self):
# Remove files from the dalvik stack-trace directory.
if not self._device.is_dir(self._device.stack_trace_dir, root=True):
if not self.device.is_dir(self.device.stack_trace_dir, root=True):
return
try:
for trace_file in self._device.ls(self._device.stack_trace_dir, root=True):
trace_path = posixpath.join(self._device.stack_trace_dir, trace_file)
self._device.chmod(trace_path, root=True)
self._device.rm(trace_path, root=True)
for trace_file in self.device.ls(self.device.stack_trace_dir, root=True):
trace_path = posixpath.join(self.device.stack_trace_dir, trace_file)
self.device.chmod(trace_path, root=True)
self.device.rm(trace_path, root=True)
except Exception as e:
print("Error deleting %s: %s" % (self._device.stack_trace_dir, str(e)))
print("Error deleting %s: %s" % (self.device.stack_trace_dir, str(e)))
def checkForANRs(self):
if not self._device.is_dir(self._device.stack_trace_dir):
print("%s not found" % self._device.stack_trace_dir)
if not self.device.is_dir(self.device.stack_trace_dir):
print("%s not found" % self.device.stack_trace_dir)
return
try:
for trace_file in self._device.ls(self._device.stack_trace_dir, root=True):
trace_path = posixpath.join(self._device.stack_trace_dir, trace_file)
t = self._device.get_file(trace_path)
for trace_file in self.device.ls(self.device.stack_trace_dir, root=True):
trace_path = posixpath.join(self.device.stack_trace_dir, trace_file)
t = self.device.get_file(trace_path)
if t:
stripped = t.strip()
if len(stripped) > 0:
@ -133,12 +166,11 @@ class RemoteAutomation(Automation):
# Once reported, delete traces
self.deleteANRs()
except Exception as e:
print("Error pulling %s: %s" % (self._device.stack_trace_dir, str(e)))
print("Error pulling %s: %s" % (self.device.stack_trace_dir, str(e)))
def deleteTombstones(self):
# delete any tombstone files from device
self._device.rm("/data/tombstones", force=True,
recursive=True, root=True)
self.device.rm("/data/tombstones", force=True, recursive=True, root=True)
def checkForTombstones(self):
# pull any tombstones from device and move to MOZ_UPLOAD_DIR
@ -147,10 +179,10 @@ class RemoteAutomation(Automation):
if uploadDir:
if not os.path.exists(uploadDir):
os.mkdir(uploadDir)
if self._device.is_dir(remoteDir):
if self.device.is_dir(remoteDir):
# copy tombstone files from device to local upload directory
self._device.chmod(remoteDir, recursive=True, root=True)
self._device.pull(remoteDir, uploadDir)
self.device.chmod(remoteDir, recursive=True, root=True)
self.device.pull(remoteDir, uploadDir)
self.deleteTombstones()
for f in glob.glob(os.path.join(uploadDir, "tombstone_??")):
# add a unique integer to the file name, in case there are
@ -166,11 +198,11 @@ class RemoteAutomation(Automation):
else:
print("MOZ_UPLOAD_DIR not defined; tombstone check skipped")
def checkForCrashes(self, directory, symbolsPath):
def checkForCrashes(self, symbolsPath):
self.checkForANRs()
self.checkForTombstones()
logcat = self._device.get_logcat(
logcat = self.device.get_logcat(
filter_out_regexps=fennecLogcatFilters)
javaException = mozcrash.check_for_java_exception(
@ -185,8 +217,8 @@ class RemoteAutomation(Automation):
try:
dumpDir = tempfile.mkdtemp()
remoteCrashDir = posixpath.join(self._remoteProfile, 'minidumps')
if not self._device.is_dir(remoteCrashDir):
remoteCrashDir = posixpath.join(self.remoteProfile, 'minidumps')
if not self.device.is_dir(remoteCrashDir):
# If crash reporting is enabled (MOZ_CRASHREPORTER=1), the
# minidumps directory is automatically created when Fennec
# (first) starts, so its lack of presence is a hint that
@ -194,7 +226,7 @@ class RemoteAutomation(Automation):
print("Automation Error: No crash directory (%s) found on remote device" %
remoteCrashDir)
return True
self._device.pull(remoteCrashDir, dumpDir)
self.device.pull(remoteCrashDir, dumpDir)
logger = get_default_logger()
crashed = mozcrash.log_crashes(
@ -210,8 +242,8 @@ class RemoteAutomation(Automation):
def buildCommandLine(self, app, debuggerInfo, profileDir, testURL, extraArgs):
# If remote profile is specified, use that instead
if self._remoteProfile:
profileDir = self._remoteProfile
if self.remoteProfile:
profileDir = self.remoteProfile
# Hack for robocop, if app is "am" and extraArgs contains the rest of the stuff, lets
# assume extraArgs is all we need
@ -226,251 +258,235 @@ class RemoteAutomation(Automation):
pass
return app, args
def Process(self, cmd, stdout=None, stderr=None, env=None, cwd=None):
return self.RProcess(self._device, cmd, self._remoteLog, env, cwd, self._appName,
**self._processArgs)
def launchApp(self, cmd, env=None, e10s=True, messageLogger=None, counts=None):
self.messageLogger = messageLogger
self.stdoutlen = 0
class RProcess(object):
def __init__(self, device, cmd, stdout=None, env=None, cwd=None, app=None,
messageLogger=None, counts=None):
self.device = device
self.lastTestSeen = "remoteautomation.py"
self.messageLogger = messageLogger
self.proc = stdout
if self.appName and self.device.process_exist(self.appName):
print("remoteautomation.py %s is already running. Stopping..." % self.appName)
self.device.stop_application(self.appName, root=True)
self.counts = counts
if self.counts is not None:
self.counts['pass'] = 0
self.counts['fail'] = 0
self.counts['todo'] = 0
if cmd[0] == 'am':
cmd = ' '.join(cmd)
self.procName = self.appName
if not self.device.shell_bool(cmd):
print("remote_automation.py failed to launch %s" % cmd)
else:
self.procName = cmd[0].split(posixpath.sep)[-1]
self.stdoutlen = 0
self.utilityPath = None
if app and self.device.process_exist(app):
print("remoteautomation.py %s is already running. Stopping...")
self.device.stop_application(app, root=True)
self.counts = counts
if self.counts is not None:
self.counts['pass'] = 0
self.counts['fail'] = 0
self.counts['todo'] = 0
if cmd[0] == 'am':
cmd = ' '.join(cmd)
self.procName = app
if not self.device.shell_bool(cmd):
print("remote_automation.py failed to launch %s" % cmd)
args = cmd
if args[0] == self.appName:
args = args[1:]
url = args[-1:][0]
if url.startswith('/'):
# this is probably a reftest profile directory, not a url
url = None
else:
args = cmd
if args[0] == app:
args = args[1:]
url = args[-1:][0]
if url.startswith('/'):
# this is probably a reftest profile directory, not a url
url = None
else:
args = args[:-1]
if 'geckoview' in app:
activity = "TestRunnerActivity"
self.device.launch_activity(app, activity, e10s=True, moz_env=env,
extra_args=args, url=url)
else:
self.device.launch_fennec(
app, moz_env=env, extra_args=args, url=url)
args = args[:-1]
if 'geckoview' in self.appName:
activity = "TestRunnerActivity"
self.device.launch_activity(self.appName, activity_name=activity, e10s=e10s,
moz_env=env, extra_args=args, url=url)
else:
self.device.launch_fennec(self.appName, moz_env=env, extra_args=args, url=url)
# Setting timeout at 1 hour since on a remote device this takes much longer.
# Temporarily increased to 110 minutes because no more chunks can be created.
self.timeout = 6600
# Setting timeout at 1 hour since on a remote device this takes much longer.
# Temporarily increased to 110 minutes because no more chunks can be created.
self.timeout = 6600
# Used to buffer log messages until we meet a line break
self.logBuffer = ""
# Used to buffer log messages until we meet a line break
self.logBuffer = ""
@property
def pid(self):
procs = self.device.get_process_list()
# limit the comparison to the first 75 characters due to a
# limitation in processname length in android.
pids = [proc[0] for proc in procs if proc[1] == self.procName[:75]]
@property
def pid(self):
procs = self.device.get_process_list()
# limit the comparison to the first 75 characters due to a
# limitation in processname length in android.
pids = [proc[0] for proc in procs if proc[1] == self.procName[:75]]
if pids is None or len(pids) < 1:
return 0
return pids[0]
if pids is None or len(pids) < 1:
return 0
return pids[0]
def read_stdout(self):
"""
Fetch the full remote log file, log any new content and return True if new
content processed.
"""
if not self.device.is_file(self.proc):
return False
try:
newLogContent = self.device.get_file(
self.proc, offset=self.stdoutlen)
except ADBTimeoutError:
raise
except Exception:
return False
if not newLogContent:
return False
def read_stdout(self):
"""
Fetch the full remote log file, log any new content and return True if new
content processed.
"""
if not self.device.is_file(self.remoteLog):
return False
try:
newLogContent = self.device.get_file(self.remoteLog, offset=self.stdoutlen)
except ADBTimeoutError:
raise
except Exception as e:
self.log.info("remoteautomation.py | exception reading log: %s" % str(e))
return False
if not newLogContent:
return False
self.stdoutlen += len(newLogContent)
if self.messageLogger is None:
testStartFilenames = re.findall(
r"TEST-START \| ([^\s]*)", newLogContent)
if testStartFilenames:
self.lastTestSeen = testStartFilenames[-1]
print(newLogContent)
return True
self.logBuffer += newLogContent
lines = self.logBuffer.split('\n')
lines = [l for l in lines if l]
if lines:
if self.logBuffer.endswith('\n'):
# all lines are complete; no need to buffer
self.logBuffer = ""
else:
# keep the last (unfinished) line in the buffer
self.logBuffer = lines[-1]
del lines[-1]
if not lines:
return False
for line in lines:
# This passes the line to the logger (to be logged or buffered)
parsed_messages = self.messageLogger.write(line)
for message in parsed_messages:
if isinstance(message, dict) and message.get('action') == 'test_start':
self.lastTestSeen = message['test']
if isinstance(message, dict) and message.get('action') == 'log':
line = message['message'].strip()
if self.counts:
m = re.match(".*:\s*(\d*)", line)
if m:
try:
val = int(m.group(1))
if "Passed:" in line:
self.counts['pass'] += val
elif "Failed:" in line:
self.counts['fail'] += val
elif "Todo:" in line:
self.counts['todo'] += val
except ADBTimeoutError:
raise
except Exception:
pass
self.stdoutlen += len(newLogContent)
if self.messageLogger is None:
testStartFilenames = re.findall(r"TEST-START \| ([^\s]*)", newLogContent)
if testStartFilenames:
self.lastTestSeen = testStartFilenames[-1]
print(newLogContent)
return True
@property
def getLastTestSeen(self):
return self.lastTestSeen
self.logBuffer += newLogContent
lines = self.logBuffer.split('\n')
lines = [l for l in lines if l]
# Wait for the remote process to end (or for its activity to go to background).
# While waiting, periodically retrieve the process output and print it.
# If the process is still running after *timeout* seconds, return 1;
# If the process is still running but no output is received in *noOutputTimeout*
# seconds, return 2;
# Else, once the process exits/goes to background, return 0.
def wait(self, timeout=None, noOutputTimeout=None):
timer = 0
noOutputTimer = 0
interval = 10
if timeout is None:
timeout = self.timeout
status = 0
top = self.procName
slowLog = False
endTime = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
while top == self.procName:
# Get log updates on each interval, but if it is taking
# too long, only do it every 60 seconds
hasOutput = False
if (not slowLog) or (timer % 60 == 0):
startRead = datetime.datetime.now()
hasOutput = self.read_stdout()
if (datetime.datetime.now() - startRead) > datetime.timedelta(seconds=5):
slowLog = True
if hasOutput:
noOutputTimer = 0
if self.counts and 'pass' in self.counts and self.counts['pass'] > 0:
interval = 0.5
time.sleep(interval)
timer += interval
noOutputTimer += interval
if datetime.datetime.now() > endTime:
status = 1
break
if (noOutputTimeout and noOutputTimer > noOutputTimeout):
status = 2
break
if not hasOutput:
top = self.device.get_top_activity(timeout=60)
if top is None:
print("Failed to get top activity, retrying, once...")
top = self.device.get_top_activity(timeout=60)
# Flush anything added to stdout during the sleep
self.read_stdout()
print("wait for %s complete; top activity=%s" % (self.procName, top))
return status
def kill(self, stagedShutdown=False):
# Take a screenshot to capture the screen state just before
# the application is killed.
if not self.device._device_serial.startswith('emulator-'):
dump_device_screen(self.device, get_default_logger())
elif self.utilityPath:
# Do not use the on-device screenshot options since
# they rarely work well with Firefox on the Android
# emulator. dump_screen provides an effective
# screenshot of the emulator and its host desktop.
dump_screen(self.utilityPath, get_default_logger())
if stagedShutdown:
# Trigger an ANR report with "kill -3" (SIGQUIT)
try:
self.device.pkill(self.procName, sig=3, attempts=1, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
pass
time.sleep(3)
# Trigger a breakpad dump with "kill -6" (SIGABRT)
try:
self.device.pkill(self.procName, sig=6, attempts=1, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
pass
# Wait for process to end
retries = 0
while retries < 3:
if self.device.process_exist(self.procName):
print("%s still alive after SIGABRT: waiting..." % self.procName)
time.sleep(5)
else:
break
retries += 1
if self.device.process_exist(self.procName):
try:
self.device.pkill(self.procName, sig=9, attempts=1, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
print("%s still alive after SIGKILL!" % self.procName)
if self.device.process_exist(self.procName):
self.device.stop_application(self.procName)
if lines:
if self.logBuffer.endswith('\n'):
# all lines are complete; no need to buffer
self.logBuffer = ""
else:
self.device.stop_application(self.procName)
# Test harnesses use the MOZ_CRASHREPORTER environment variables to suppress
# the interactive crash reporter, but that may not always be effective;
# check for and cleanup errant crashreporters.
crashreporter = "%s.CrashReporter" % self.procName
if self.device.process_exist(crashreporter):
print("Warning: %s unexpectedly found running. Killing..." % crashreporter)
# keep the last (unfinished) line in the buffer
self.logBuffer = lines[-1]
del lines[-1]
if not lines:
return False
for line in lines:
# This passes the line to the logger (to be logged or buffered)
parsed_messages = self.messageLogger.write(line)
for message in parsed_messages:
if isinstance(message, dict) and message.get('action') == 'test_start':
self.lastTestSeen = message['test']
if isinstance(message, dict) and message.get('action') == 'log':
line = message['message'].strip()
if self.counts:
m = re.match(".*:\s*(\d*)", line)
if m:
try:
val = int(m.group(1))
if "Passed:" in line:
self.counts['pass'] += val
elif "Failed:" in line:
self.counts['fail'] += val
elif "Todo:" in line:
self.counts['todo'] += val
except ADBTimeoutError:
raise
except Exception:
pass
return True
# Wait for the remote process to end (or for its activity to go to background).
# While waiting, periodically retrieve the process output and print it.
# If the process is still running after *timeout* seconds, return 1;
# If the process is still running but no output is received in *noOutputTimeout*
# seconds, return 2;
# Else, once the process exits/goes to background, return 0.
def wait(self, timeout=None, noOutputTimeout=None):
timer = 0
noOutputTimer = 0
interval = 10
if timeout is None:
timeout = self.timeout
status = 0
top = self.procName
slowLog = False
endTime = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
while top == self.procName:
# Get log updates on each interval, but if it is taking
# too long, only do it every 60 seconds
hasOutput = False
if (not slowLog) or (timer % 60 == 0):
startRead = datetime.datetime.now()
hasOutput = self.read_stdout()
if (datetime.datetime.now() - startRead) > datetime.timedelta(seconds=5):
slowLog = True
if hasOutput:
noOutputTimer = 0
if self.counts and 'pass' in self.counts and self.counts['pass'] > 0:
interval = 0.5
time.sleep(interval)
timer += interval
noOutputTimer += interval
if datetime.datetime.now() > endTime:
status = 1
break
if (noOutputTimeout and noOutputTimer > noOutputTimeout):
status = 2
break
if not hasOutput:
top = self.device.get_top_activity(timeout=60)
if top is None:
print("Failed to get top activity, retrying, once...")
top = self.device.get_top_activity(timeout=60)
# Flush anything added to stdout during the sleep
self.read_stdout()
print("wait for %s complete; top activity=%s" % (self.procName, top))
return status
def kill(self, stagedShutdown=False):
# Take a screenshot to capture the screen state just before
# the application is killed.
# Do not use the on-device screenshot options since
# they rarely work well with Firefox on the Android
# emulator. dump_screen provides an effective
# screenshot of the emulator and its host desktop.
if not self.device._device_serial.startswith('emulator-'):
dump_device_screen(self.device, get_default_logger())
elif self.utilityPath:
dump_screen(self.utilityPath, get_default_logger())
if stagedShutdown:
# Trigger an ANR report with "kill -3" (SIGQUIT)
try:
self.device.pkill(self.procName, sig=3, attempts=1, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
pass
time.sleep(3)
# Trigger a breakpad dump with "kill -6" (SIGABRT)
try:
self.device.pkill(self.procName, sig=6, attempts=1, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
pass
# Wait for process to end
retries = 0
while retries < 3:
if self.device.process_exist(self.procName):
print("%s still alive after SIGABRT: waiting..." % self.procName)
time.sleep(5)
else:
break
retries += 1
if self.device.process_exist(self.procName):
try:
self.device.pkill(crashreporter, root=True)
self.device.pkill(self.procName, sig=9, attempts=1, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
pass
if self.device.process_exist(crashreporter):
print("ERROR: %s still running!!" % crashreporter)
print("%s still alive after SIGKILL!" % self.procName)
if self.device.process_exist(self.procName):
self.device.stop_application(self.procName)
else:
self.device.stop_application(self.procName)
# Test harnesses use the MOZ_CRASHREPORTER environment variables to suppress
# the interactive crash reporter, but that may not always be effective;
# check for and cleanup errant crashreporters.
crashreporter = "%s.CrashReporter" % self.procName
if self.device.process_exist(crashreporter):
print("Warning: %s unexpectedly found running. Killing..." % crashreporter)
try:
self.device.pkill(crashreporter, root=True)
except ADBTimeoutError:
raise
except: # NOQA: E722
pass
if self.device.process_exist(crashreporter):
print("ERROR: %s still running!!" % crashreporter)

Просмотреть файл

@ -498,6 +498,27 @@ nsOuterWindowProxy::getPropertyDescriptor(JSContext* cx,
return js::Wrapper::getPropertyDescriptor(cx, proxy, id, desc);
}
/**
* IsNonConfigurableReadonlyPrimitiveGlobalProp returns true for
* property names that fit the following criteria:
*
* 1) The ES spec defines a property with that name on globals.
* 2) The property is non-configurable.
* 3) The property is non-writable (readonly).
* 4) The value of the property is a primitive (so doesn't change
* observably on when navigation happens).
*
* Such properties can act as actual non-configurable properties on a
* WindowProxy, because they are not affected by navigation.
*/
static bool
IsNonConfigurableReadonlyPrimitiveGlobalProp(JSContext* cx, JS::Handle<jsid> id)
{
return id == GetJSIDByIndex(cx, XPCJSContext::IDX_NAN) ||
id == GetJSIDByIndex(cx, XPCJSContext::IDX_UNDEFINED) ||
id == GetJSIDByIndex(cx, XPCJSContext::IDX_INFINITY);
}
bool
nsOuterWindowProxy::getOwnPropertyDescriptor(JSContext* cx,
JS::Handle<JSObject*> proxy,
@ -515,7 +536,18 @@ nsOuterWindowProxy::getOwnPropertyDescriptor(JSContext* cx,
}
// else fall through to js::Wrapper
return js::Wrapper::getOwnPropertyDescriptor(cx, proxy, id, desc);
bool ok = js::Wrapper::getOwnPropertyDescriptor(cx, proxy, id, desc);
if (!ok) {
return false;
}
#ifndef RELEASE_OR_BETA // To be turned on in bug 1496510.
if (!IsNonConfigurableReadonlyPrimitiveGlobalProp(cx, id)) {
desc.setConfigurable(true);
}
#endif
return true;
}
bool
@ -532,7 +564,68 @@ nsOuterWindowProxy::defineProperty(JSContext* cx,
return result.failCantDefineWindowElement();
}
return js::Wrapper::defineProperty(cx, proxy, id, desc, result);
JS::ObjectOpResult ourResult;
bool ok = js::Wrapper::defineProperty(cx, proxy, id, desc, ourResult);
if (!ok) {
return false;
}
if (!ourResult.ok()) {
// It's possible that this failed because the page got the existing
// descriptor (which we force to claim to be configurable) and then tried to
// redefine the property with the descriptor it got but a different value.
// We want to allow this case to succeed, so check for it and if we're in
// that case try again but now with an attempt to define a non-configurable
// property.
if (!desc.hasConfigurable() || !desc.configurable()) {
// The incoming descriptor was not explicitly marked "configurable: true",
// so it failed for some other reason. Just propagate that reason out.
result = ourResult;
return true;
}
JS::Rooted<JS::PropertyDescriptor> existingDesc(cx);
ok = js::Wrapper::getOwnPropertyDescriptor(cx, proxy, id, &existingDesc);
if (!ok) {
return false;
}
if (!existingDesc.object() || existingDesc.configurable()) {
// We have no existing property, or its descriptor is already configurable
// (on the Window itself, where things really can be non-configurable).
// So we failed for some other reason, which we should propagate out.
result = ourResult;
return true;
}
JS::Rooted<JS::PropertyDescriptor> updatedDesc(cx, desc);
updatedDesc.setConfigurable(false);
JS::ObjectOpResult ourNewResult;
ok = js::Wrapper::defineProperty(cx, proxy, id, updatedDesc, ourNewResult);
if (!ok) {
return false;
}
if (!ourNewResult.ok()) {
// Twiddling the configurable flag didn't help. Just return this failure
// out to the caller.
result = ourNewResult;
return true;
}
}
#ifndef RELEASE_OR_BETA // To be turned on in bug 1496510.
if (desc.hasConfigurable() && !desc.configurable() &&
!IsNonConfigurableReadonlyPrimitiveGlobalProp(cx, id)) {
// Give callers a way to detect that they failed to "really" define a
// non-configurable property.
result.failCantDefineWindowNonConfigurable();
return true;
}
#endif
result.succeed();
return true;
}
bool

Просмотреть файл

@ -18,12 +18,12 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1107443
*/
var retval = Object.defineProperty(window, "nosuchprop",
{ value: 5, configurable: false });
todo_is(retval, false,
"Should return false when 'failing' to define non-configurable property via Object.defineProperty.")
is(retval, false,
"Should return false when 'failing' to define non-configurable property via Object.defineProperty.")
var desc = Object.getOwnPropertyDescriptor(window, "nosuchprop");
is(typeof(desc), "object", "Should have a property 'nosuchprop' now");
todo_is(desc.configurable, true,
"Property 'nosuchprop' should be configurable");
is(desc.configurable, true,
"Property 'nosuchprop' should be configurable");
is(desc.writable, false, "Property 'nosuchprop' should be readonly");
is(desc.value, 5, "Property 'nosuchprop' should have the right value");
@ -32,8 +32,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1107443
"Should return object when succesfully defining 'nosuchprop2'");
desc = Object.getOwnPropertyDescriptor(window, "nosuchprop2");
is(typeof(desc), "object", "Should have a property 'nosuchprop2' now");
todo_is(desc.configurable, true,
"Property 'nosuchprop2' should be configurable");
is(desc.configurable, true,
"Property 'nosuchprop2' should be configurable");
is(desc.writable, false, "Property 'nosuchprop2' should be readonly");
is(desc.value, 6, "Property 'nosuchprop2' should have the right value");
@ -48,17 +48,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1107443
is(desc.writable, false, "Property 'nosuchprop3' should be readonly");
is(desc.value, 7, "Property 'nosuchprop3' should have the right value");
// XXXbz it's not actually entirely clear what behavior the
// Reflect.defineProperty bits should have. Check it carefully once there's a
// spec.
retval = Reflect.defineProperty(window, "nosuchprop4",
{ value: 8, configurable: false });
todo_is(retval, false,
"Should not be able to Reflect.defineProperty if non-configurable");
is(retval, false,
"Should not be able to Reflect.defineProperty if non-configurable");
desc = Object.getOwnPropertyDescriptor(window, "nosuchprop4");
is(typeof(desc), "object", "Should have a property 'nosuchprop4' now");
todo_is(desc.configurable, true,
"Property 'nosuchprop4' should be configurable");
is(desc.configurable, true,
"Property 'nosuchprop4' should be configurable");
is(desc.writable, false, "Property 'nosuchprop4' should be readonly");
is(desc.value, 8, "Property 'nosuchprop4' should have the right value");
@ -68,8 +65,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1107443
"Should be able to Reflect.defineProperty with default configurability");
desc = Object.getOwnPropertyDescriptor(window, "nosuchprop5");
is(typeof(desc), "object", "Should have a property 'nosuchprop5' now");
todo_is(desc.configurable, true,
"Property 'nosuchprop5' should be configurable");
is(desc.configurable, true,
"Property 'nosuchprop5' should be configurable");
is(desc.writable, false, "Property 'nosuchprop5' should be readonly");
is(desc.value, 9, "Property 'nosuchprop5' should have the right value");

Просмотреть файл

@ -20,6 +20,7 @@
#include "AccessCheck.h"
#include "js/JSON.h"
#include "js/StableStringChars.h"
#include "js/Symbol.h"
#include "jsfriendapi.h"
#include "nsContentCreatorFunctions.h"
#include "nsContentUtils.h"

Просмотреть файл

@ -9,8 +9,9 @@
#include "jsfriendapi.h"
#include "js/CharacterEncoding.h"
#include "js/Wrapper.h"
#include "js/Conversions.h"
#include "js/MemoryFunctions.h"
#include "js/Wrapper.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/Alignment.h"
#include "mozilla/Array.h"

Просмотреть файл

@ -13958,6 +13958,13 @@ class CGBindingRoot(CGThing):
bindingDeclareHeaders["jspubtd.h"] = not bindingDeclareHeaders["jsapi.h"]
bindingDeclareHeaders["js/RootingAPI.h"] = not bindingDeclareHeaders["jsapi.h"]
def descriptorHasIteratorAlias(desc):
def hasIteratorAlias(m):
return m.isMethod() and "@@iterator" in m.aliases
return any(hasIteratorAlias(m) for m in desc.interface.members)
bindingHeaders["js/Symbol.h"] = any(descriptorHasIteratorAlias(d) for d in descriptors)
def descriptorRequiresPreferences(desc):
iface = desc.interface
return any(m.getExtendedAttribute("Pref") for m in iface.members + [iface])

Просмотреть файл

@ -2043,6 +2043,7 @@ ScopedUnpackReset::ScopedUnpackReset(const WebGLContext* const webgl)
: ScopedGLWrapper<ScopedUnpackReset>(webgl->gl)
, mWebGL(webgl)
{
// clang-format off
if (mWebGL->mPixelStore_UnpackAlignment != 4) mGL->fPixelStorei(LOCAL_GL_UNPACK_ALIGNMENT, 4);
if (mWebGL->IsWebGL2()) {
@ -2054,11 +2055,13 @@ ScopedUnpackReset::ScopedUnpackReset(const WebGLContext* const webgl)
if (mWebGL->mBoundPixelUnpackBuffer) mGL->fBindBuffer(LOCAL_GL_PIXEL_UNPACK_BUFFER, 0);
}
// clang-format on
}
void
ScopedUnpackReset::UnwrapImpl()
{
// clang-format off
mGL->fPixelStorei(LOCAL_GL_UNPACK_ALIGNMENT, mWebGL->mPixelStore_UnpackAlignment);
if (mWebGL->IsWebGL2()) {
@ -2075,6 +2078,7 @@ ScopedUnpackReset::UnwrapImpl()
mGL->fBindBuffer(LOCAL_GL_PIXEL_UNPACK_BUFFER, pbo);
}
// clang-format on
}
////////////////////

Просмотреть файл

@ -48,15 +48,15 @@
class nsIDocShell;
/*
* WebGL-only GLenums
*/
#define LOCAL_GL_BROWSER_DEFAULT_WEBGL 0x9244
#define LOCAL_GL_CONTEXT_LOST_WEBGL 0x9242
#define LOCAL_GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL 0x9247
#define LOCAL_GL_UNPACK_COLORSPACE_CONVERSION_WEBGL 0x9243
#define LOCAL_GL_UNPACK_FLIP_Y_WEBGL 0x9240
#define LOCAL_GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL 0x9241
// WebGL-only GLenums
// clang-format off
#define LOCAL_GL_BROWSER_DEFAULT_WEBGL 0x9244
#define LOCAL_GL_CONTEXT_LOST_WEBGL 0x9242
#define LOCAL_GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL 0x9247
#define LOCAL_GL_UNPACK_COLORSPACE_CONVERSION_WEBGL 0x9243
#define LOCAL_GL_UNPACK_FLIP_Y_WEBGL 0x9240
#define LOCAL_GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL 0x9241
// clang-format on
namespace mozilla {
class ScopedCopyTexImageSource;

Просмотреть файл

@ -118,6 +118,8 @@ AddCompressedFormatInfo(EffectiveFormat format, uint16_t bitsPerBlock, uint8_t b
static void
InitCompressedFormatInfo()
{
// clang-format off
// GLES 3.0.4, p147, table 3.19
// GLES 3.0.4, p286+, $C.1 "ETC Compressed Texture Image Formats"
AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGB8_ETC2 , 64, 4, 4, CompressionFamily::ES3);
@ -194,6 +196,8 @@ InitCompressedFormatInfo()
// OES_compressed_ETC1_RGB8_texture
AddCompressedFormatInfo(EffectiveFormat::ETC1_RGB8_OES, 64, 4, 4, CompressionFamily::ETC1);
// clang-format on
}
//////////////////////////////////////////////////////////////////////////////////////////
@ -272,6 +276,9 @@ AddFormatInfo(EffectiveFormat format, const char* name, GLenum sizedFormat,
static void
InitFormatInfo()
{
// This function is full of expressive formatting, so:
// clang-format off
#define FOO(x) EffectiveFormat::x, #x, LOCAL_GL_ ## x
// GLES 3.0.4, p130-132, table 3.13
@ -489,6 +496,7 @@ InitFormatInfo()
#undef SET_BY_SUFFIX
//////
#define SET_BY_SUFFIX(X) \
@ -521,6 +529,8 @@ InitFormatInfo()
SET_COPY_DECAY(R11F_G11F_B10F, R16F, RG16F, R11F_G11F_B10F, MAX, Luminance16F, MAX, MAX)
#undef SET_COPY_DECAY
// clang-format on
}
//////////////////////////////////////////////////////////////////////////////////////////
@ -767,9 +777,11 @@ AddLegacyFormats_LA8(FormatUsageAuthority* fua, gl::GLContext* gl)
dui = {LOCAL_GL_RG8, LOCAL_GL_RG, LOCAL_GL_UNSIGNED_BYTE};
fnAdd(EffectiveFormat::Luminance8Alpha8, FormatUsageInfo::kLumAlphaSwizzleRGBA);
} else {
// clang-format off
AddSimpleUnsized(fua, LOCAL_GL_LUMINANCE , LOCAL_GL_UNSIGNED_BYTE, EffectiveFormat::Luminance8 );
AddSimpleUnsized(fua, LOCAL_GL_ALPHA , LOCAL_GL_UNSIGNED_BYTE, EffectiveFormat::Alpha8 );
AddSimpleUnsized(fua, LOCAL_GL_LUMINANCE_ALPHA, LOCAL_GL_UNSIGNED_BYTE, EffectiveFormat::Luminance8Alpha8);
// clang-format on
}
return true;
@ -778,6 +790,8 @@ AddLegacyFormats_LA8(FormatUsageAuthority* fua, gl::GLContext* gl)
static bool
AddUnsizedFormats(FormatUsageAuthority* fua, gl::GLContext* gl)
{
// clang-format off
// GLES 2.0.25, p63, Table 3.4
AddSimpleUnsized(fua, LOCAL_GL_RGBA, LOCAL_GL_UNSIGNED_BYTE , EffectiveFormat::RGBA8 );
AddSimpleUnsized(fua, LOCAL_GL_RGBA, LOCAL_GL_UNSIGNED_SHORT_4_4_4_4, EffectiveFormat::RGBA4 );
@ -787,6 +801,8 @@ AddUnsizedFormats(FormatUsageAuthority* fua, gl::GLContext* gl)
// L, A, LA
return AddLegacyFormats_LA8(fua, gl);
// clang-format on
}
void
@ -894,6 +910,7 @@ FormatUsageAuthority::CreateForWebGL2(gl::GLContext* gl)
ptr->AddTexUnpack(usage, pi, dui);
};
// clang-format off
#define FOO(x) EffectiveFormat::x, LOCAL_GL_ ## x
// RGBA
@ -984,6 +1001,7 @@ FormatUsageAuthority::CreateForWebGL2(gl::GLContext* gl)
fnAddSizedUnpack(FOO(DEPTH32F_STENCIL8), LOCAL_GL_DEPTH_STENCIL, LOCAL_GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
#undef FOO
// clang-format on
////////////////////////////////////////////////////////////////////////////

Просмотреть файл

@ -4,7 +4,7 @@ load 360293-1.html
load 421715-1.html
load 553938-1.html
load 647480.html
load 727547.html
skip-if(Android&&browserIsRemote) load 727547.html # bug 1507207
load 729116.html
load 745699-1.html
load 746813-1.html

Просмотреть файл

@ -1,32 +0,0 @@
<!--docytpe html-->
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<script>
window.onload=function(){
var c=document.getElementById("myCanvas").getContext("2d");
var in1=document.getElementById("in1");
var in2=document.getElementById("in2");
in1.onfocus=function(){
c.beginPath();
c.rect(10, 10, 200, 200);
if(c.drawCustomFocusRing(in1)) {
c.stroke();
}
c.beginPath();
c.rect(10, 220, 200, 200);
if(c.drawCustomFocusRing(in2)) {
c.stroke();
}
}
in1.focus();
}
</script>
</head>
<body>
<canvas id="myCanvas" height="500" width="500" style="border:1px solid black">
<input id="in1" type="range" min="1" max="12">
<input id="in2" type="range" min="1" max="12">
</canvas>
</body></html>

Просмотреть файл

@ -157,7 +157,6 @@ fuzzy-if(skiaContent,0-1,0-150) == clip-multiple-move-2.html clip-multiple-move-
# focus rings
pref(canvas.focusring.enabled,true) skip-if(cocoaWidget) skip-if(winWidget) fuzzy-if(skiaContent&&!cocoaWidget&&!winWidget,0-1,0-2) needs-focus == drawFocusIfNeeded.html drawFocusIfNeeded-ref.html
pref(canvas.customfocusring.enabled,true) skip-if(Android||cocoaWidget||winWidget) fuzzy-if(gtkWidget,0-64,0-410) needs-focus == drawCustomFocusRing.html drawCustomFocusRing-ref.html
# Check that captureStream() displays in a local video element
== capturestream.html wrapper.html?green.png

Просмотреть файл

@ -9,26 +9,6 @@ SimpleTest.waitForExplicitFinish();
const Cc = SpecialPowers.Cc;
const Cr = SpecialPowers.Cr;
SpecialPowers.setBoolPref("canvas.focusring.enabled", true);
SpecialPowers.setBoolPref("canvas.customfocusring.enabled", true);
</script>
<p>Canvas test: drawCustomFocusRing</p>
<canvas id="c688" class="output" width="100" height="50">+
<input id="button1" type="range" min="1" max="12"></input>
<input id="button2" type="range" min="1" max="12"></input>
</canvas>
<script type="text/javascript">
function test_drawCustomFocusRing_canvas() {
var c = document.getElementById("c688");
var ctx = c.getContext("2d");
ctx.beginPath();
var b1 = document.getElementById('button1');
var b2 = document.getElementById('button2');
ok(!ctx.drawCustomFocusRing(b1), "button 1 is focused");
ok(!ctx.drawCustomFocusRing(b2), "button 2 is focused");
b1.focus();
ok(ctx.drawCustomFocusRing(b1), "button 1 should not be focused");
}
</script>
<p>Canvas test: drawFocusIfNeeded</p>
@ -78,12 +58,6 @@ function test_drawFocusIfNeeded_canvas() {
function runTests() {
try {
test_drawCustomFocusRing_canvas();
} catch(e) {
throw e;
ok(false, "unexpected exception thrown in: test_drawCustomFocusRing_canvas");
}
try {
test_drawFocusIfNeeded_canvas();
} catch(e) {
throw e;
@ -91,7 +65,6 @@ function runTests() {
}
SpecialPowers.setBoolPref("canvas.focusring.enabled", false);
SpecialPowers.setBoolPref("canvas.customfocusring.enabled", false);
SimpleTest.finish();
}

Просмотреть файл

@ -11,6 +11,7 @@
#include <stdint.h> // for UINT32_MAX, uintptr_t
#include "IndexedDatabaseManager.h"
#include "js/Date.h"
#include "js/MemoryFunctions.h"
#include "js/Value.h"
#include "jsfriendapi.h"
#include "mozilla/Casting.h"

Просмотреть файл

@ -63,9 +63,9 @@ interface nsIPaymentDetails : nsISupports
[implicit_jscontext]
readonly attribute jsval shippingAddressErrors;
[implicit_jscontext]
readonly attribute jsval payer;
readonly attribute jsval payerErrors;
[implicit_jscontext]
readonly attribute jsval paymentMethod;
readonly attribute jsval paymentMethodErrors;
};
[scriptable, builtinclass, uuid(d53f9f20-138e-47cc-9fd5-db16a3f6d301)]

Просмотреть файл

@ -19,6 +19,7 @@
#include "DecoderTraits.h"
#include "AudioContext.h"
#include "AudioBuffer.h"
#include "js/MemoryFunctions.h"
#include "MediaContainerType.h"
#include "nsContentUtils.h"
#include "nsIScriptObjectPrincipal.h"

Просмотреть файл

@ -481,7 +481,7 @@ PaymentDetails::GetShippingAddressErrors(JSContext* aCx, JS::MutableHandleValue
}
NS_IMETHODIMP
PaymentDetails::GetPayer(JSContext* aCx, JS::MutableHandleValue aErrors)
PaymentDetails::GetPayerErrors(JSContext* aCx, JS::MutableHandleValue aErrors)
{
PayerErrors errors;
errors.Init(mPayerErrors);
@ -492,7 +492,7 @@ PaymentDetails::GetPayer(JSContext* aCx, JS::MutableHandleValue aErrors)
}
NS_IMETHODIMP
PaymentDetails::GetPaymentMethod(JSContext* aCx, JS::MutableHandleValue aErrors)
PaymentDetails::GetPaymentMethodErrors(JSContext* aCx, JS::MutableHandleValue aErrors)
{
if (mPaymentMethodErrors.IsEmpty()) {
aErrors.set(JS::NullValue());
@ -558,8 +558,8 @@ PaymentDetails::Update(nsIPaymentDetails* aDetails, const bool aRequestShipping)
PaymentDetails* rowDetails = static_cast<PaymentDetails*>(aDetails);
MOZ_ASSERT(rowDetails);
mShippingAddressErrors = rowDetails->GetShippingAddressErrors();
mPayerErrors = rowDetails->GetPayer();
mPaymentMethodErrors = rowDetails->GetPaymentMethod();
mPayerErrors = rowDetails->GetPayerErrors();
mPaymentMethodErrors = rowDetails->GetPaymentMethodErrors();
return NS_OK;
@ -572,13 +572,13 @@ PaymentDetails::GetShippingAddressErrors() const
}
const nsString&
PaymentDetails::GetPayer() const
PaymentDetails::GetPayerErrors() const
{
return mPayerErrors;
}
const nsString&
PaymentDetails::GetPaymentMethod() const
PaymentDetails::GetPaymentMethodErrors() const
{
return mPaymentMethodErrors;
}

Просмотреть файл

@ -131,8 +131,8 @@ public:
nsIPaymentDetails** aDetails);
nsresult Update(nsIPaymentDetails* aDetails, const bool aRequestShipping);
const nsString& GetShippingAddressErrors() const;
const nsString& GetPayer() const;
const nsString& GetPaymentMethod() const;
const nsString& GetPayerErrors() const;
const nsString& GetPaymentMethodErrors() const;
nsresult UpdateErrors(const nsAString& aError,
const nsAString& aPayerErrors,
const nsAString& aPaymentMethodErrors,

Просмотреть файл

@ -99,7 +99,7 @@ const TestingUIService = {
updatePayment(requestId) {
// Let's echo what was sent in by the error...
const request = paymentSrv.getPaymentRequestById(requestId);
this.showPayment(requestId, request.paymentDetails.paymentMethod);
this.showPayment(requestId, request.paymentDetails.paymentMethodErrors);
},
// Handles response.complete()
completePayment(requestId) {

Просмотреть файл

@ -35,7 +35,7 @@ const TestingUIService = {
updatePayment(requestId) {
// Let's echo what was sent in by the error...
const request = paymentSrv.getPaymentRequestById(requestId);
const { name, email, phone } = request.paymentDetails.payer;
const { name, email, phone } = request.paymentDetails.payerErrors;
const { error } = request.paymentDetails;
// Let's use the .error as the switch
switch (error) {

Просмотреть файл

@ -112,7 +112,7 @@ function checkPayerErrors(testName, errors) {
function checkPaymentMethodErrors(testName, errors) {
if (!errors) {
emitTestFail(`${testName} :Expect non-null payerMethodErrors, but got null.`);
emitTestFail(`${testName} :Expect non-null paymentMethodErrors, but got null.`);
return;
}
for (const [key, msg] of Object.entries(errors)) {
@ -148,8 +148,8 @@ const DummyUIService = {
payment.paymentDetails.error + "'");
}
checkAddressErrors(this.testName, payment.paymentDetails.shippingAddressErrors)
checkPayerErrors(this.testName, payment.paymentDetails.payer);
checkPaymentMethodErrors(this.testName, payment.paymentDetails.paymentMethod);
checkPayerErrors(this.testName, payment.paymentDetails.payerErrors);
checkPaymentMethodErrors(this.testName, payment.paymentDetails.paymentMethodErrors);
if (this.rejectRetry) {
rejectPayment(requestId);
} else {

Просмотреть файл

@ -25,6 +25,7 @@
#include "nsPluginInstanceOwner.h"
#include "nsWrapperCacheInlines.h"
#include "js/GCHashTable.h"
#include "js/Symbol.h"
#include "js/TracingAPI.h"
#include "js/Wrapper.h"
#include "mozilla/HashFunctions.h"

Просмотреть файл

@ -15,6 +15,7 @@
#include "jsapi.h"
#include "jsfriendapi.h"
#include "js/CompilationAndEvaluation.h"
#include "js/MemoryFunctions.h"
#include "js/OffThreadScriptCompilation.h"
#include "js/SourceText.h"
#include "js/Utility.h"

Просмотреть файл

@ -243,9 +243,6 @@ interface CanvasDrawPath {
[NoInterfaceObject]
interface CanvasUserInterface {
[Pref="canvas.focusring.enabled", Throws] void drawFocusIfNeeded(Element element);
// NOT IMPLEMENTED void drawSystemFocusRing(Path path, HTMLElement element);
[Pref="canvas.customfocusring.enabled"] boolean drawCustomFocusRing(Element element);
// NOT IMPLEMENTED boolean drawCustomFocusRing(Path path, HTMLElement element);
// NOT IMPLEMENTED void scrollPathIntoView();
// NOT IMPLEMENTED void scrollPathIntoView(Path path);
};

Просмотреть файл

@ -7,6 +7,7 @@
#include "ChromeWorkerScope.h"
#include "jsapi.h"
#include "js/MemoryFunctions.h"
#include "nsXPCOM.h"
#include "nsNativeCharsetUtils.h"

Просмотреть файл

@ -76,6 +76,7 @@
#include "nsIFileChannel.h"
#include "mozilla/Telemetry.h"
#include "js/JSON.h"
#include "js/MemoryFunctions.h"
#include "jsfriendapi.h"
#include "GeckoProfiler.h"
#include "mozilla/dom/XMLHttpRequestBinding.h"

Просмотреть файл

@ -1,4 +1,4 @@
52944
52951
0/nm
0th/pt
1/n1
@ -2790,7 +2790,7 @@ Congolese/M
Congregational
Congregationalist/MS
Congress/MS
Congressional
Congressional/Y
Congreve/M
Conley/M
Conn/MR
@ -20673,7 +20673,7 @@ congregational
congregationalism/M
congregationalist/MS
congress/MS
congressional
congressional/Y
congressman/M
congressmen
congresspeople
@ -23779,6 +23779,7 @@ dowry/SM
dowse/DRSZG
dowser/M
dox/SDG
doxastic
doxology/SM
doxx/SDG
doyen/SM
@ -30059,6 +30060,7 @@ horde/DSMG
horehound/SM
horizon/SM
horizontal/SMY
hormesis
hormonal
hormone/SM
horn/MDS
@ -49607,6 +49609,8 @@ transfinite
transfix/DSG
transform/BSZGMDR
transformation/SM
transformational
transformative
transformer/M
transfuse/DSXGN
transfusion/M
@ -50827,6 +50831,7 @@ uptempo
upthrust/GSM
uptick/SM
uptight
uptime
uptown/M
uptrend
upturn/GSMD
@ -50919,9 +50924,11 @@ vacationer/M
vacationist/SM
vaccinate/GNDSX
vaccination/M
vaccinator/S
vaccine/SM
vacillate/XGNDS
vacillation/M
vacinal
vacuity/M
vacuole/MS
vacuous/YP

Просмотреть файл

@ -481,12 +481,14 @@ DrawBlitProg::Draw(const BaseArgs& args, const YUVArgs* const argsYUV) const
oldVAO = gl->GetIntAs<GLuint>(LOCAL_GL_VERTEX_ARRAY_BINDING);
gl->fBindVertexArray(mParent.mQuadVAO);
} else {
// clang-format off
gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vaa0Enabled);
gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_SIZE, &vaa0Size);
gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_TYPE, (GLint*)&vaa0Type);
gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vaa0Normalized);
gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_STRIDE, (GLint*)&vaa0Stride);
gl->fGetVertexAttribPointerv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_POINTER, &vaa0Pointer);
// clang-format on
gl->fEnableVertexAttribArray(0);
const ScopedBindArrayBuffer bindVBO(gl, mParent.mQuadVBO);

Просмотреть файл

@ -5,6 +5,8 @@
#ifndef GLCONSTS_H_
#define GLCONSTS_H_
// clang-format off
/**
* GENERATED FILE, DO NOT MODIFY DIRECTLY.
* This is a file generated directly from the official OpenGL registry
@ -6999,6 +7001,6 @@
#define LOCAL_WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
#define LOCAL_WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
// clang-format on
#endif // GLCONSTS_H_

Просмотреть файл

@ -63,11 +63,13 @@ using namespace mozilla::layers;
MOZ_THREAD_LOCAL(uintptr_t) GLContext::sCurrentContext;
// If adding defines, don't forget to undefine symbols. See #undef block below.
// clang-format off
#define CORE_SYMBOL(x) { (PRFuncPtr*) &mSymbols.f##x, { #x, nullptr } }
#define CORE_EXT_SYMBOL2(x,y,z) { (PRFuncPtr*) &mSymbols.f##x, { #x, #x #y, #x #z, nullptr } }
#define EXT_SYMBOL2(x,y,z) { (PRFuncPtr*) &mSymbols.f##x, { #x #y, #x #z, nullptr } }
#define EXT_SYMBOL3(x,y,z,w) { (PRFuncPtr*) &mSymbols.f##x, { #x #y, #x #z, #x #w, nullptr } }
#define END_SYMBOLS { nullptr, { nullptr } }
// clang-format on
// should match the order of GLExtensions, and be null-terminated.
static const char* const sExtensionNames[] = {
@ -383,6 +385,7 @@ GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
if (!MakeCurrent(true))
return false;
// clang-format off
const SymLoadStruct coreSymbols[] = {
{ (PRFuncPtr*) &mSymbols.fActiveTexture, { "ActiveTexture", "ActiveTextureARB", nullptr } },
{ (PRFuncPtr*) &mSymbols.fAttachShader, { "AttachShader", "AttachShaderARB", nullptr } },
@ -511,6 +514,7 @@ GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
END_SYMBOLS
};
// clang-format on
if (!LoadGLSymbols(this, prefix, trygl, coreSymbols, "GL"))
return false;
@ -587,9 +591,9 @@ GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
// Load OpenGL ES 2.0 symbols, or desktop if we aren't using ES 2.
if (mProfile == ContextProfile::OpenGLES) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fGetShaderPrecisionFormat, { "GetShaderPrecisionFormat", nullptr } },
{ (PRFuncPtr*) &mSymbols.fClearDepthf, { "ClearDepthf", nullptr } },
{ (PRFuncPtr*) &mSymbols.fDepthRangef, { "DepthRangef", nullptr } },
CORE_SYMBOL(GetShaderPrecisionFormat),
CORE_SYMBOL(ClearDepthf),
CORE_SYMBOL(DepthRangef),
END_SYMBOLS
};
@ -597,27 +601,27 @@ GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
return false;
} else {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fClearDepth, { "ClearDepth", nullptr } },
{ (PRFuncPtr*) &mSymbols.fDepthRange, { "DepthRange", nullptr } },
{ (PRFuncPtr*) &mSymbols.fReadBuffer, { "ReadBuffer", nullptr } },
{ (PRFuncPtr*) &mSymbols.fMapBuffer, { "MapBuffer", nullptr } },
{ (PRFuncPtr*) &mSymbols.fUnmapBuffer, { "UnmapBuffer", nullptr } },
{ (PRFuncPtr*) &mSymbols.fPointParameterf, { "PointParameterf", nullptr } },
{ (PRFuncPtr*) &mSymbols.fDrawBuffer, { "DrawBuffer", nullptr } },
CORE_SYMBOL(ClearDepth),
CORE_SYMBOL(DepthRange),
CORE_SYMBOL(ReadBuffer),
CORE_SYMBOL(MapBuffer),
CORE_SYMBOL(UnmapBuffer),
CORE_SYMBOL(PointParameterf),
CORE_SYMBOL(DrawBuffer),
// The following functions are only used by Skia/GL in desktop mode.
// Other parts of Gecko should avoid using these
{ (PRFuncPtr*) &mSymbols.fDrawBuffers, { "DrawBuffers", nullptr } },
{ (PRFuncPtr*) &mSymbols.fClientActiveTexture, { "ClientActiveTexture", nullptr } },
{ (PRFuncPtr*) &mSymbols.fDisableClientState, { "DisableClientState", nullptr } },
{ (PRFuncPtr*) &mSymbols.fEnableClientState, { "EnableClientState", nullptr } },
{ (PRFuncPtr*) &mSymbols.fLoadIdentity, { "LoadIdentity", nullptr } },
{ (PRFuncPtr*) &mSymbols.fLoadMatrixf, { "LoadMatrixf", nullptr } },
{ (PRFuncPtr*) &mSymbols.fMatrixMode, { "MatrixMode", nullptr } },
{ (PRFuncPtr*) &mSymbols.fPolygonMode, { "PolygonMode", nullptr } },
{ (PRFuncPtr*) &mSymbols.fTexGeni, { "TexGeni", nullptr } },
{ (PRFuncPtr*) &mSymbols.fTexGenf, { "TexGenf", nullptr } },
{ (PRFuncPtr*) &mSymbols.fTexGenfv, { "TexGenfv", nullptr } },
{ (PRFuncPtr*) &mSymbols.fVertexPointer, { "VertexPointer", nullptr } },
CORE_SYMBOL(DrawBuffers),
CORE_SYMBOL(ClientActiveTexture),
CORE_SYMBOL(DisableClientState),
CORE_SYMBOL(EnableClientState),
CORE_SYMBOL(LoadIdentity),
CORE_SYMBOL(LoadMatrixf),
CORE_SYMBOL(MatrixMode),
CORE_SYMBOL(PolygonMode),
CORE_SYMBOL(TexGeni),
CORE_SYMBOL(TexGenf),
CORE_SYMBOL(TexGenfv),
CORE_SYMBOL(VertexPointer),
END_SYMBOLS
};
@ -1040,13 +1044,13 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
if (IsSupported(GLFeature::sync)) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fFenceSync, { "FenceSync", nullptr } },
{ (PRFuncPtr*) &mSymbols.fIsSync, { "IsSync", nullptr } },
{ (PRFuncPtr*) &mSymbols.fDeleteSync, { "DeleteSync", nullptr } },
{ (PRFuncPtr*) &mSymbols.fClientWaitSync, { "ClientWaitSync", nullptr } },
{ (PRFuncPtr*) &mSymbols.fWaitSync, { "WaitSync", nullptr } },
{ (PRFuncPtr*) &mSymbols.fGetInteger64v, { "GetInteger64v", nullptr } },
{ (PRFuncPtr*) &mSymbols.fGetSynciv, { "GetSynciv", nullptr } },
CORE_SYMBOL(FenceSync),
CORE_SYMBOL(IsSync),
CORE_SYMBOL(DeleteSync),
CORE_SYMBOL(ClientWaitSync),
CORE_SYMBOL(WaitSync),
CORE_SYMBOL(GetInteger64v),
CORE_SYMBOL(GetSynciv),
END_SYMBOLS
};
fnLoadForFeature(symbols, GLFeature::sync);
@ -1063,7 +1067,7 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
if (IsExtensionSupported(APPLE_texture_range)) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fTextureRangeAPPLE, { "TextureRangeAPPLE", nullptr } },
CORE_SYMBOL(TextureRangeAPPLE),
END_SYMBOLS
};
fnLoadForExt(symbols, APPLE_texture_range);
@ -1071,13 +1075,15 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
if (IsExtensionSupported(APPLE_fence)) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fFinishObjectAPPLE, { "FinishObjectAPPLE", nullptr } },
{ (PRFuncPtr*) &mSymbols.fTestObjectAPPLE, { "TestObjectAPPLE", nullptr } },
CORE_SYMBOL(FinishObjectAPPLE),
CORE_SYMBOL(TestObjectAPPLE),
END_SYMBOLS
};
fnLoadForExt(symbols, APPLE_fence);
}
// clang-format off
if (IsSupported(GLFeature::vertex_array_object)) {
const SymLoadStruct coreSymbols[] = {
{ (PRFuncPtr*) &mSymbols.fIsVertexArray, { "IsVertexArray", nullptr } },
@ -1500,6 +1506,8 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
fnLoadForExt(symbols, NV_fence);
}
// clang-format off
if (IsExtensionSupported(NV_texture_barrier)) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fTextureBarrier, { "TextureBarrierNV", nullptr } },
@ -1510,7 +1518,7 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
if (IsSupported(GLFeature::read_buffer)) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fReadBuffer, { "ReadBuffer", nullptr } },
CORE_SYMBOL(ReadBuffer),
END_SYMBOLS
};
fnLoadForFeature(symbols, GLFeature::read_buffer);
@ -1518,7 +1526,7 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
if (IsExtensionSupported(APPLE_framebuffer_multisample)) {
const SymLoadStruct symbols[] = {
{ (PRFuncPtr*) &mSymbols.fResolveMultisampleFramebufferAPPLE, { "ResolveMultisampleFramebufferAPPLE", nullptr } },
CORE_SYMBOL(ResolveMultisampleFramebufferAPPLE),
END_SYMBOLS
};
fnLoadForExt(symbols, APPLE_framebuffer_multisample);
@ -1526,8 +1534,8 @@ GLContext::LoadMoreSymbols(const char* prefix, bool trygl)
// Load developer symbols, don't fail if we can't find them.
const SymLoadStruct devSymbols[] = {
{ (PRFuncPtr*) &mSymbols.fGetTexImage, { "GetTexImage", nullptr } },
{ (PRFuncPtr*) &mSymbols.fGetTexLevelParameteriv, { "GetTexLevelParameteriv", nullptr } },
CORE_SYMBOL(GetTexImage),
CORE_SYMBOL(GetTexLevelParameteriv),
END_SYMBOLS
};
const bool warnOnFailures = ShouldSpew();

Просмотреть файл

@ -20,6 +20,8 @@ bool CheckContextLost(const GLContext* gl);
// -
// clang-format off
// TODO: use official constant names instead of followed ones.
// IMG_texture_compression_pvrtc
@ -93,4 +95,6 @@ bool CheckContextLost(const GLContext* gl);
#define LOCAL_GL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
#define LOCAL_GL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
// clang-format on
#endif

Просмотреть файл

@ -55,6 +55,8 @@ class GLConstHeader:
'#ifndef GLCONSTS_H_',
'#define GLCONSTS_H_',
'',
'// clang-format off',
'',
'/**',
' * GENERATED FILE, DO NOT MODIFY DIRECTLY.',
' * This is a file generated directly from the official OpenGL registry',
@ -88,6 +90,8 @@ class GLConstHeader:
def formatFileEnd(self):
self.write([
'',
'// clang-format on',
'',
'#endif // GLCONSTS_H_'
])

Просмотреть файл

@ -26,7 +26,7 @@ load 1242093-1.html
load 1242778-1.png
load 1249576-1.png
load 1253362-1.html
load 1355898-1.html
skip-if(Android&&browserIsRemote) load 1355898-1.html # bug 1507207
load 1375842-1.html
load 1413762-1.gif
pref(image.downscale-during-decode.enabled,true) load 1443232-1.html

Просмотреть файл

@ -10,6 +10,7 @@
#include "mozilla/dom/CPOWManagerGetter.h"
#include "mozilla/dom/TabChild.h"
#include "jsfriendapi.h"
#include "js/Symbol.h"
#include "xpcprivate.h"
#include "WrapperFactory.h"
#include "mozilla/Preferences.h"

Просмотреть файл

@ -8,6 +8,7 @@
#ifndef js_MemoryFunctions_h
#define js_MemoryFunctions_h
#include "mozilla/Assertions.h" // MOZ_ASSERT
#include "mozilla/Attributes.h" // MOZ_MUST_USE
#include <stddef.h> // size_t
@ -15,6 +16,23 @@
#include "jstypes.h" // JS_PUBLIC_API
struct JSContext;
struct JSRuntime;
struct JSFreeOp
{
protected:
JSRuntime* runtime_;
explicit JSFreeOp(JSRuntime* rt)
: runtime_(rt)
{}
public:
JSRuntime* runtime() const {
MOZ_ASSERT(runtime_);
return runtime_;
}
};
extern JS_PUBLIC_API void*
JS_malloc(JSContext* cx, size_t nbytes);

114
js/public/Symbol.h Normal file
Просмотреть файл

@ -0,0 +1,114 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Symbols. */
#ifndef js_Symbol_h
#define js_Symbol_h
#include <stddef.h> // size_t
#include <stdint.h> // uintptr_t, uint32_t
#include "jstypes.h" // JS_PUBLIC_API
#include "js/RootingAPI.h" // JS::Handle
struct JSContext;
class JSString;
namespace JS {
class Symbol;
/**
* Create a new Symbol with the given description. This function never returns
* a Symbol that is in the Runtime-wide symbol registry.
*
* If description is null, the new Symbol's [[Description]] attribute is
* undefined.
*/
extern JS_PUBLIC_API Symbol*
NewSymbol(JSContext* cx, Handle<JSString*> description);
/**
* Symbol.for as specified in ES6.
*
* Get a Symbol with the description 'key' from the Runtime-wide symbol registry.
* If there is not already a Symbol with that description in the registry, a new
* Symbol is created and registered. 'key' must not be null.
*/
extern JS_PUBLIC_API Symbol*
GetSymbolFor(JSContext* cx, Handle<JSString*> key);
/**
* Get the [[Description]] attribute of the given symbol.
*
* This function is infallible. If it returns null, that means the symbol's
* [[Description]] is undefined.
*/
extern JS_PUBLIC_API JSString*
GetSymbolDescription(Handle<Symbol*> symbol);
/* Well-known symbols. */
#define JS_FOR_EACH_WELL_KNOWN_SYMBOL(MACRO) \
MACRO(isConcatSpreadable) \
MACRO(iterator) \
MACRO(match) \
MACRO(replace) \
MACRO(search) \
MACRO(species) \
MACRO(hasInstance) \
MACRO(split) \
MACRO(toPrimitive) \
MACRO(toStringTag) \
MACRO(unscopables) \
MACRO(asyncIterator)
enum class SymbolCode : uint32_t
{
// There is one SymbolCode for each well-known symbol.
#define JS_DEFINE_SYMBOL_ENUM(name) name,
JS_FOR_EACH_WELL_KNOWN_SYMBOL(JS_DEFINE_SYMBOL_ENUM) // SymbolCode::iterator, etc.
#undef JS_DEFINE_SYMBOL_ENUM
Limit,
WellKnownAPILimit = 0x80000000, // matches JS::shadow::Symbol::WellKnownAPILimit for inline use
InSymbolRegistry = 0xfffffffe, // created by Symbol.for() or JS::GetSymbolFor()
UniqueSymbol = 0xffffffff // created by Symbol() or JS::NewSymbol()
};
/* For use in loops that iterate over the well-known symbols. */
const size_t WellKnownSymbolLimit = size_t(SymbolCode::Limit);
/**
* Return the SymbolCode telling what sort of symbol `symbol` is.
*
* A symbol's SymbolCode never changes once it is created.
*/
extern JS_PUBLIC_API SymbolCode
GetSymbolCode(Handle<Symbol*> symbol);
/**
* Get one of the well-known symbols defined by ES6. A single set of well-known
* symbols is shared by all compartments in a JSRuntime.
*
* `which` must be in the range [0, WellKnownSymbolLimit).
*/
extern JS_PUBLIC_API Symbol*
GetWellKnownSymbol(JSContext* cx, SymbolCode which);
/**
* Return true if the given JSPropertySpec::name or JSFunctionSpec::name value
* is actually a symbol code and not a string. See JS_SYM_FN.
*/
inline bool
PropertySpecNameIsSymbol(const char* name)
{
uintptr_t u = reinterpret_cast<uintptr_t>(name);
return u != 0 && u - 1 < WellKnownSymbolLimit;
}
} // namespace JS
#endif /* js_Symbol_h */

Просмотреть файл

@ -481,18 +481,6 @@ union alignas(8) Value
void setObject(JSObject& obj) {
MOZ_ASSERT(js::gc::IsCellPointerValid(&obj));
// This should not be possible and is undefined behavior, but some
// ObjectValue(nullptr) are sneaking in. Try to catch them here, if
// indeed they are going through this code. I tested gcc, and it at
// least will *not* elide the null check even though it would be
// permitted according to the spec. The temporary is necessary to
// prevent gcc from helpfully pointing out that this code makes no
// sense.
#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
JSObject* testObj = &obj;
MOZ_DIAGNOSTIC_ASSERT(testObj != nullptr);
#endif
#if defined(JS_PUNBOX64)
// VisualStudio cannot contain parenthesized C++ style cast and shift
// inside decltype in template parameter:
@ -624,7 +612,7 @@ union alignas(8) Value
#if defined(JS_NUNBOX32)
return uint32_t(toTag()) <= uint32_t(JSVAL_TAG_CLEAR);
#elif defined(JS_PUNBOX64)
return (asBits_ | mozilla::DoubleTypeTraits::kSignBit) <= JSVAL_SHIFTED_TAG_MAX_DOUBLE;
return (asBits_ | mozilla::FloatingPoint<double>::kSignBit) <= JSVAL_SHIFTED_TAG_MAX_DOUBLE;
#endif
}
@ -1006,7 +994,7 @@ IsCanonicalized(double d)
uint64_t bits;
mozilla::BitwiseCast<uint64_t>(d, &bits);
return (bits & ~mozilla::DoubleTypeTraits::kSignBit) == detail::CanonicalizedNaNBits;
return (bits & ~mozilla::FloatingPoint<double>::kSignBit) == detail::CanonicalizedNaNBits;
}
static inline Value

Просмотреть файл

@ -6,6 +6,7 @@
#include "builtin/Symbol.h"
#include "js/Symbol.h"
#include "util/StringBuffer.h"
#include "vm/SymbolType.h"

Просмотреть файл

@ -11,6 +11,7 @@
#include "ctypes/CTypes.h"
#include "js/CharacterEncoding.h"
#include "js/MemoryFunctions.h"
#include "js/StableStringChars.h"
using JS::AutoStableStringChars;

Просмотреть файл

@ -9,10 +9,9 @@
#include "mozilla/Assertions.h" // MOZ_ASSERT
#include "jsapi.h" // JSFreeOp
#include "jit/ExecutableAllocator.h" // jit::JitPoisonRangeVector
#include "js/AllocPolicy.h" // SystemAllocPolicy
#include "js/MemoryFunctions.h" // JSFreeOp
#include "js/Utility.h" // AutoEnterOOMUnsafeRegion, js_free
#include "js/Vector.h" // js::Vector

Просмотреть файл

@ -132,7 +132,7 @@ class Summary(object):
if OPTIONS.write_failures:
try:
with open(OPTIONS.write_failures) as out:
with open(OPTIONS.write_failures, "w") as out:
for test in self.failures:
test.show(out)
except IOError as err:

Просмотреть файл

@ -2,6 +2,7 @@
#include "jsapi.h"
#include "js/HeapAPI.h"
#include "js/Symbol.h"
FRAGMENT(GCCellPtr, simple) {
JS::GCCellPtr nulll(nullptr);

Просмотреть файл

@ -1,6 +1,8 @@
#include "gdb-tests.h"
#include "jsapi.h"
#include "js/Symbol.h"
FRAGMENT(JSSymbol, simple) {
using namespace JS;

Просмотреть файл

@ -1,6 +1,8 @@
#include "gdb-tests.h"
#include "jsapi.h"
#include "js/Symbol.h"
FRAGMENT(jsid, simple) {
JS::Rooted<JSString*> string(cx, JS_NewStringCopyZ(cx, "moon"));
JS::Rooted<JSString*> interned(cx, JS_AtomizeAndPinJSString(cx, string));

Просмотреть файл

@ -1,6 +1,7 @@
#include "gdb-tests.h"
#include "jsapi.h"
#include "js/Symbol.h"
#ifdef ENABLE_BIGINT
#include "vm/BigIntType.h"
#endif

Просмотреть файл

@ -3,6 +3,7 @@
*/
#include "jsfriendapi.h"
#include "js/MemoryFunctions.h"
#include "jsapi-tests/tests.h"

Просмотреть файл

@ -5,6 +5,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "js/Symbol.h"
#include "jsapi-tests/tests.h"
BEGIN_TEST(testInformalValueTypeName)

Просмотреть файл

@ -11,6 +11,7 @@
#include "builtin/String.h"
#include "js/JSON.h"
#include "js/MemoryFunctions.h"
#include "js/Printf.h"
#include "jsapi-tests/tests.h"

Просмотреть файл

@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "js/CompilationAndEvaluation.h"
#include "js/MemoryFunctions.h"
#include "jsapi-tests/tests.h"
#include "vm/JSScript.h"

Просмотреть файл

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "js/Symbol.h"
#include "jsapi-tests/tests.h"
BEGIN_TEST(testSymbol_New)

Просмотреть файл

@ -60,11 +60,13 @@
#include "js/Initialization.h"
#include "js/JSON.h"
#include "js/LocaleSensitive.h"
#include "js/MemoryFunctions.h"
#include "js/Proxy.h"
#include "js/SliceBudget.h"
#include "js/SourceText.h"
#include "js/StableStringChars.h"
#include "js/StructuredClone.h"
#include "js/Symbol.h"
#include "js/Utility.h"
#include "js/Wrapper.h"
#include "util/CompleteFile.h"

Просмотреть файл

@ -34,7 +34,6 @@
#include "js/GCVector.h"
#include "js/HashTable.h"
#include "js/Id.h"
#include "js/MemoryFunctions.h"
#include "js/OffThreadScriptCompilation.h"
#include "js/Principals.h"
#include "js/Realm.h"
@ -49,6 +48,8 @@
/************************************************************************/
struct JSFreeOp;
namespace JS {
template<typename UnitT> class SourceText;
@ -163,22 +164,6 @@ class HandleValueArray
} /* namespace JS */
/************************************************************************/
struct JSFreeOp {
protected:
JSRuntime* runtime_;
explicit JSFreeOp(JSRuntime* rt)
: runtime_(rt) { }
public:
JSRuntime* runtime() const {
MOZ_ASSERT(runtime_);
return runtime_;
}
};
/* Callbacks and their arguments. */
/************************************************************************/
@ -4038,99 +4023,8 @@ JS_GetStringEncodingLength(JSContext* cx, JSString* str);
MOZ_MUST_USE JS_PUBLIC_API bool
JS_EncodeStringToBuffer(JSContext* cx, JSString* str, char* buffer, size_t length);
/************************************************************************/
/*
* Symbols
*/
namespace JS {
/**
* Create a new Symbol with the given description. This function never returns
* a Symbol that is in the Runtime-wide symbol registry.
*
* If description is null, the new Symbol's [[Description]] attribute is
* undefined.
*/
JS_PUBLIC_API Symbol*
NewSymbol(JSContext* cx, HandleString description);
/**
* Symbol.for as specified in ES6.
*
* Get a Symbol with the description 'key' from the Runtime-wide symbol registry.
* If there is not already a Symbol with that description in the registry, a new
* Symbol is created and registered. 'key' must not be null.
*/
JS_PUBLIC_API Symbol*
GetSymbolFor(JSContext* cx, HandleString key);
/**
* Get the [[Description]] attribute of the given symbol.
*
* This function is infallible. If it returns null, that means the symbol's
* [[Description]] is undefined.
*/
JS_PUBLIC_API JSString*
GetSymbolDescription(HandleSymbol symbol);
/* Well-known symbols. */
#define JS_FOR_EACH_WELL_KNOWN_SYMBOL(MACRO) \
MACRO(isConcatSpreadable) \
MACRO(iterator) \
MACRO(match) \
MACRO(replace) \
MACRO(search) \
MACRO(species) \
MACRO(hasInstance) \
MACRO(split) \
MACRO(toPrimitive) \
MACRO(toStringTag) \
MACRO(unscopables) \
MACRO(asyncIterator)
enum class SymbolCode : uint32_t {
// There is one SymbolCode for each well-known symbol.
#define JS_DEFINE_SYMBOL_ENUM(name) name,
JS_FOR_EACH_WELL_KNOWN_SYMBOL(JS_DEFINE_SYMBOL_ENUM) // SymbolCode::iterator, etc.
#undef JS_DEFINE_SYMBOL_ENUM
Limit,
WellKnownAPILimit = 0x80000000, // matches JS::shadow::Symbol::WellKnownAPILimit for inline use
InSymbolRegistry = 0xfffffffe, // created by Symbol.for() or JS::GetSymbolFor()
UniqueSymbol = 0xffffffff // created by Symbol() or JS::NewSymbol()
};
/* For use in loops that iterate over the well-known symbols. */
const size_t WellKnownSymbolLimit = size_t(SymbolCode::Limit);
/**
* Return the SymbolCode telling what sort of symbol `symbol` is.
*
* A symbol's SymbolCode never changes once it is created.
*/
JS_PUBLIC_API SymbolCode
GetSymbolCode(Handle<Symbol*> symbol);
/**
* Get one of the well-known symbols defined by ES6. A single set of well-known
* symbols is shared by all compartments in a JSRuntime.
*
* `which` must be in the range [0, WellKnownSymbolLimit).
*/
JS_PUBLIC_API Symbol*
GetWellKnownSymbol(JSContext* cx, SymbolCode which);
/**
* Return true if the given JSPropertySpec::name or JSFunctionSpec::name value
* is actually a symbol code and not a string. See JS_SYM_FN.
*/
inline bool
PropertySpecNameIsSymbol(const char* name)
{
uintptr_t u = reinterpret_cast<uintptr_t>(name);
return u != 0 && u - 1 < WellKnownSymbolLimit;
}
JS_PUBLIC_API bool
PropertySpecNameEqualsId(const char* name, HandleId id);

Просмотреть файл

@ -156,6 +156,7 @@ EXPORTS.js += [
'../public/Stream.h',
'../public/StructuredClone.h',
'../public/SweepingAPI.h',
'../public/Symbol.h',
'../public/TraceKind.h',
'../public/TraceLoggerAPI.h',
'../public/TracingAPI.h',

Просмотреть файл

@ -86,6 +86,7 @@
#include "js/GCVector.h"
#include "js/Initialization.h"
#include "js/JSON.h"
#include "js/MemoryFunctions.h"
#include "js/Printf.h"
#include "js/SourceText.h"
#include "js/StableStringChars.h"

Просмотреть файл

@ -35,6 +35,7 @@
#include "gc/GCInternals.h"
#include "js/CharacterEncoding.h"
#include "js/Printf.h"
#include "js/Symbol.h"
#include "util/StringBuffer.h"
#include "util/Text.h"
#include "vm/CodeCoverage.h"

Просмотреть файл

@ -22,6 +22,7 @@
#include "builtin/String.h"
#include "gc/Marking.h"
#include "js/CharacterEncoding.h"
#include "js/Symbol.h"
#include "util/Text.h"
#include "vm/JSContext.h"
#include "vm/SymbolType.h"

Просмотреть файл

@ -37,6 +37,7 @@
# include "js/Proxy.h" // For AutoEnterPolicy
#endif
#include "js/Stream.h"
#include "js/Symbol.h"
#include "js/UniquePtr.h"
#include "js/Utility.h"
#include "js/Vector.h"

Просмотреть файл

@ -27,6 +27,7 @@
#include "gc/Nursery.h"
#include "js/CharacterEncoding.h"
#include "js/StableStringChars.h"
#include "js/Symbol.h"
#include "js/UbiNode.h"
#include "util/StringBuffer.h"
#include "vm/GeckoProfiler.h"

Просмотреть файл

@ -19,6 +19,7 @@
#include "js/GCHashTable.h"
#include "js/HeapAPI.h"
#include "js/RootingAPI.h"
#include "js/Symbol.h"
#include "js/TypeDecls.h"
#include "js/Utility.h"
#include "vm/Printer.h"

Просмотреть файл

@ -8,8 +8,8 @@ crate-type = ["rlib"]
name = "baldrdash"
[dependencies]
cranelift-codegen = "0.23.0"
cranelift-wasm = "0.23.0"
cranelift-codegen = "0.25.0"
cranelift-wasm = "0.25.0"
target-lexicon = "0.2.0"
log = { version = "0.4.4", default-features = false, features = ["release_max_level_info"] }
env_logger = "0.5.6"

Просмотреть файл

@ -23,6 +23,7 @@
#include "jsapi.h"
#include "jsfriendapi.h"
#include "js/CharacterEncoding.h"
#include "js/MemoryFunctions.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/DOMException.h"

Просмотреть файл

@ -10,6 +10,7 @@
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/Attributes.h"
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
#include "js/Symbol.h"
using namespace mozilla::dom;
using namespace JS;

Просмотреть файл

@ -42,6 +42,7 @@
#include "nsCycleCollectionNoteRootCallback.h"
#include "nsCycleCollector.h"
#include "jsapi.h"
#include "js/MemoryFunctions.h"
#include "js/MemoryMetrics.h"
#include "js/UbiNode.h"
#include "js/UbiNodeUtils.h"

Просмотреть файл

@ -10,6 +10,7 @@
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
#include "nsWrapperCacheInlines.h"
#include "XPCLog.h"
#include "js/MemoryFunctions.h"
#include "js/Printf.h"
#include "jsfriendapi.h"
#include "AccessCheck.h"

Просмотреть файл

@ -13,6 +13,7 @@
#include "js/CharacterEncoding.h"
#include "js/Class.h"
#include "js/Printf.h"
#include "js/Symbol.h"
using namespace mozilla;
using namespace JS;

Просмотреть файл

@ -12,6 +12,7 @@
#include "mozilla/ErrorResult.h"
#include "jsapi.h"
#include "js/Symbol.h"
using namespace JS;
using namespace js;

Просмотреть файл

@ -6217,14 +6217,14 @@ nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState& aStat
// didn't want to stop at the block part of the split when figuring out
// initial parent, because that could screw up float parenting; it's easier
// to do this little fixup here instead.
if (aFrameList.NotEmpty() && !aFrameList.FirstChild()->IsInlineOutside()) {
if (aFrameList.NotEmpty() && aFrameList.FirstChild()->IsBlockOutside()) {
// See whether our trailing inline is empty
nsIFrame* firstContinuation = aParentFrame->FirstContinuation();
if (firstContinuation->PrincipalChildList().IsEmpty()) {
// Our trailing inline is empty. Collect our starting blocks from
// aFrameList, get the right parent frame for them, and put them in.
nsFrameList blockKids =
aFrameList.Split([](nsIFrame* f) { return f->IsInlineOutside();} );
aFrameList.Split([](nsIFrame* f) { return !f->IsBlockOutside();} );
NS_ASSERTION(blockKids.NotEmpty(), "No blocks?");
nsContainerFrame* prevBlock = GetIBSplitPrevSibling(firstContinuation);
@ -6237,7 +6237,7 @@ nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState& aStat
// We want to put some of the frames into this inline frame.
nsFrameList inlineKids =
aFrameList.Split([](nsIFrame* f) { return !f->IsInlineOutside(); });
aFrameList.Split([](nsIFrame* f) { return f->IsBlockOutside(); });
if (!inlineKids.IsEmpty()) {
AppendFrames(aParentFrame, kPrincipalList, inlineKids);
@ -11587,7 +11587,7 @@ nsCSSFrameConstructor::ConstructInline(nsFrameConstructorState& aState,
nsFrameList::FrameLinkEnumerator firstBlockEnumerator(childItems);
if (!aItem.mIsAllInline) {
firstBlockEnumerator.Find(
[](nsIFrame* aFrame) { return !aFrame->IsInlineOutside(); });
[](nsIFrame* aFrame) { return aFrame->IsBlockOutside(); });
}
if (aItem.mIsAllInline || firstBlockEnumerator.AtEnd()) {
@ -11648,7 +11648,7 @@ nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState& aState,
// On entry to this loop aChildItems is not empty and the first frame in it
// is block-level.
MOZ_ASSERT(aChildItems.NotEmpty(), "Should have child items");
MOZ_ASSERT(!aChildItems.FirstChild()->IsInlineOutside(),
MOZ_ASSERT(aChildItems.FirstChild()->IsBlockOutside(),
"Must have list starting with block");
// The initial run of blocks belongs to an anonymous block that we create
@ -11660,7 +11660,7 @@ nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState& aState,
// Find the first non-block child which defines the end of our block kids
// and the start of our next inline's kids
nsFrameList blockKids =
aChildItems.Split([](nsIFrame* f) { return f->IsInlineOutside(); });
aChildItems.Split([](nsIFrame* f) { return !f->IsBlockOutside(); });
if (!StaticPrefs::layout_css_column_span_enabled() ||
!aInitialInline->HasAnyStateBits(NS_FRAME_HAS_MULTI_COLUMN_ANCESTOR)) {
@ -11702,7 +11702,7 @@ nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState& aState,
if (aChildItems.NotEmpty()) {
nsFrameList inlineKids =
aChildItems.Split([](nsIFrame* f) { return !f->IsInlineOutside(); });
aChildItems.Split([](nsIFrame* f) { return f->IsBlockOutside(); });
MoveChildrenTo(aInitialInline, inlineFrame, inlineKids);
}

Просмотреть файл

@ -569,7 +569,7 @@ load 927558.html
load 943509-1.html
load 944909-1.html
load 946167-1.html
load 947158.html
skip-if(Android&&browserIsRemote) load 947158.html # bug 1507207
load 949932.html
load 963878.html
load 964078.html

Просмотреть файл

@ -372,10 +372,6 @@ public:
, mValid(true)
{}
bool ObservesReflow() override {
return false;
}
protected:
void OnRenderingChange() override;
@ -466,7 +462,7 @@ SVGMarkerObserver::OnRenderingChange()
}
class nsSVGPaintingProperty final : public nsSVGRenderingObserverProperty
class nsSVGPaintingProperty : public nsSVGRenderingObserverProperty
{
public:
nsSVGPaintingProperty(URLAndReferrerInfo* aURI, nsIFrame* aFrame, bool aReferenceImage)
@ -498,6 +494,24 @@ nsSVGPaintingProperty::OnRenderingChange()
}
class SVGMozElementObserver final : public nsSVGPaintingProperty
{
public:
SVGMozElementObserver(URLAndReferrerInfo* aURI, nsIFrame* aFrame,
bool aReferenceImage)
: nsSVGPaintingProperty(aURI, aFrame, aReferenceImage)
{}
// We only return true here because GetAndObserveBackgroundImage uses us
// to implement observing of arbitrary elements (including HTML elements)
// that may require us to repaint if the referenced element is reflowed.
// Bug 1496065 has been filed to remove that support though.
bool ObservesReflow() override {
return true;
}
};
/**
* In a filter chain, there can be multiple SVG reference filters.
* e.g. filter: url(#svg-filter-1) blur(10px) url(#svg-filter-2);
@ -1470,10 +1484,10 @@ SVGObserverUtils::GetAndObserveBackgroundImage(nsIFrame* aFrame,
// XXXjwatt: this is broken - we're using the address of a new
// URLAndReferrerInfo as the hash key every time!
nsSVGPaintingProperty* observer =
static_cast<nsSVGPaintingProperty*>(hashtable->GetWeak(url));
SVGMozElementObserver* observer =
static_cast<SVGMozElementObserver*>(hashtable->GetWeak(url));
if (!observer) {
observer = new nsSVGPaintingProperty(url, aFrame, /* aWatchImage */ true);
observer = new SVGMozElementObserver(url, aFrame, /* aWatchImage */ true);
hashtable->Put(url, observer);
}
return observer->GetAndObserveReferencedElement();

Просмотреть файл

@ -145,7 +145,7 @@ public:
Element* GetAndObserveReferencedElement();
virtual bool ObservesReflow() { return true; }
virtual bool ObservesReflow() { return false; }
protected:
void StartObserving();
@ -403,6 +403,13 @@ public:
static void
RemoveTemplateObserver(nsIFrame* aFrame);
/**
* Gets an arbitrary element and starts observing it. Used to implement
* '-moz-element'.
*
* Note that bug 1496065 has been filed to remove support for referencing
* arbitrary elements using '-moz-element'.
*/
static Element*
GetAndObserveBackgroundImage(nsIFrame* aFrame,
const nsAtom* aHref);

Просмотреть файл

@ -1513,7 +1513,8 @@ TextNodeCorrespondenceRecorder::TraverseAndRecord(nsIFrame* aFrame)
}
// Each whole nsTextNode we find before we get to the text node for
// the current text frame must be undisplayed.
while (mNodeIterator.Current() != node) {
while (mNodeIterator.Current() &&
mNodeIterator.Current() != node) {
undisplayed += mNodeIterator.Current()->TextLength();
NextNode();
}

Просмотреть файл

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg">
<style>textPath { display: contents; }</style>
<text>x<textPath><textPath><tspan>y</tspan></textPath></textPath></text>
</svg>

После

Ширина:  |  Высота:  |  Размер: 174 B

Просмотреть файл

@ -218,3 +218,4 @@ load grouping-empty-bounds.html
load 1480275.html
load 1480224.html
load 1502936.html
load 1504918.svg

Просмотреть файл

@ -141,7 +141,7 @@ load 580481-1.xhtml
asserts(1) load 595758-1.xhtml # Bug 714667
load 595758-2.xhtml
load 678447-1.html
load 691824-1.xhtml
skip-if(Android&&browserIsRemote) load 691824-1.xhtml # bug 1507207
load 695430-1.html
load 696640-1.html
load 696640-2.html

Просмотреть файл

@ -142,6 +142,10 @@ class ReftestRunner(MozbuildObject):
if not args.adb_path:
args.adb_path = get_adb_path(self)
if 'geckoview' not in args.app:
args.e10s = False
print("using e10s=False for non-geckoview app")
# A symlink and some path manipulations are required so that test
# manifests can be found both locally and remotely (via a url)
# using the same relative path.

Просмотреть файл

@ -485,7 +485,4 @@ class RemoteArgumentsParser(ReftestArgumentsParser):
if not options.httpdPath:
options.httpdPath = os.path.join(options.utilityPath, "components")
# Disable e10s by default on Android because we don't run Android
# e10s jobs anywhere yet.
options.e10s = False
return options

Просмотреть файл

@ -176,9 +176,12 @@ class RemoteReftest(RefTest):
# RemoteAutomation.py's 'messageLogger' is also used by mochitest. Mimic a mochitest
# MessageLogger object to re-use this code path.
self.outputHandler.write = self.outputHandler.__call__
self.automation = RemoteAutomation(self.device, options.app, self.remoteProfile,
options.remoteLogFile, processArgs=None)
self.automation._processArgs['messageLogger'] = self.outputHandler
args = {'messageLogger': self.outputHandler}
self.automation = RemoteAutomation(self.device,
appName=options.app,
remoteProfile=self.remoteProfile,
remoteLog=options.remoteLogFile,
processArgs=args)
self.environment = self.automation.environment
if self.automation.IS_DEBUG_BUILD:
@ -375,7 +378,8 @@ class RemoteReftest(RefTest):
xrePath=options.xrePath,
debuggerInfo=debuggerInfo,
symbolsPath=symbolsPath,
timeout=timeout)
timeout=timeout,
e10s=options.e10s)
self.cleanup(profile.profile)
return status

Просмотреть файл

@ -37,33 +37,38 @@ namespace mozilla {
* compiler bustage, particularly PGO-specific bustage.
*/
struct FloatTypeTraits
namespace detail {
/*
* These implementations assume float/double are 32/64-bit single/double
* format number types compatible with the IEEE-754 standard. C++ doesn't
* require this, but we required it in implementations of these algorithms that
* preceded this header, so we shouldn't break anything to continue doing so.
*/
template<typename T>
struct FloatingPointTrait;
template<>
struct FloatingPointTrait<float>
{
protected:
using Bits = uint32_t;
static constexpr unsigned kExponentBias = 127;
static constexpr unsigned kExponentShift = 23;
static constexpr Bits kSignBit = 0x80000000UL;
static constexpr Bits kExponentBits = 0x7F800000UL;
static constexpr Bits kSignificandBits = 0x007FFFFFUL;
static constexpr unsigned kExponentWidth = 8;
static constexpr unsigned kSignificandWidth = 23;
};
struct DoubleTypeTraits
template<>
struct FloatingPointTrait<double>
{
protected:
using Bits = uint64_t;
static constexpr unsigned kExponentBias = 1023;
static constexpr unsigned kExponentShift = 52;
static constexpr Bits kSignBit = 0x8000000000000000ULL;
static constexpr Bits kExponentBits = 0x7ff0000000000000ULL;
static constexpr Bits kSignificandBits = 0x000fffffffffffffULL;
static constexpr unsigned kExponentWidth = 11;
static constexpr unsigned kSignificandWidth = 52;
};
template<typename T> struct SelectTrait;
template<> struct SelectTrait<float> : public FloatTypeTraits {};
template<> struct SelectTrait<double> : public DoubleTypeTraits {};
} // namespace detail
/*
* This struct contains details regarding the encoding of floating-point
@ -92,30 +97,65 @@ template<> struct SelectTrait<double> : public DoubleTypeTraits {};
* http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers
*/
template<typename T>
struct FloatingPoint : public SelectTrait<T>
struct FloatingPoint final : private detail::FloatingPointTrait<T>
{
using Base = SelectTrait<T>;
private:
using Base = detail::FloatingPointTrait<T>;
public:
/**
* An unsigned integral type suitable for accessing the bitwise representation
* of T.
*/
using Bits = typename Base::Bits;
static_assert((Base::kSignBit & Base::kExponentBits) == 0,
static_assert(sizeof(T) == sizeof(Bits), "Bits must be same size as T");
/** The bit-width of the exponent component of T. */
using Base::kExponentWidth;
/** The bit-width of the significand component of T. */
using Base::kSignificandWidth;
static_assert(1 + kExponentWidth + kSignificandWidth ==
CHAR_BIT * sizeof(T),
"sign bit plus bit widths should sum to overall bit width");
/**
* The exponent field in an IEEE-754 floating point number consists of bits
* encoding an unsigned number. The *actual* represented exponent (for all
* values finite and not denormal) is that value, minus a bias |kExponentBias|
* so that a useful range of numbers is represented.
*/
static constexpr unsigned kExponentBias = (1U << (kExponentWidth - 1)) - 1;
/**
* The amount by which the bits of the exponent-field in an IEEE-754 floating
* point number are shifted from the LSB of the floating point type.
*/
static constexpr unsigned kExponentShift = kSignificandWidth;
/** The sign bit in the floating point representation. */
static constexpr Bits kSignBit =
static_cast<Bits>(1) << (CHAR_BIT * sizeof(Bits) - 1);
/** The exponent bits in the floating point representation. */
static constexpr Bits kExponentBits =
((static_cast<Bits>(1) << kExponentWidth) - 1) << kSignificandWidth;
/** The significand bits in the floating point representation. */
static constexpr Bits kSignificandBits =
(static_cast<Bits>(1) << kSignificandWidth) - 1;
static_assert((kSignBit & kExponentBits) == 0,
"sign bit shouldn't overlap exponent bits");
static_assert((Base::kSignBit & Base::kSignificandBits) == 0,
static_assert((kSignBit & kSignificandBits) == 0,
"sign bit shouldn't overlap significand bits");
static_assert((Base::kExponentBits & Base::kSignificandBits) == 0,
static_assert((kExponentBits & kSignificandBits) == 0,
"exponent bits shouldn't overlap significand bits");
static_assert((Base::kSignBit | Base::kExponentBits | Base::kSignificandBits) ==
~Bits(0),
static_assert((kSignBit | kExponentBits | kSignificandBits) == ~Bits(0),
"all bits accounted for");
/*
* These implementations assume float/double are 32/64-bit single/double
* format number types compatible with the IEEE-754 standard. C++ don't
* require this to be the case. But we required this in implementations of
* these algorithms that preceded this header, so we shouldn't break anything
* if we keep doing so.
*/
static_assert(sizeof(T) == sizeof(Bits), "Bits must be same size as T");
};
/** Determines whether a float/double is NaN. */

Просмотреть файл

@ -616,9 +616,6 @@ public class BrowserApp extends GeckoApp
public void onCreate(Bundle savedInstanceState) {
final Context appContext = getApplicationContext();
final Intent killerIntent = new Intent(this, FennecKiller.class);
startService(killerIntent);
showSplashScreen = true;
safeStartingIntent = new SafeIntent(getIntent());
@ -1026,6 +1023,9 @@ public class BrowserApp extends GeckoApp
return;
}
final Intent killerIntent = new Intent(this, FennecKiller.class);
startService(killerIntent);
if (!mHasResumed) {
getAppEventDispatcher().unregisterUiThreadListener(this, "Prompt:ShowTop");
mHasResumed = true;

Просмотреть файл

@ -992,7 +992,6 @@ pref("ui.scrollToClick", 0);
// provide ability to turn on support for canvas focus rings
pref("canvas.focusring.enabled", true);
pref("canvas.customfocusring.enabled", false);
pref("canvas.hitregions.enabled", false);
pref("canvas.filters.enabled", true);
// Add support for canvas path objects

Просмотреть файл

@ -1,4 +1,4 @@
load 675518.html
skip-if(Android&&browserIsRemote) load 675518.html
load 785753-1.html
load 785753-2.html
load 1274044-1.html

Просмотреть файл

@ -78,6 +78,7 @@ class TestManifestBackend(PartialBackend):
key = path[len(topsrcdir)+1:]
t['file_relpath'] = key
t['dir_relpath'] = mozpath.dirname(key)
t['srcdir_relpath'] = key
self.tests_by_path[key].append(t)

Просмотреть файл

@ -6,6 +6,7 @@
from __future__ import absolute_import, print_function, unicode_literals
import json
import logging
import requests
@ -140,7 +141,10 @@ def backfill_action(parameters, graph_config, input, task_group_id, task_id, tas
if gpu_required:
verify_args.append('--gpu-required')
task.task['payload']['env']['MOZHARNESS_TEST_PATHS'] = input.get('testPath')
if 'testPath' in input:
task.task['payload']['env']['MOZHARNESS_TEST_PATHS'] = json.dums({
task.task['extra']['suite']['flavor']: input['testPath']
})
cmd_parts = task.task['payload']['command']
keep_args = ['--installer-url', '--download-symbols', '--test-packages-url']

Просмотреть файл

@ -205,7 +205,7 @@ test_description_schema = Schema({
'test-platform', 'project',
Any(bool, 'both')),
# Whether to run this task with e10s (desktop-test only). If false, run
# Whether to run this task with e10s. If false, run
# without e10s; if true, run with e10s; if 'both', run one task with and
# one task without e10s. E10s tasks have "-e10s" appended to the test name
# and treeherder group.
@ -429,7 +429,7 @@ def set_defaults(config, tests):
# all Android test tasks download internal objects from tooltool
test['mozharness']['tooltool-downloads'] = True
test['mozharness']['actions'] = ['get-secrets']
# Android doesn't do e10s
# Fennec is non-e10s; geckoview handled in set_target
test['e10s'] = False
# loopback-video is always true for Android, but false for other
# platform phyla
@ -551,6 +551,8 @@ def set_target(config, tests):
if 'target' in test:
resolve_keyed_by(test, 'target', item_name=test['test-name'])
target = test['target']
if target and 'geckoview' in target:
test['e10s'] = True
if not target:
if build_platform.startswith('macosx'):
target = 'target.dmg'

Просмотреть файл

@ -4,6 +4,8 @@
from __future__ import absolute_import, print_function, unicode_literals
import itertools
import json
import logging
import math
@ -47,9 +49,10 @@ def perfile_number_of_chunks(is_try, try_task_config, head_repository, head_rev,
return 1
changed_files = set()
specified_files = []
if try_task_config:
specified_files = try_task_config.split(":")
suite_to_paths = json.loads(try_task_config)
specified_files = itertools.chain.from_iterable(suite_to_paths.values())
changed_files.update(specified_files)
if is_try:
changed_files.update(files_changed.get_locally_changed_files(GECKO))
@ -57,7 +60,6 @@ def perfile_number_of_chunks(is_try, try_task_config, head_repository, head_rev,
changed_files.update(files_changed.get_changed_files(head_repository,
head_rev))
changed_files.update(specified_files)
test_count = 0
for pattern in file_patterns:
for path in changed_files:

Просмотреть файл

@ -122,8 +122,10 @@ class TestScreenCaptureChrome(WindowManagerMixin, ScreenCaptureTestCase):
def setUp(self):
super(TestScreenCaptureChrome, self).setUp()
self.marionette.set_context("chrome")
self.marionette.set_pref("marionette.log.truncate", False)
def tearDown(self):
self.marionette.clear_pref("marionette.log.truncate")
self.close_all_windows()
super(TestScreenCaptureChrome, self).tearDown()

Просмотреть файл

@ -177,6 +177,11 @@ class MochitestRunner(MozbuildObject):
manifest.tests.extend(tests)
options.manifestFile = manifest
# Firefox for Android doesn't use e10s
if options.app is None or 'geckoview' not in options.app:
options.e10s = False
print("using e10s=False for non-geckoview app")
return runtestsremote.run_test_harness(parser, options)
def run_geckoview_junit_test(self, context, **kwargs):
@ -208,6 +213,10 @@ class MochitestRunner(MozbuildObject):
manifest.tests.extend(tests)
options.manifestFile = manifest
# robocop only used for Firefox for Android - non-e10s
options.e10s = False
print("using e10s=False for robocop")
return runrobocop.run_test_harness(parser, options)
# parser

Просмотреть файл

@ -997,11 +997,6 @@ class AndroidArguments(ArgumentContainer):
"The directory for the coverage output does not exist: %s" %
parent_dir)
# Disable e10s by default on Android because we don't run Android
# e10s jobs anywhere yet.
options.e10s = False
mozinfo.update({'e10s': options.e10s})
# allow us to keep original application around for cleanup while
# running robocop via 'am'
options.remoteappname = options.app

Просмотреть файл

@ -2077,7 +2077,8 @@ toolbar#nav-bar {
detectShutdownLeaks=False,
screenshotOnFail=False,
bisectChunk=None,
marionette_args=None):
marionette_args=None,
e10s=True):
"""
Run the app, log the duration it took to execute, return the status code.
Kills the app if it runs for longer than |maxTime| seconds, or outputs nothing
@ -2779,6 +2780,7 @@ toolbar#nav-bar {
screenshotOnFail=options.screenshotOnFail,
bisectChunk=options.bisectChunk,
marionette_args=marionette_args,
e10s=options.e10s
)
status = ret or status
except KeyboardInterrupt:

Просмотреть файл

@ -1438,7 +1438,15 @@ class ADBDevice(ADBCommand):
"WifiMonitor:S",
"WifiStateTracker:S",
"wpa_supplicant:S",
"NetworkStateTracker:S"],
"NetworkStateTracker:S",
"EmulatedCamera_Camera:S",
"EmulatedCamera_Device:S",
"EmulatedCamera_FakeCamera:S",
"EmulatedCamera_FakeDevice:S",
"EmulatedCamera_CallbackNotifier:S",
"GnssLocationProvider:S",
"Hyphenator:S",
"BatteryStats:S"],
format="time",
filter_out_regexps=[],
timeout=None,

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше