1545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2011 Google Inc. All rights reserved.
3545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *
4545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * Redistribution and use in source and binary forms, with or without
5545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * modification, are permitted provided that the following conditions are
6545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * met:
7545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *
8545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *     * Redistributions of source code must retain the above copyright
9545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * notice, this list of conditions and the following disclaimer.
10545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *     * Redistributions in binary form must reproduce the above
11545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * copyright notice, this list of conditions and the following disclaimer
12545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * in the documentation and/or other materials provided with the
13545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * distribution.
14545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *     * Neither the name of Google Inc. nor the names of its
15545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * contributors may be used to endorse or promote products derived from
16545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * this software without specific prior written permission.
17545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch *
18545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch */
30545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
31545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// See http://groups.google.com/group/http-archive-specification/web/har-1-2-spec
32545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// for HAR specification.
33545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// FIXME: Some fields are not yet supported due to back-end limitations.
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// See https://bugs.webkit.org/show_bug.cgi?id=58127 for details.
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
37545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochWebInspector.HAREntry = function(resource)
38545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
39545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    this._resource = resource;
40545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
41545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
42545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochWebInspector.HAREntry.prototype = {
43545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    build: function()
44545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
45545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return {
46545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            pageref: this._resource.documentURL,
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            startedDateTime: new Date(this._resource.startTime * 1000),
4868513a70bcd92384395513322f1b801e7bf9c729Steve Block            time: WebInspector.HAREntry._toMilliseconds(this._resource.duration),
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            request: this._buildRequest(),
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            response: this._buildResponse(),
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            cache: { }, // Not supproted yet.
52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            timings: this._buildTimings()
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
54545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
56545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildRequest: function()
57545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
58545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        var res = {
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            method: this._resource.requestMethod,
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            url: this._resource.url,
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // httpVersion: "HTTP/1.1" -- Not available.
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            headers: this._buildHeaders(this._resource.requestHeaders),
632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            queryString: this._buildParameters(this._resource.queryParameters || []),
642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            cookies: this._buildCookies(this._resource.requestCookies || []),
65545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            headersSize: -1, // Not available.
66545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            bodySize: -1 // Not available.
67545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
68545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (this._resource.requestFormData)
69545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            res.postData = this._buildPostData();
70545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return res;
71545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
72545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
73545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildResponse: function()
74545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return {
76545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            status: this._resource.statusCode,
77545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            statusText: this._resource.statusText,
78545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // "httpVersion": "HTTP/1.1" -- Not available.
79545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            headers: this._buildHeaders(this._resource.responseHeaders),
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            cookies: this._buildCookies(this._resource.responseCookies || []),
81545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            content: this._buildContent(),
82545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            redirectURL: this._resource.responseHeaderValue("Location") || "",
83545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            headersSize: -1, // Not available.
84545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            bodySize: this._resource.resourceSize
85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
87545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
88545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildContent: function()
89545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return {
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            size: this._resource.resourceSize,
92545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // compression: 0, -- Not available.
93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            mimeType: this._resource.mimeType,
94545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // text: -- Not available.
95545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
96545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildTimings: function()
99545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
10068513a70bcd92384395513322f1b801e7bf9c729Steve Block        var waitForConnection = this._interval("connectStart", "connectEnd");
10168513a70bcd92384395513322f1b801e7bf9c729Steve Block        var blocked;
10268513a70bcd92384395513322f1b801e7bf9c729Steve Block        var connect;
10368513a70bcd92384395513322f1b801e7bf9c729Steve Block        var dns = this._interval("dnsStart", "dnsEnd");
10468513a70bcd92384395513322f1b801e7bf9c729Steve Block        var send = this._interval("sendStart", "sendEnd");
10568513a70bcd92384395513322f1b801e7bf9c729Steve Block        var ssl = this._interval("sslStart", "sslEnd");
10668513a70bcd92384395513322f1b801e7bf9c729Steve Block
10768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (ssl !== -1 && send !== -1)
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block            send -= ssl;
10968513a70bcd92384395513322f1b801e7bf9c729Steve Block
11068513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (this._resource.connectionReused) {
11168513a70bcd92384395513322f1b801e7bf9c729Steve Block            connect = -1;
11268513a70bcd92384395513322f1b801e7bf9c729Steve Block            blocked = waitForConnection;
11368513a70bcd92384395513322f1b801e7bf9c729Steve Block        } else {
11468513a70bcd92384395513322f1b801e7bf9c729Steve Block            blocked = 0;
11568513a70bcd92384395513322f1b801e7bf9c729Steve Block            connect = waitForConnection;
11668513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (dns !== -1)
11768513a70bcd92384395513322f1b801e7bf9c729Steve Block                connect -= dns;
11868513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
11968513a70bcd92384395513322f1b801e7bf9c729Steve Block
120545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return {
12168513a70bcd92384395513322f1b801e7bf9c729Steve Block            blocked: blocked,
12268513a70bcd92384395513322f1b801e7bf9c729Steve Block            dns: dns,
12368513a70bcd92384395513322f1b801e7bf9c729Steve Block            connect: connect,
12468513a70bcd92384395513322f1b801e7bf9c729Steve Block            send: send,
12568513a70bcd92384395513322f1b801e7bf9c729Steve Block            wait: this._interval("sendEnd", "receiveHeadersEnd"),
12668513a70bcd92384395513322f1b801e7bf9c729Steve Block            receive: WebInspector.HAREntry._toMilliseconds(this._resource.receiveDuration),
12768513a70bcd92384395513322f1b801e7bf9c729Steve Block            ssl: ssl
128545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
129545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
130545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
131545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildHeaders: function(headers)
132545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
133545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        var result = [];
134545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        for (var name in headers)
135545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            result.push({ name: name, value: headers[name] });
136545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return result;
137545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
138545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
139545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildPostData: function()
140545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
1415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        var res = {
142545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            mimeType: this._resource.requestHeaderValue("Content-Type"),
143545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            text: this._resource.requestFormData
144545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (this._resource.formParameters)
1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick           res.params = this._buildParameters(this._resource.formParameters);
1475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return res;
148545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
149545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
150545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _buildParameters: function(parameters)
151545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
152545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return parameters.slice();
153545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    },
154545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _buildCookies: function(cookies)
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return cookies.map(this._buildCookie.bind(this));
158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _buildCookie: function(cookie)
161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return {
164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            name: cookie.name,
165a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            value: cookie.value,
166a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            path: cookie.path,
167a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            domain: cookie.domain,
168a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            expires: cookie.expires(new Date(this._resource.startTime * 1000)),
169a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            httpOnly: cookie.httpOnly,
170a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            secure: cookie.secure
171a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        };
172a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
173a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
17468513a70bcd92384395513322f1b801e7bf9c729Steve Block    _interval: function(start, end)
17568513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
17668513a70bcd92384395513322f1b801e7bf9c729Steve Block        var timing = this._resource.timing;
17768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!timing)
17868513a70bcd92384395513322f1b801e7bf9c729Steve Block            return -1;
17968513a70bcd92384395513322f1b801e7bf9c729Steve Block        var startTime = timing[start];
18068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return typeof startTime !== "number" || startTime === -1 ? -1 : Math.round(timing[end] - startTime);
18168513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
182e14391e94c850b8bd03680c23b38978db68687a8John Reck}
18368513a70bcd92384395513322f1b801e7bf9c729Steve Block
18468513a70bcd92384395513322f1b801e7bf9c729Steve BlockWebInspector.HAREntry._toMilliseconds = function(time)
18568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
18668513a70bcd92384395513322f1b801e7bf9c729Steve Block    return time === -1 ? -1 : Math.round(time * 1000);
18768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
18868513a70bcd92384395513322f1b801e7bf9c729Steve Block
18968513a70bcd92384395513322f1b801e7bf9c729Steve BlockWebInspector.HARLog = function()
19068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
19168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
19268513a70bcd92384395513322f1b801e7bf9c729Steve Block
19368513a70bcd92384395513322f1b801e7bf9c729Steve BlockWebInspector.HARLog.prototype = {
19468513a70bcd92384395513322f1b801e7bf9c729Steve Block    build: function()
19568513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
19668513a70bcd92384395513322f1b801e7bf9c729Steve Block        var webKitVersion = /AppleWebKit\/([^ ]+)/.exec(window.navigator.userAgent);
19768513a70bcd92384395513322f1b801e7bf9c729Steve Block
19868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return {
19968513a70bcd92384395513322f1b801e7bf9c729Steve Block            version: "1.2",
20068513a70bcd92384395513322f1b801e7bf9c729Steve Block            creator: {
20168513a70bcd92384395513322f1b801e7bf9c729Steve Block                name: "WebInspector",
20268513a70bcd92384395513322f1b801e7bf9c729Steve Block                version: webKitVersion ? webKitVersion[1] : "n/a"
20368513a70bcd92384395513322f1b801e7bf9c729Steve Block            },
20468513a70bcd92384395513322f1b801e7bf9c729Steve Block            pages: this._buildPages(),
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            entries: WebInspector.networkResources.map(this._convertResource.bind(this))
20668513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
20768513a70bcd92384395513322f1b801e7bf9c729Steve Block    },
20868513a70bcd92384395513322f1b801e7bf9c729Steve Block
20968513a70bcd92384395513322f1b801e7bf9c729Steve Block    _buildPages: function()
21068513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
21168513a70bcd92384395513322f1b801e7bf9c729Steve Block        return [
21268513a70bcd92384395513322f1b801e7bf9c729Steve Block            {
21368513a70bcd92384395513322f1b801e7bf9c729Steve Block                startedDateTime: new Date(WebInspector.mainResource.startTime * 1000),
21468513a70bcd92384395513322f1b801e7bf9c729Steve Block                id: WebInspector.mainResource.documentURL,
21568513a70bcd92384395513322f1b801e7bf9c729Steve Block                title: "",
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                pageTimings: this.buildMainResourceTimings()
21768513a70bcd92384395513322f1b801e7bf9c729Steve Block            }
21868513a70bcd92384395513322f1b801e7bf9c729Steve Block        ];
21968513a70bcd92384395513322f1b801e7bf9c729Steve Block    },
22068513a70bcd92384395513322f1b801e7bf9c729Steve Block
221a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    buildMainResourceTimings: function()
22268513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
22368513a70bcd92384395513322f1b801e7bf9c729Steve Block        return {
224e14391e94c850b8bd03680c23b38978db68687a8John Reck             onContentLoad: this._pageEventTime(WebInspector.mainResourceDOMContentTime),
225e14391e94c850b8bd03680c23b38978db68687a8John Reck             onLoad: this._pageEventTime(WebInspector.mainResourceLoadTime),
22668513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
22768513a70bcd92384395513322f1b801e7bf9c729Steve Block    },
22868513a70bcd92384395513322f1b801e7bf9c729Steve Block
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _convertResource: function(resource)
230545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
23181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return (new WebInspector.HAREntry(resource)).build();
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _pageEventTime: function(time)
235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var startTime = WebInspector.mainResource.startTime;
237a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (time === -1 || startTime === -1)
238a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return -1;
239a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return WebInspector.HAREntry._toMilliseconds(time - startTime);
240545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
241e14391e94c850b8bd03680c23b38978db68687a8John Reck}
242