| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 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. |
| --> |
| |
| <link rel="import" href="/core/trace_model/trace_model.html"> |
| <link rel="import" href="/core/importer/importer.html"> |
| <link rel="import" href="/core/importer/simple_line_reader.html"> |
| <link rel="import" href="/base/base64.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tv.exportTo('tv.e.importer', function() { |
| |
| function Trace2HTMLImporter(model, events) { |
| this.importPriority = 0; |
| } |
| |
| Trace2HTMLImporter.subtraces_ = []; |
| |
| function _extractEventsFromHTML(text) { |
| // Clear the array before pushing data to it. |
| Trace2HTMLImporter.subtraces_ = []; |
| |
| var r = new tv.c.importer.SimpleLineReader(text); |
| |
| // Try to find viewer-data... |
| while (true) { |
| if (!r.advanceToLineMatching( |
| /^<\s*script id="viewer-data" type="application\/json">$/)) |
| break; |
| |
| r.beginSavingLines(); |
| if (!r.advanceToLineMatching(/^<\/\s*script>$/)) |
| return failure; |
| |
| var raw_events = r.endSavingLinesAndGetResult(); |
| |
| // Drop off first and last event as it contains the end script tag. |
| raw_events = raw_events.slice(1, raw_events.length - 1); |
| var data64 = raw_events.join('\n'); |
| var buffer = new ArrayBuffer( |
| tv.b.Base64.getDecodedBufferLength(data64)); |
| var len = tv.b.Base64.DecodeToTypedArray(data64, new DataView(buffer)); |
| Trace2HTMLImporter.subtraces_.push(buffer.slice(0, len)); |
| } |
| } |
| |
| function _canImportFromHTML(text) { |
| if (/^<!DOCTYPE HTML>/.test(text) === false) |
| return false; |
| |
| // Try to find viewer-data... |
| _extractEventsFromHTML(text); |
| if (Trace2HTMLImporter.subtraces_.length === 0) |
| return false; |
| return true; |
| } |
| |
| Trace2HTMLImporter.canImport = function(events) { |
| return _canImportFromHTML(events); |
| }; |
| |
| Trace2HTMLImporter.prototype = { |
| __proto__: tv.c.importer.Importer.prototype, |
| |
| isTraceDataContainer: function() { |
| return true; |
| }, |
| |
| extractSubtraces: function() { |
| return Trace2HTMLImporter.subtraces_; |
| }, |
| |
| importEvents: function() { |
| } |
| }; |
| |
| |
| tv.c.importer.Importer.register(Trace2HTMLImporter); |
| |
| |
| return { |
| Trace2HTMLImporter: Trace2HTMLImporter |
| }; |
| }); |
| </script> |