2019-11-20 14:18:05 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ * *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Copyright  2017  Google  Inc .  All  rights  reserved . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Modifications  copyright  ( c )  Microsoft  Corporation . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Licensed  under  the  Apache  License ,  Version  2.0  ( the  "License" ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  you  may  not  use  this  file  except  in  compliance  with  the  License . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  You  may  obtain  a  copy  of  the  License  at 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *      http : //www.apache.org/licenses/LICENSE-2.0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Unless  required  by  applicable  law  or  agreed  to  in  writing ,  software 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  distributed  under  the  License  is  distributed  on  an  "AS IS"  BASIS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  WITHOUT  WARRANTIES  OR  CONDITIONS  OF  ANY  KIND ,  either  express  or  implied . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  See  the  License  for  the  specific  language  governing  permissions  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  limitations  under  the  License . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-08 15:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  { FFOX ,  CHROMIUM ,  WEBKIT }  =  require ( './utils' ) . testOptions ( browserType ) ;  
						 
					
						
							
								
									
										
										
										
											2019-11-18 18:18:28 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-08 15:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								describe ( 'Workers' ,  function ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'Page.workers' ,  async  function ( { page ,  server } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  Promise . all ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . waitForEvent ( 'worker' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . goto ( server . PREFIX  +  '/worker/worker.html' ) ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  worker  =  page . workers ( ) [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( worker . url ( ) ) . toContain ( 'worker.js' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-18 18:18:28 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-08 15:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    expect ( await  worker . evaluate ( ( )  =>  self [ 'workerFunction' ] ( ) ) ) . toBe ( 'worker function result' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-18 18:18:28 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-08 15:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( page . workers ( ) . length ) . toBe ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should emit created and destroyed events' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerCreatedPromise  =  page . waitForEvent ( 'worker' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerObj  =  await  page . evaluateHandle ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ '1' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  worker  =  await  workerCreatedPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerThisObj  =  await  worker . evaluateHandle ( ( )  =>  this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerDestroyedPromise  =  new  Promise ( x  =>  worker . once ( 'close' ,  x ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . evaluate ( workerObj  =>  workerObj . terminate ( ) ,  workerObj ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( await  workerDestroyedPromise ) . toBe ( worker ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  error  =  await  workerThisObj . getProperty ( 'self' ) . catch ( error  =>  error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( error . message ) . toContain ( 'Most likely the worker has been closed.' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should report console logs' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  [ message ]  =  await  Promise . all ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . waitForEvent ( 'console' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( message . text ( ) ) . toBe ( '1' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should have JSHandles for console logs' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  logPromise  =  new  Promise ( x  =>  page . on ( 'console' ,  x ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1,2,3,this)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  log  =  await  logPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( log . text ( ) ) . toBe ( '1 2 3 JSHandle@object' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( log . args ( ) . length ) . toBe ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( await  ( await  log . args ( ) [ 3 ] . getProperty ( 'origin' ) ) . jsonValue ( ) ) . toBe ( 'null' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should evaluate' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerCreatedPromise  =  page . waitForEvent ( 'worker' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  worker  =  await  workerCreatedPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( await  worker . evaluate ( '1+1' ) ) . toBe ( 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-15 19:50:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  it . fail ( FFOX ) ( 'should report errors' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Times out after the 4/15/2020 roll.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-08 15:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    const  errorPromise  =  new  Promise ( x  =>  page . on ( 'pageerror' ,  x ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ ` setTimeout(() => { throw new Error('this is my error'); }) ` ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  errorLog  =  await  errorPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( errorLog . message ) . toContain ( 'this is my error' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should clear upon navigation' ,  async  function ( { server ,  page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerCreatedPromise  =  page . waitForEvent ( 'worker' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  worker  =  await  workerCreatedPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( page . workers ( ) . length ) . toBe ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let  destroyed  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    worker . once ( 'close' ,  ( )  =>  destroyed  =  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . goto ( server . PREFIX  +  '/one-style.html' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( destroyed ) . toBe ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( page . workers ( ) . length ) . toBe ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should clear upon cross-process navigation' ,  async  function ( { server ,  page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  workerCreatedPromise  =  page . waitForEvent ( 'worker' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  worker  =  await  workerCreatedPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( page . workers ( ) . length ) . toBe ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let  destroyed  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    worker . once ( 'close' ,  ( )  =>  destroyed  =  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . goto ( server . CROSS _PROCESS _PREFIX  +  '/empty.html' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( destroyed ) . toBe ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( page . workers ( ) . length ) . toBe ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should report network activity' ,  async  function ( { page ,  server } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  [ worker ]  =  await  Promise . all ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . waitForEvent ( 'worker' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . goto ( server . PREFIX  +  '/worker/worker.html' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  url  =  server . PREFIX  +  '/one-style.css' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  requestPromise  =  page . waitForRequest ( url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  responsePromise  =  page . waitForResponse ( url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  worker . evaluate ( url  =>  fetch ( url ) . then ( response  =>  response . text ( ) ) . then ( console . log ) ,  url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  request  =  await  requestPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  response  =  await  responsePromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( request . url ( ) ) . toBe ( url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( response . request ( ) ) . toBe ( request ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( response . ok ( ) ) . toBe ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should report network activity on worker creation' ,  async  function ( { page ,  server } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Chromium needs waitForDebugger enabled for this one.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  url  =  server . PREFIX  +  '/one-style.css' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  requestPromise  =  page . waitForRequest ( url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  responsePromise  =  page . waitForResponse ( url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . evaluate ( url  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ ` 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      fetch ( "${url}" ) . then ( response  =>  response . text ( ) ) . then ( console . log ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ` ], {type: 'application/javascript'}))), url);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  request  =  await  requestPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  response  =  await  responsePromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( request . url ( ) ) . toBe ( url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( response . request ( ) ) . toBe ( request ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( response . ok ( ) ) . toBe ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  it ( 'should format number using context locale' ,  async ( { browser ,  server } )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  context  =  await  browser . newContext ( {  locale :  'ru-RU'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  page  =  await  context . newPage ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  [ worker ]  =  await  Promise . all ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . waitForEvent ( 'worker' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    expect ( await  worker . evaluate ( ( )  =>  ( 10000.20 ) . toLocaleString ( ) ) ) . toBe ( '10\u00A0000,2' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  context . close ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-18 18:18:28 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-08 15:19:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ) ;