| Index: third_party/WebKit/LayoutTests/inspector-protocol/resources/tracing-test.js
 | 
| diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/tracing-test.js b/third_party/WebKit/LayoutTests/inspector-protocol/resources/tracing-test.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..4282fcd13ab6ef8f95aa74b62f419e5ba1f36ecb
 | 
| --- /dev/null
 | 
| +++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/tracing-test.js
 | 
| @@ -0,0 +1,116 @@
 | 
| +// Copyright 2014 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.
 | 
| +
 | 
| +(function initialize_tracingHarness(testRunner, session) {
 | 
| +
 | 
| +  class TracingHelper {
 | 
| +    startTracing(callback) {
 | 
| +      this.startTracingWithArguments({ "categories": "-*,disabled-by-default-devtools.timeline,devtools.timeline", "type": "", "options": "" }, callback);
 | 
| +    }
 | 
| +
 | 
| +    startTracingAndSaveAsStream(callback) {
 | 
| +      var args = {
 | 
| +        "categories": "-*,disabled-by-default-devtools.timeline,devtools.timeline",
 | 
| +        "type": "",
 | 
| +        "options": "",
 | 
| +        "transferMode": "ReturnAsStream"
 | 
| +      };
 | 
| +      this.startTracingWithArguments(args, callback);
 | 
| +    }
 | 
| +
 | 
| +    startTracingWithArguments(args, callback) {
 | 
| +      session.protocol.Tracing.start(args).then(onStart);
 | 
| +      function onStart(response) {
 | 
| +        testRunner.log("Recording started");
 | 
| +        callback();
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    stopTracing(callback) {
 | 
| +      this.devtoolsEvents = [];
 | 
| +      var dataCollected = reply => {
 | 
| +        var allEvents = reply.params.value;
 | 
| +        this.devtoolsEvents = this.devtoolsEvents.concat(allEvents.filter(function(e) {
 | 
| +          return /devtools.timeline/.test(e.cat);
 | 
| +        }));
 | 
| +      };
 | 
| +
 | 
| +      var tracingComplete = event => {
 | 
| +        testRunner.log("Tracing complete");
 | 
| +        session.protocol.Tracing.offTracingComplete(tracingComplete);
 | 
| +        session.protocol.Tracing.offDataCollected(dataCollected);
 | 
| +        callback(this.devtoolsEvents);
 | 
| +      };
 | 
| +
 | 
| +      session.protocol.Tracing.onTracingComplete(tracingComplete);
 | 
| +      session.protocol.Tracing.onDataCollected(dataCollected);
 | 
| +      session.protocol.Tracing.end();
 | 
| +    }
 | 
| +
 | 
| +    stopTracingAndReturnStream(callback) {
 | 
| +      session.protocol.Tracing.onTracingComplete(tracingComplete);
 | 
| +      session.protocol.Tracing.onDataCollected(dataCollected);
 | 
| +      session.protocol.Tracing.end();
 | 
| +
 | 
| +      function dataCollected(reply) {
 | 
| +        testRunner.log("FAIL: dataCollected event should not be fired when returning trace as stream.");
 | 
| +      }
 | 
| +
 | 
| +      function tracingComplete(event) {
 | 
| +        testRunner.log("Tracing complete");
 | 
| +        session.protocol.Tracing.offTracingComplete(tracingComplete);
 | 
| +        session.protocol.Tracing.offDataCollected(dataCollected);
 | 
| +        callback(event.params.stream);
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    retrieveStream(streamHandle, offset, chunkSize, callback) {
 | 
| +      var result = "";
 | 
| +      var had_eof = false;
 | 
| +
 | 
| +      var readArguments = { handle: streamHandle };
 | 
| +      if (typeof chunkSize === "number")
 | 
| +        readArguments.size = chunkSize;
 | 
| +      var firstReadArguments = JSON.parse(JSON.stringify(readArguments));
 | 
| +      if (typeof offset === "number")
 | 
| +        firstReadArguments.offset = 0;
 | 
| +      session.protocol.IO.read(firstReadArguments).then(message => onChunkRead(message.result));
 | 
| +      // Assure multiple in-lfight reads are fine (also, save on latencies).
 | 
| +      session.protocol.IO.read(readArguments).then(message => onChunkRead(message.result));
 | 
| +
 | 
| +      function onChunkRead(response) {
 | 
| +        if (had_eof)
 | 
| +          return;
 | 
| +        result += response.data;
 | 
| +        if (response.eof) {
 | 
| +          // Ignore stray callbacks from proactive read requests.
 | 
| +          had_eof = true;
 | 
| +          callback(result);
 | 
| +          return;
 | 
| +        }
 | 
| +        session.protocol.IO.read(readArguments).then(message => onChunkRead(message.result));
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    findEvents(name, ph, condition) {
 | 
| +      return this.devtoolsEvents.filter(e => e.name === name && e.ph === ph && (!condition || condition(e)));
 | 
| +    }
 | 
| +
 | 
| +    findEvent(name, ph, condition) {
 | 
| +      var events = this.findEvents(name, ph, condition);
 | 
| +      if (events.length)
 | 
| +        return events[0];
 | 
| +      throw new Error("Couldn't find event " + name + " / " + ph + "\n\n in " + JSON.stringify(this.devtoolsEvents, null, 2));
 | 
| +    }
 | 
| +
 | 
| +    invokeAsyncWithTracing(functionName, callback) {
 | 
| +      this.startTracing(async () => {
 | 
| +        var data = await session.evaluateAsync(functionName + "()");
 | 
| +        this.stopTracing(devtoolsEvents => callback(devtoolsEvents, data));
 | 
| +      });
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  return new TracingHelper();
 | 
| +})
 | 
| 
 |