2019-11-21 06: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-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								const  utils  =  require ( './utils' ) ;  
						 
					
						
							
								
									
										
										
										
											2019-11-21 06:18:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								const  {  waitEvent  }  =  utils ;  
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 02:13:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								module . exports . describe  =  function ( { testRunner ,  expect ,  FFOX ,  CHROMIUM ,  WEBKIT } )  {  
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  const  { describe ,  xdescribe ,  fdescribe }  =  testRunner ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-20 07:47:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  const  { it ,  fit ,  xit ,  dit }  =  testRunner ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  const  { beforeAll ,  beforeEach ,  afterAll ,  afterEach }  =  testRunner ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  describe . skip ( FFOX ) ( 'Workers' ,  function ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    it ( 'Page.workers' ,  async  function ( { page ,  server } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      await  Promise . all ( [ 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        page . waitForEvent ( 'workercreated' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        page . goto ( server . PREFIX  +  '/worker/worker.html' ) ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-22 01:03:52 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  worker  =  page . workers ( ) [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      expect ( worker . url ( ) ) . toContain ( 'worker.js' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-20 09:32:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      expect ( await  worker . evaluate ( ( )  =>  self [ 'workerFunction' ] ( ) ) ) . toBe ( 'worker function result' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-22 01:03:52 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      expect ( page . workers ( ) . length ) . toBe ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    it ( 'should emit created and destroyed events' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  workerCreatedPromise  =  page . waitForEvent ( 'workercreated' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const  workerObj  =  await  page . evaluateHandle ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ '1' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  worker  =  await  workerCreatedPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const  workerThisObj  =  await  worker . evaluateHandle ( ( )  =>  this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-22 01:03:52 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  workerDestroyedPromise  =  new  Promise ( x  =>  page . once ( 'workerdestroyed' ,  x ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      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 ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        waitEvent ( page ,  'console' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) , 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      expect ( message . text ( ) ) . toBe ( '1' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    it ( 'should have JSHandles for console logs' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const  logPromise  =  new  Promise ( x  =>  page . on ( 'console' ,  x ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      await  page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1,2,3,this)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      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' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-19 05:51:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    it ( 'should evaluate' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  workerCreatedPromise  =  page . waitForEvent ( 'workercreated' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  worker  =  await  workerCreatedPromise ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-19 05:51:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      expect ( await  worker . evaluate ( '1+1' ) ) . toBe ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    it ( 'should report errors' ,  async  function ( { page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const  errorPromise  =  new  Promise ( x  =>  page . on ( 'pageerror' ,  x ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ ` setTimeout(() => { throw new Error('this is my error'); }) ` ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      const  errorLog  =  await  errorPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      expect ( errorLog . message ) . toContain ( 'this is my error' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 04:59:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    it ( 'should clear upon navigation' ,  async  function ( { server ,  page } )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      await  page . goto ( server . EMPTY _PAGE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const  workerCreatedPromise  =  page . waitForEvent ( 'workercreated' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      page . evaluate ( ( )  =>  new  Worker ( URL . createObjectURL ( new  Blob ( [ 'console.log(1)' ] ,  { type :  'application/javascript' } ) ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      await  workerCreatedPromise ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      expect ( page . workers ( ) . length ) . toBe ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      await  page . goto ( server . CROSS _PROCESS _PREFIX  +  '/empty.html' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      expect ( page . workers ( ) . length ) . toBe ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-19 10:18:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;