code: function(config) {
    this.preparers_ = [];
    this.driverprovider_ = null;
    this.config_ = config;
  
    if (config.v8Debug) {
      // Call this private function instead of sending SIGUSR1 because Windows.
      process._debugProcess(process.pid);
    }
  
    if (config.nodeDebug) {
      process._debugProcess(process.pid);
      var flow = webdriver.promise.controlFlow();
  
      flow.execute(function() {
        var nodedebug = require('child_process').fork('debug', ['localhost:5858']);
        process.on('exit', function() {
          nodedebug.kill('SIGTERM');
        });
        nodedebug.on('exit', function() {
          process.exit('1');
        });
      }, 'start the node debugger');
      flow.timeout(1000, 'waiting for debugger to attach');
    }
  
    this.loadDriverProvider_(config);
  }
docs: /*
  Runner is responsible for starting the execution of a test run and triggering
  setup, teardown, managing config, etc through its various dependencies.
  
  The Protractor Runner is a node EventEmitter with the following events:
  - testPass
  - testFail
  - testsDone
  
  @param {Object} config
  @constructor