2020-08-26 16:34:29 +00:00
import { BrowserWindow , app } from 'electron/main' ;
2020-04-07 00:04:09 +00:00
import { shell } from 'electron/common' ;
2019-09-04 18:12:31 +00:00
import { closeAllWindows } from './window-helpers' ;
import { emittedOnce } from './events-helpers' ;
2021-04-27 21:35:31 +00:00
import { ifit } from './spec-helpers' ;
2019-09-04 18:12:31 +00:00
import * as http from 'http' ;
2020-08-26 16:34:29 +00:00
import * as fs from 'fs-extra' ;
import * as path from 'path' ;
2019-09-04 18:12:31 +00:00
import { AddressInfo } from 'net' ;
2020-08-26 16:34:29 +00:00
import { expect } from 'chai' ;
2019-09-04 18:12:31 +00:00
describe ( 'shell module' , ( ) = > {
describe ( 'shell.openExternal()' , ( ) = > {
let envVars : Record < string , string | undefined > = { } ;
beforeEach ( function ( ) {
envVars = {
display : process.env.DISPLAY ,
de : process.env.DE ,
browser : process.env.BROWSER
} ;
} ) ;
afterEach ( async ( ) = > {
// reset env vars to prevent side effects
if ( process . platform === 'linux' ) {
process . env . DE = envVars . de ;
process . env . BROWSER = envVars . browser ;
process . env . DISPLAY = envVars . display ;
}
} ) ;
afterEach ( closeAllWindows ) ;
it ( 'opens an external link' , async ( ) = > {
let url = 'http://127.0.0.1' ;
2021-01-22 19:25:47 +00:00
let requestReceived : Promise < any > ;
2019-09-04 18:12:31 +00:00
if ( process . platform === 'linux' ) {
process . env . BROWSER = '/bin/true' ;
process . env . DE = 'generic' ;
process . env . DISPLAY = '' ;
requestReceived = Promise . resolve ( ) ;
} else if ( process . platform === 'darwin' ) {
// On the Mac CI machines, Safari tries to ask for a password to the
// code signing keychain we set up to test code signing (see
// https://github.com/electron/electron/pull/19969#issuecomment-526278890),
// so use a blur event as a crude proxy.
const w = new BrowserWindow ( { show : true } ) ;
requestReceived = emittedOnce ( w , 'blur' ) ;
} else {
const server = http . createServer ( ( req , res ) = > {
res . end ( ) ;
} ) ;
2021-01-22 19:25:47 +00:00
await new Promise < void > ( resolve = > server . listen ( 0 , '127.0.0.1' , resolve ) ) ;
requestReceived = new Promise < void > ( resolve = > server . on ( 'connection' , ( ) = > resolve ( ) ) ) ;
2019-09-04 18:12:31 +00:00
url = ` http://127.0.0.1: ${ ( server . address ( ) as AddressInfo ) . port } ` ;
}
2021-01-22 19:25:47 +00:00
await Promise . all < void > ( [
2019-09-04 18:12:31 +00:00
shell . openExternal ( url ) ,
requestReceived
] ) ;
} ) ;
} ) ;
2020-08-26 16:34:29 +00:00
2020-09-02 17:32:33 +00:00
describe ( 'shell.trashItem()' , ( ) = > {
2021-04-22 20:46:41 +00:00
afterEach ( closeAllWindows ) ;
2020-09-02 17:32:33 +00:00
it ( 'moves an item to the trash' , async ( ) = > {
const dir = await fs . mkdtemp ( path . resolve ( app . getPath ( 'temp' ) , 'electron-shell-spec-' ) ) ;
const filename = path . join ( dir , 'temp-to-be-deleted' ) ;
await fs . writeFile ( filename , 'dummy-contents' ) ;
await shell . trashItem ( filename ) ;
expect ( fs . existsSync ( filename ) ) . to . be . false ( ) ;
} ) ;
it ( 'throws when called with a nonexistent path' , async ( ) = > {
const filename = path . join ( app . getPath ( 'temp' ) , 'does-not-exist' ) ;
await expect ( shell . trashItem ( filename ) ) . to . eventually . be . rejected ( ) ;
} ) ;
2021-04-22 20:46:41 +00:00
2021-04-27 21:35:31 +00:00
ifit ( ! ( process . platform === 'win32' && process . arch === 'ia32' ) ) ( 'works in the renderer process' , async ( ) = > {
2021-04-22 20:46:41 +00:00
const w = new BrowserWindow ( { show : false , webPreferences : { nodeIntegration : true , contextIsolation : false } } ) ;
w . loadURL ( 'about:blank' ) ;
await expect ( w . webContents . executeJavaScript ( 'require(\'electron\').shell.trashItem(\'does-not-exist\')' ) ) . to . be . rejectedWith ( /does-not-exist|Failed to move item|Failed to create FileOperation/ ) ;
} ) ;
2020-09-02 17:32:33 +00:00
} ) ;
2019-11-01 20:37:02 +00:00
} ) ;