text: // Copyright 2013 Selenium committers
  //
  // 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.
  
  /**
   * @fileoverview Defines functions for configuring a webdriver proxy:
   * <pre><code>
   * var webdriver = require('selenium-webdriver'),
   *     proxy = require('selenium-webdriver/proxy');
   *
   * var driver = new webdriver.Builder()
   *     .withCapabilities(webdriver.Capabilities.chrome())
   *     .setProxy(proxy.manual({http: 'host:1234'}))
   *     .build();
   * </code></pre>
   */
  
  'use strict';
  
  var util = require('util');
  
  
  /**
   * Proxy configuration object, as defined by the WebDriver wire protocol.
   * @typedef {(
   *     {proxyType: string}|
   *     {proxyType: string,
   *      proxyAutoconfigUrl: string}|
   *     {proxyType: string,
   *      ftpProxy: string,
   *      httpProxy: string,
   *      sslProxy: string,
   *      noProxy: string})}
   */
  var ProxyConfig;
  
  
  
  // PUBLIC API
  
  
  /**
   * Configures WebDriver to bypass all browser proxies.
   * @return {!ProxyConfig} A new proxy configuration object.
   */
  exports.direct = function() {
    return {proxyType: 'direct'};
  };
  
  
  /**
   * Manually configures the browser proxy.  The following options are
   * supported:
   * <ul>
   * <li>{@code ftp}: Proxy host to use for FTP requests
   * <li>{@code http}: Proxy host to use for HTTP requests
   * <li>{@code https}: Proxy host to use for HTTPS requests
   * <li>{@code bypass}: A list of hosts requests should directly connect to,
   *     bypassing any other proxies for that request. May be specified as a
   *     comma separated string, or a list of strings.
   * </ul>
   *
   * Behavior is undefined for FTP, HTTP, and HTTPS requests if the
   * corresponding key is omitted from the configuration options.
   *
   * @param {{ftp: (string|undefined),
   *          http: (string|undefined),
   *          https: (string|undefined),
   *          bypass: (string|!Array.<string>|undefined)}} options Proxy
   *     configuration options.
   * @return {!ProxyConfig} A new proxy configuration object.
   */
  exports.manual = function(options) {
    return {
      proxyType: 'manual',
      ftpProxy: options.ftp,
      httpProxy: options.http,
      sslProxy: options.https,
      noProxy: util.isArray(options.bypass) ?
          options.bypass.join(',') : options.bypass
    };
  };
  
  
  /**
   * Configures WebDriver to configure the browser proxy using the PAC file at
   * the given URL.
   * @param {string} url URL for the PAC proxy to use.
   * @return {!ProxyConfig} A new proxy configuration object.
   */
  exports.pac = function(url) {
    return {
      proxyType: 'pac',
      proxyAutoconfigUrl: url
    };
  };
  
  
  /**
   * Configures WebDriver to use the current system's proxy.
   * @return {!ProxyConfig} A new proxy configuration object.
   */
  exports.system = function() {
    return {proxyType: 'system'};
  };
  