| Index: chrome/test/data/extensions/api_test/webrequest/test_websocket.js
 | 
| diff --git a/chrome/test/data/extensions/api_test/webrequest/test_websocket.js b/chrome/test/data/extensions/api_test/webrequest/test_websocket.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..87c8198b5d913210cf4ef2f903ddb8e1e2c9fa9c
 | 
| --- /dev/null
 | 
| +++ b/chrome/test/data/extensions/api_test/webrequest/test_websocket.js
 | 
| @@ -0,0 +1,185 @@
 | 
| +// Copyright 2017 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +chrome.tabs.getCurrent(function(tab) {
 | 
| +  runTestsForTab([
 | 
| +    // Opens a WebSocket connection, writes a message to it, and closes the
 | 
| +    // connection. WebRequest API should observe the entire handshake.
 | 
| +    function handshakeSucceeds() {
 | 
| +      var url = getWSTestURL(testWebSocketPort);
 | 
| +      expect(
 | 
| +        [  //events
 | 
| +          { label: 'onBeforeRequest',
 | 
| +            event: 'onBeforeRequest',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              // TODO(pkalinnikov): Figure out why the frame URL is unknown.
 | 
| +              frameUrl: 'unknown frame URL',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onBeforeSendHeaders',
 | 
| +            event: 'onBeforeSendHeaders',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onSendHeaders',
 | 
| +            event: 'onSendHeaders',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onHeadersReceived',
 | 
| +            event: 'onHeadersReceived',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              statusCode: 101,
 | 
| +              statusLine: 'HTTP/1.1 101 Switching Protocols',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onResponseStarted',
 | 
| +            event: 'onResponseStarted',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              ip: '127.0.0.1',
 | 
| +              fromCache: false,
 | 
| +              statusCode: 101,
 | 
| +              statusLine: 'HTTP/1.1 101 Switching Protocols',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onCompleted',
 | 
| +            event: 'onCompleted',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              fromCache: false,
 | 
| +              statusCode: 101,
 | 
| +              statusLine: 'HTTP/1.1 101 Switching Protocols',
 | 
| +            }
 | 
| +          },
 | 
| +        ],
 | 
| +        [  // event order
 | 
| +          ['onBeforeRequest', 'onBeforeSendHeaders', 'onSendHeaders',
 | 
| +          'onHeadersReceived', 'onResponseStarted', 'onCompleted']
 | 
| +        ],
 | 
| +        {urls: ['<all_urls>']},  // filter
 | 
| +        ['blocking']  // extraInfoSpec
 | 
| +      );
 | 
| +      testWebSocketConnection(url, true /* expectedToConnect*/);
 | 
| +    },
 | 
| +
 | 
| +    // Tries to open a WebSocket connection, with a blocking handler that
 | 
| +    // cancels the request. The connection will not be established.
 | 
| +    function handshakeRequestCancelled() {
 | 
| +      var url = getWSTestURL(testWebSocketPort);
 | 
| +      expect(
 | 
| +        [  // events
 | 
| +          { label: 'onBeforeRequest',
 | 
| +            event: 'onBeforeRequest',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              frameUrl: 'unknown frame URL',
 | 
| +            },
 | 
| +            retval: {cancel: true}
 | 
| +          },
 | 
| +          // Cancelling is considered an error.
 | 
| +          { label: 'onErrorOccurred',
 | 
| +            event: 'onErrorOccurred',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              fromCache: false,
 | 
| +              error: 'net::ERR_BLOCKED_BY_CLIENT'
 | 
| +            }
 | 
| +          },
 | 
| +        ],
 | 
| +        [  // event order
 | 
| +          ['onBeforeRequest', 'onErrorOccurred']
 | 
| +        ],
 | 
| +        {urls: ['<all_urls>']},  // filter
 | 
| +        ['blocking']  // extraInfoSpec
 | 
| +      );
 | 
| +      testWebSocketConnection(url, false /* expectedToConnect*/);
 | 
| +    },
 | 
| +
 | 
| +    // Opens a WebSocket connection, with a blocking handler that tries to
 | 
| +    // redirect the request. The redirect will be ignored.
 | 
| +    function redirectIsIgnoredAndHandshakeSucceeds() {
 | 
| +      var url = getWSTestURL(testWebSocketPort);
 | 
| +      var redirectedUrl1 = getWSTestURL(testWebSocketPort) + '?redirected1';
 | 
| +      var redirectedUrl2 = getWSTestURL(testWebSocketPort) + '?redirected2';
 | 
| +      expect(
 | 
| +        [  // events
 | 
| +          { label: 'onBeforeRequest',
 | 
| +            event: 'onBeforeRequest',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              frameUrl: 'unknown frame URL',
 | 
| +            },
 | 
| +            retval: {redirectUrl: redirectedUrl1}
 | 
| +          },
 | 
| +          { label: 'onBeforeSendHeaders',
 | 
| +            event: 'onBeforeSendHeaders',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onSendHeaders',
 | 
| +            event: 'onSendHeaders',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onHeadersReceived',
 | 
| +            event: 'onHeadersReceived',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              statusCode: 101,
 | 
| +              statusLine: 'HTTP/1.1 101 Switching Protocols',
 | 
| +            },
 | 
| +            retval: {redirectUrl: redirectedUrl2}
 | 
| +          },
 | 
| +          { label: 'onResponseStarted',
 | 
| +            event: 'onResponseStarted',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              ip: '127.0.0.1',
 | 
| +              fromCache: false,
 | 
| +              statusCode: 101,
 | 
| +              statusLine: 'HTTP/1.1 101 Switching Protocols',
 | 
| +            },
 | 
| +          },
 | 
| +          { label: 'onCompleted',
 | 
| +            event: 'onCompleted',
 | 
| +            details: {
 | 
| +              url: url,
 | 
| +              type: 'websocket',
 | 
| +              fromCache: false,
 | 
| +              statusCode: 101,
 | 
| +              statusLine: 'HTTP/1.1 101 Switching Protocols',
 | 
| +            }
 | 
| +          },
 | 
| +        ],
 | 
| +        [  // event order
 | 
| +          ['onBeforeRequest', 'onBeforeSendHeaders', 'onHeadersReceived',
 | 
| +          'onResponseStarted', 'onCompleted']
 | 
| +        ],
 | 
| +        {urls: ['<all_urls>']},  // filter
 | 
| +        ['blocking']  // extraInfoSpec
 | 
| +      );
 | 
| +      testWebSocketConnection(url, true /* expectedToConnect*/);
 | 
| +    },
 | 
| +  ], tab);
 | 
| +});
 | 
| 
 |