зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-inbound to mozilla-central. a=merge
This commit is contained in:
Коммит
e1e8f2ea69
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
110
js/src/jsapi.h
110
js/src/jsapi.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,
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче