chore: add deprecation warning on setting app.allowRendererProcessReuse to false (#22337)

* chore: add deprecation warning on setting app.allowRendererProcessReuse to false

* fix: no deprecation warnings in process reuse spec

* chore: add test for new deprecate removeProperty behavior
This commit is contained in:
Samuel Attard 2020-02-26 14:03:52 -08:00 committed by GitHub
parent 6a01898c76
commit 12c1d4411d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 7 deletions

View file

@ -117,6 +117,10 @@ deprecate.fnToProperty(App.prototype, 'accessibilitySupportEnabled', '_isAccessi
deprecate.fnToProperty(App.prototype, 'badgeCount', '_getBadgeCount', '_setBadgeCount') deprecate.fnToProperty(App.prototype, 'badgeCount', '_getBadgeCount', '_setBadgeCount')
deprecate.fnToProperty(App.prototype, 'name', '_getName', '_setName') deprecate.fnToProperty(App.prototype, 'name', '_getName', '_setName')
// Deprecate allowRendererProcessReuse but only if they set it to false, no need to log if
// they are setting it to true
deprecate.removeProperty(app, 'allowRendererProcessReuse', [false])
// Wrappers for native classes. // Wrappers for native classes.
const { DownloadItem } = process.electronBinding('download_item') const { DownloadItem } = process.electronBinding('download_item')
Object.setPrototypeOf(DownloadItem.prototype, EventEmitter.prototype) Object.setPrototypeOf(DownloadItem.prototype, EventEmitter.prototype)

View file

@ -94,24 +94,31 @@ const deprecate: ElectronInternal.DeprecationUtil = {
}, },
// remove a property with no replacement // remove a property with no replacement
removeProperty: (o, removedName) => { removeProperty: (o, removedName, onlyForValues) => {
// if the property's already been removed, warn about it // if the property's already been removed, warn about it
if (!(removedName in o)) { const info = Object.getOwnPropertyDescriptor((o as any).__proto__, removedName) // eslint-disable-line
if (!info) {
deprecate.log(`Unable to remove property '${removedName}' from an object that lacks it.`) deprecate.log(`Unable to remove property '${removedName}' from an object that lacks it.`)
return o
}
if (!info.get || !info.set) {
deprecate.log(`Unable to remove property '${removedName}' from an object does not have a getter / setter`)
return o
} }
// wrap the deprecated property in an accessor to warn // wrap the deprecated property in an accessor to warn
const warn = warnOnce(removedName) const warn = warnOnce(removedName)
let val = o[removedName]
return Object.defineProperty(o, removedName, { return Object.defineProperty(o, removedName, {
configurable: true, configurable: true,
get: () => { get: () => {
warn() warn()
return val return info.get!.call(o)
}, },
set: newVal => { set: newVal => {
warn() if (!onlyForValues || onlyForValues.includes(newVal)) {
val = newVal warn()
}
return info.set!.call(o, newVal)
} }
}) })
}, },

View file

@ -83,6 +83,30 @@ describe('deprecate', () => {
expect(msg).to.include(prop) expect(msg).to.include(prop)
}) })
it('deprecates a property of an but retains the existing accessors and setters', () => {
let msg
deprecate.setHandler(m => { msg = m })
const prop = 'itMustGo'
let i = 1
const o = {
get itMustGo () {
return i
},
set itMustGo (thing) {
i = thing + 1
}
}
deprecate.removeProperty(o, prop)
expect(o[prop]).to.equal(1)
expect(msg).to.be.a('string')
expect(msg).to.include(prop)
o[prop] = 2
expect(o[prop]).to.equal(3)
})
it('warns exactly once when a function is deprecated with no replacement', () => { it('warns exactly once when a function is deprecated with no replacement', () => {
let msg let msg
deprecate.setHandler(m => { msg = m }) deprecate.setHandler(m => { msg = m })

View file

@ -1,6 +1,8 @@
const { app, BrowserWindow, ipcMain } = require('electron') const { app, BrowserWindow, ipcMain } = require('electron')
const path = require('path') const path = require('path')
process.noDeprecation = true
process.on('uncaughtException', (e) => { process.on('uncaughtException', (e) => {
console.error(e) console.error(e)
process.exit(1) process.exit(1)

View file

@ -87,7 +87,7 @@ declare namespace ElectronInternal {
renameFunction(fn: Function, newName: string | Function): Function; renameFunction(fn: Function, newName: string | Function): Function;
event(emitter: NodeJS.EventEmitter, oldName: string, newName: string): void; event(emitter: NodeJS.EventEmitter, oldName: string, newName: string): void;
fnToProperty(module: any, prop: string, getter: string, setter?: string): void; fnToProperty(module: any, prop: string, getter: string, setter?: string): void;
removeProperty<T, K extends (keyof T & string)>(object: T, propertyName: K): T; removeProperty<T, K extends (keyof T & string)>(object: T, propertyName: K, onlyForValues?: any[]): T;
renameProperty<T, K extends (keyof T & string)>(object: T, oldName: string, newName: K): T; renameProperty<T, K extends (keyof T & string)>(object: T, oldName: string, newName: K): T;
moveAPI(fn: Function, oldUsage: string, newUsage: string): Function; moveAPI(fn: Function, oldUsage: string, newUsage: string): Function;
} }