(async function(testRunner) {
  var {page, session, dp} = await testRunner.startBlank(
      'Tests that worker can be interrupted with Debugger.pause.');

  await dp.Target.setAutoAttach({autoAttach: true,
                                 waitForDebuggerOnStart: false,
                                 flatten: true});
  const attachedPromise = dp.Target.onceAttachedToTarget();
  await session.evaluate(`
    window.worker = new Worker('${testRunner.url('resources/dedicated-worker-loop.js')}');
    var resolve;
    window.workerMessageReceivedPromise = new Promise(f => resolve = f);
    window.worker.onmessage = function(event) {
      if (event.data === 'WorkerMessageReceived')
        resolve();
    };
  `);
  testRunner.log('Started worker');

  const sessionId = (await attachedPromise).params.sessionId;
  testRunner.log('Worker created');
  testRunner.log('didConnectToWorker');

  const childSession = session.createChild(sessionId);

  // Enable debugger so that V8 can interrupt and handle inspector
  // commands while there is a script running in a tight loop.

  await childSession.protocol.Debugger.enable();
  testRunner.log('Did enable debugger');

  // Start tight loop in the worker.
  await session.evaluate('worker.postMessage(1);');
  testRunner.log('Did post message to worker');

  await session.evaluateAsync('workerMessageReceivedPromise');

  await childSession.protocol.Debugger.pause();
  await childSession.protocol.Debugger.oncePaused();
  testRunner.log('Paused in worker');

  const messageId = await childSession.evaluate('message_id');
  if (messageId > 1) {
    testRunner.log('SUCCESS: messageId > 1');
  } else {
    testRunner.log('FAIL: evaluated, messageId: ' + message_id);
  }

  testRunner.completeTest();
})
