15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.Object}
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.ContentProvider}
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.Project} project
37591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @param {string} parentPath
38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @param {string} name
39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @param {string} originURL
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} url
41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.ResourceType} contentType
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuWebInspector.UISourceCode = function(project, parentPath, name, originURL, url, contentType)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._project = project;
46591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._parentPath = parentPath;
47591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._name = name;
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._originURL = originURL;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._url = url;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contentType = contentType;
511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    /** @type {!Array.<function(?string)>} */
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._requestContentCallbacks = [];
53a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {!Array.<!WebInspector.PresentationConsoleMessage>} */
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._consoleMessages = [];
55f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @type {!Map.<!WebInspector.Target, !WebInspector.SourceMapping>}
58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._sourceMappingForTarget = new Map();
60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
61d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
62d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @type {!Map.<!WebInspector.Target, !WebInspector.ScriptFile>}
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._scriptFileForTarget = new Map();
65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
66a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {!Array.<!WebInspector.Revision>} */
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.history = [];
68f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!this._project.isServiceProject() && this._url)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._restoreRevisionHistory();
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.UISourceCode.Events = {
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WorkingCopyChanged: "WorkingCopyChanged",
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WorkingCopyCommitted: "WorkingCopyCommitted",
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TitleChanged: "TitleChanged",
76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    SavedStateUpdated: "SavedStateUpdated",
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ConsoleMessageAdded: "ConsoleMessageAdded",
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ConsoleMessageRemoved: "ConsoleMessageRemoved",
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ConsoleMessagesCleared: "ConsoleMessagesCleared",
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SourceMappingChanged: "SourceMappingChanged",
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.UISourceCode.prototype = {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get url()
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._url;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
93591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {string}
94591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
95591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    name: function()
96591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
97591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._name;
98591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
99591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
100591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
101591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {string}
102591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
103591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    parentPath: function()
104591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
105591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._parentPath;
106591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
108591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
109591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {string}
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    path: function()
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
113591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._parentPath ? this._parentPath + "/" + this._name : this._name;
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
119e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    fullDisplayName: function()
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
121e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return this._project.displayName() + "/" + (this._parentPath ? this._parentPath + "/" : "") + this.displayName(true);
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
125e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch     * @param {boolean=} skipTrim
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
128e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    displayName: function(skipTrim)
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
130e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var displayName = this.name() || WebInspector.UIString("(index)");
131e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return skipTrim ? displayName : displayName.trimEnd(100);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uri: function()
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
139591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var path = this.path();
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this._project.id())
141591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return path;
142591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!path)
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return this._project.id();
144591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._project.id() + "/" + path;
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    originURL: function()
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._originURL;
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
15693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @return {boolean}
15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    canRename: function()
15993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
16093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return this._project.canRename();
16193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
16393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} newName
16593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @param {function(boolean)} callback
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
16793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    rename: function(newName, callback)
16893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
16993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this._project.rename(this, newName, innerCallback.bind(this));
17093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        /**
17293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)         * @param {boolean} success
17393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)         * @param {string=} newName
1741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)         * @param {string=} newURL
1751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)         * @param {string=} newOriginURL
176a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!WebInspector.ResourceType=} newContentType
17709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.UISourceCode}
17893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)         */
1791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        function innerCallback(success, newName, newURL, newOriginURL, newContentType)
18093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        {
18193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            if (success)
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                this._updateName(/** @type {string} */ (newName), /** @type {string} */ (newURL), /** @type {string} */ (newOriginURL), /** @type {!WebInspector.ResourceType} */ (newContentType));
18393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            callback(success);
18493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        }
18593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
18693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    remove: function()
188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._project.deleteFile(this.path());
190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
19293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
19393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @param {string} name
1941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {string} url
1951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {string} originURL
196a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ResourceType=} contentType
19793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    _updateName: function(name, url, originURL, contentType)
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
20093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        var oldURI = this.uri();
201591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._name = name;
2021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (url)
2031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            this._url = url;
2041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (originURL)
2051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            this._originURL = originURL;
2061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (contentType)
2071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            this._contentType = contentType;
20893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.TitleChanged, oldURI);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentURL: function()
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this.originURL();
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
220a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.ResourceType}
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentType: function()
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._contentType;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
228d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Target} target
229a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {?WebInspector.ScriptFile}
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
231d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    scriptFileForTarget: function(target)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
233d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return this._scriptFileForTarget.get(target) || null;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
237d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Target} target
238a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?WebInspector.ScriptFile} scriptFile
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
240d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    setScriptFileForTarget: function(target, scriptFile)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
242d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (scriptFile)
243d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._scriptFileForTarget.put(target, scriptFile);
244d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        else
245d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._scriptFileForTarget.remove(target);
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
249a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.Project}
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    project: function()
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._project;
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
257591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {function(?Date, ?number)} callback
258591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
259591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    requestMetadata: function(callback)
260591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
261591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._project.requestMetadata(this, callback);
262591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
263591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
264591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
2651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {function(?string)} callback
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    requestContent: function(callback)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._content || this._contentLoaded) {
2701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            callback(this._content);
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._requestContentCallbacks.push(callback);
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._requestContentCallbacks.length === 1)
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._project.requestFileContent(this, this._fireContentAvailable.bind(this));
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
278591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
279aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {function()} callback
280aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     */
281aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    _pushCheckContentUpdatedCallback: function(callback)
282aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    {
283aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (!this._checkContentUpdatedCallbacks)
284aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            this._checkContentUpdatedCallbacks = [];
285aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        this._checkContentUpdatedCallbacks.push(callback);
286aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    },
287aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
288aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    _terminateContentCheck: function()
289aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    {
290aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        delete this._checkingContent;
291aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (this._checkContentUpdatedCallbacks) {
292aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            this._checkContentUpdatedCallbacks.forEach(function(callback) { callback(); });
293aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            delete this._checkContentUpdatedCallbacks;
294aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
295aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    },
296aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
297aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    /**
298591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {function()=} callback
299591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
300591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    checkContentUpdated: function(callback)
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
302aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        callback = callback || function() {};
303aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (!this._project.canSetFileContent()) {
304aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            callback();
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
306aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
307aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        this._pushCheckContentUpdatedCallback(callback);
308aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
309aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (this._checkingContent) {
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
311aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._checkingContent = true;
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._project.requestFileContent(this, contentLoaded.bind(this));
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        /**
3161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)         * @param {?string} updatedContent
31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.UISourceCode}
3181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)         */
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function contentLoaded(updatedContent)
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
32153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (updatedContent === null) {
32253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                var workingCopy = this.workingCopy();
32353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                this._commitContent("", false);
32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                this.setWorkingCopy(workingCopy);
325aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                this._terminateContentCheck();
32653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return;
32753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            }
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (typeof this._lastAcceptedContent === "string" && this._lastAcceptedContent === updatedContent) {
329aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                this._terminateContentCheck();
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (this._content === updatedContent) {
33353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                delete this._lastAcceptedContent;
334aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                this._terminateContentCheck();
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!this.isDirty()) {
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this._commitContent(updatedContent, false);
340aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                this._terminateContentCheck();
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var shouldUpdate = window.confirm(WebInspector.UIString("This file was changed externally. Would you like to reload it?"));
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (shouldUpdate)
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this._commitContent(updatedContent, false);
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            else
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this._lastAcceptedContent = updatedContent;
349aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            this._terminateContentCheck();
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {function(?string)} callback
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    requestOriginalContent: function(callback)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._project.requestFileContent(this, callback);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} content
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} shouldSetContentInProject
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _commitContent: function(content, shouldSetContentInProject)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
36753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        delete this._lastAcceptedContent;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._content = content;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._contentLoaded = true;
37053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var lastRevision = this.history.length ? this.history[this.history.length - 1] : null;
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!lastRevision || lastRevision._content !== this._content) {
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var revision = new WebInspector.Revision(this, this._content, new Date());
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.history.push(revision);
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            revision._persist();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._innerResetWorkingCopy();
379591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._hasCommittedChanges = true;
38053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted);
381591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._url && WebInspector.fileManager.isURLSaved(this._url))
382591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._saveURLWithFileManager(false, this._content);
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (shouldSetContentInProject)
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._project.setFileContent(this, this._content, function() { });
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
388591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} forceSaveAs
3891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {?string} content
390591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
391591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _saveURLWithFileManager: function(forceSaveAs, content)
392591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        WebInspector.fileManager.save(this._url, /** @type {string} */ (content), forceSaveAs, callback.bind(this));
394591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        WebInspector.fileManager.close(this._url);
395591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
396a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        /**
397a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {boolean} accepted
39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.UISourceCode}
399a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         */
400a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        function callback(accepted)
401591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
402a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (!accepted)
403a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                return;
404591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._savedWithFileManager = true;
405591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this.dispatchEventToListeners(WebInspector.UISourceCode.Events.SavedStateUpdated);
406591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
407591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
408591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
409591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
410591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} forceSaveAs
411591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
412591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    saveToFileSystem: function(forceSaveAs)
413591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
414591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this.isDirty()) {
415591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._saveURLWithFileManager(forceSaveAs, this.workingCopy());
416591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this.commitWorkingCopy(function() { });
417591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return;
418591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
419591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.requestContent(this._saveURLWithFileManager.bind(this, forceSaveAs));
420591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
421591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
422591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
423591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {boolean}
424591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
425591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    hasUnsavedCommittedChanges: function()
426591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
427f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (this._savedWithFileManager || this.project().canSetFileContent() || this._project.isServiceProject())
4281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            return false;
42909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (this._project.workspace().hasResourceContentTrackingExtensions())
430591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return false;
431591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return !!this._hasCommittedChanges;
432591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
433591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
434591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} content
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addRevision: function(content)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._commitContent(content, true);
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _restoreRevisionHistory: function()
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!window.localStorage)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var registry = WebInspector.Revision._revisionHistoryRegistry();
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var historyItems = registry[this.url];
44953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!historyItems)
45053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return;
45153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
45253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        function filterOutStale(historyItem)
45353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        {
45493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            // FIXME: Main frame might not have been loaded yet when uiSourceCodes for snippets are created.
455d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            if (!WebInspector.resourceTreeModel || !WebInspector.resourceTreeModel.mainFrame)
45693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                return false;
45753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return historyItem.loaderId === WebInspector.resourceTreeModel.mainFrame.loaderId;
45853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
45953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
46053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        historyItems = historyItems.filter(filterOutStale);
46153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!historyItems.length)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
46353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < historyItems.length; ++i) {
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var content = window.localStorage[historyItems[i].key];
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var timestamp = new Date(historyItems[i].timestamp);
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var revision = new WebInspector.Revision(this, content, timestamp);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.history.push(revision);
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._content = this.history[this.history.length - 1].content;
4718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._hasCommittedChanges = true;
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._contentLoaded = true;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _clearRevisionHistory: function()
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!window.localStorage)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var registry = WebInspector.Revision._revisionHistoryRegistry();
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var historyItems = registry[this.url];
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; historyItems && i < historyItems.length; ++i)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete window.localStorage[historyItems[i].key];
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete registry[this.url];
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        window.localStorage["revision-history"] = JSON.stringify(registry);
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
487f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    revertToOriginal: function()
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /**
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @this {WebInspector.UISourceCode}
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @param {?string} content
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         */
4941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        function callback(content)
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (typeof content !== "string")
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addRevision(content);
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.requestOriginalContent(callback.bind(this));
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            action: WebInspector.UserMetrics.UserActionNames.ApplyOriginalContent,
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            url: this.url
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        });
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
511a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.UISourceCode)} callback
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    revertAndClearHistory: function(callback)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /**
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @this {WebInspector.UISourceCode}
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         * @param {?string} content
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         */
5191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        function revert(content)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (typeof content !== "string")
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addRevision(content);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._clearRevisionHistory();
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.history = [];
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback(this);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.requestOriginalContent(revert.bind(this));
531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            action: WebInspector.UserMetrics.UserActionNames.RevertRevision,
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            url: this.url
535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        });
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    workingCopy: function()
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
54353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (this._workingCopyGetter) {
54453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._workingCopy = this._workingCopyGetter();
54553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            delete this._workingCopyGetter;
54653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.isDirty())
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this._workingCopy;
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._content;
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    resetWorkingCopy: function()
55353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
55453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._innerResetWorkingCopy();
55553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
55653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
55753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
55853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _innerResetWorkingCopy: function()
55953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
56053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        delete this._workingCopy;
56153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        delete this._workingCopyGetter;
56253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
56353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} newWorkingCopy
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setWorkingCopy: function(newWorkingCopy)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
56953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._workingCopy = newWorkingCopy;
57053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        delete this._workingCopyGetter;
57153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
57253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
57353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
57453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    setWorkingCopyGetter: function(workingCopyGetter)
57553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
57653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._workingCopyGetter = workingCopyGetter;
57753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);
57853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
57953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
58053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    removeWorkingCopyGetter: function()
58153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
58253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this._workingCopyGetter)
58353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return;
58453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._workingCopy = this._workingCopyGetter();
58553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        delete this._workingCopyGetter;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {function(?string)} callback
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    commitWorkingCopy: function(callback)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.isDirty()) {
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback(null);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._commitContent(this.workingCopy(), true);
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        callback(null);
600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            action: WebInspector.UserMetrics.UserActionNames.FileSaved,
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            url: this.url
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        });
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isDirty: function()
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
61253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return typeof this._workingCopy !== "undefined" || typeof this._workingCopyGetter !== "undefined";
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    highlighterType: function()
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        var lastIndexOfDot = this._name.lastIndexOf(".");
6211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        var extension = lastIndexOfDot !== -1 ? this._name.substr(lastIndexOfDot + 1) : "";
6221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        var indexOfQuestionMark = extension.indexOf("?");
6231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (indexOfQuestionMark !== -1)
6241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            extension = extension.substr(0, indexOfQuestionMark);
6251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        var mimeType = WebInspector.ResourceType.mimeTypesForExtensions[extension.toLowerCase()];
6261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return mimeType || this.contentType().canonicalMimeType();
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {?string}
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    content: function()
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._content;
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} caseSensitive
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} isRegex
641a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!Array.<!WebInspector.ContentProvider.SearchMatch>)} callback
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    searchInContent: function(query, caseSensitive, isRegex, callback)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var content = this.content();
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (content) {
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var provider = new WebInspector.StaticContentProvider(this.contentType(), content);
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            provider.searchInContent(query, caseSensitive, isRegex, callback);
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._project.searchInFileContent(this, query, caseSensitive, isRegex, callback);
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {?string} content
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    _fireContentAvailable: function(content)
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._contentLoaded = true;
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._content = content;
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var callbacks = this._requestContentCallbacks.slice();
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._requestContentCallbacks = [];
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < callbacks.length; ++i)
6661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            callbacks[i](content);
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentLoaded: function()
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._contentLoaded;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
678d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Target} target
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} lineNumber
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} columnNumber
681a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {?WebInspector.RawLocation}
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
683d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    uiLocationToRawLocation: function(target, lineNumber, columnNumber)
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
685d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var sourceMapping = this._sourceMappingForTarget.get(target);
686d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (!sourceMapping)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return null;
688d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return sourceMapping.uiLocationToRawLocation(this, lineNumber, columnNumber);
689d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
690d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
691d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
692d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {number} lineNumber
693d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {number} columnNumber
694d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @return {!Array.<!WebInspector.RawLocation>}
695d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
696d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    uiLocationToRawLocations: function(lineNumber, columnNumber)
697d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
698d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var result = [];
699d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var sourceMappings = this._sourceMappingForTarget.values();
700d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        for (var i = 0; i < sourceMappings.length; ++i) {
701d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            var rawLocation = sourceMappings[i].uiLocationToRawLocation(this, lineNumber, columnNumber);
702d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            if (rawLocation)
703d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                result.push(rawLocation);
704d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
705d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return result;
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
709a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Array.<!WebInspector.PresentationConsoleMessage>}
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    consoleMessages: function()
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._consoleMessages;
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
717a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.PresentationConsoleMessage} message
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    consoleMessageAdded: function(message)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._consoleMessages.push(message);
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.ConsoleMessageAdded, message);
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
726a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.PresentationConsoleMessage} message
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    consoleMessageRemoved: function(message)
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._consoleMessages.remove(message);
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.ConsoleMessageRemoved, message);
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    consoleMessagesCleared: function()
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._consoleMessages = [];
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.ConsoleMessagesCleared);
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    hasSourceMapping: function()
7441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
745d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return !!this._sourceMappingForTarget.size();
7461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    },
7471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
7481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    /**
749d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Target} target
750a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?WebInspector.SourceMapping} sourceMapping
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
752d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    setSourceMappingForTarget: function(target, sourceMapping)
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
754d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (this._sourceMappingForTarget.get(target) === sourceMapping)
7551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            return;
756d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
757d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (sourceMapping)
758d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._sourceMappingForTarget.put(target, sourceMapping);
759d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        else
760d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._sourceMappingForTarget.remove(target);
761d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
762d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.SourceMappingChanged, {target: target, isIdentity: sourceMapping ? sourceMapping.isIdentity() : false});
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    /**
7666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch     * @param {number} lineNumber
7676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch     * @param {number=} columnNumber
7686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch     * @return {!WebInspector.UILocation}
7696f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch     */
7706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    uiLocation: function(lineNumber, columnNumber)
7716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
7726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (typeof columnNumber === "undefined")
7736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            columnNumber = 0;
7746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return new WebInspector.UILocation(this, lineNumber, columnNumber);
7756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    },
7766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.Object.prototype
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
782a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.UISourceCode} uiSourceCode
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} lineNumber
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} columnNumber
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.UILocation = function(uiSourceCode, lineNumber, columnNumber)
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.uiSourceCode = uiSourceCode;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.lineNumber = lineNumber;
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.columnNumber = columnNumber;
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.UILocation.prototype = {
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
795d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Target} target
796a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {?WebInspector.RawLocation}
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
798d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    uiLocationToRawLocation: function(target)
799d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
800d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return this.uiSourceCode.uiLocationToRawLocation(target, this.lineNumber, this.columnNumber);
801d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
802d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
803d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
804d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @return {!Array.<!WebInspector.RawLocation>}
805d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
806d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    uiLocationToRawLocations: function()
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
808d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return this.uiSourceCode.uiLocationToRawLocations(this.lineNumber, this.columnNumber);
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
81253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @return {string}
81353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
81453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    linkText: function()
81553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
816e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var linkText = this.uiSourceCode.displayName();
81753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (typeof this.lineNumber === "number")
81853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            linkText += ":" + (this.lineNumber + 1);
81953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return linkText;
820d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
821d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
822d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
823d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @return {string}
824d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
825d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    id: function()
826d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
827d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return this.uiSourceCode.uri() + ":" + this.lineNumber + ":" + this.columnNumber;
828d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @interface
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.RawLocation = function()
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
838aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochWebInspector.RawLocation.prototype = {
839aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    /**
840aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @return {?WebInspector.UILocation}
841aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     */
842aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    toUILocation: function() { }
843aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
844aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
847a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.RawLocation} rawLocation
848a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.UILocation):(boolean|undefined)} updateDelegate
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.LiveLocation = function(rawLocation, updateDelegate)
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._rawLocation = rawLocation;
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._updateDelegate = updateDelegate;
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.LiveLocation.prototype = {
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    update: function()
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var uiLocation = this.uiLocation();
860d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!uiLocation)
861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return;
862d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (this._updateDelegate(uiLocation))
863d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this.dispose();
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
867a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.RawLocation}
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rawLocation: function()
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._rawLocation;
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
875a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.UILocation}
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uiLocation: function()
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
87909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        throw "Not implemented";
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispose: function()
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // Overridden by subclasses.
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.ContentProvider}
891a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.UISourceCode} uiSourceCode
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {?string|undefined} content
893a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Date} timestamp
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Revision = function(uiSourceCode, content, timestamp)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._uiSourceCode = uiSourceCode;
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._content = content;
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._timestamp = timestamp;
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Revision._revisionHistoryRegistry = function()
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!WebInspector.Revision._revisionHistoryRegistryObject) {
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (window.localStorage) {
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var revisionHistory = window.localStorage["revision-history"];
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            try {
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.Revision._revisionHistoryRegistryObject = revisionHistory ? JSON.parse(revisionHistory) : {};
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } catch (e) {
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.Revision._revisionHistoryRegistryObject = {};
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebInspector.Revision._revisionHistoryRegistryObject = {};
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebInspector.Revision._revisionHistoryRegistryObject;
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Revision.filterOutStaleRevisions = function()
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!window.localStorage)
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var registry = WebInspector.Revision._revisionHistoryRegistry();
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var filteredRegistry = {};
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var url in registry) {
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var historyItems = registry[url];
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var filteredHistoryItems = [];
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; historyItems && i < historyItems.length; ++i) {
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var historyItem = historyItems[i];
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (historyItem.loaderId === WebInspector.resourceTreeModel.mainFrame.loaderId) {
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                filteredHistoryItems.push(historyItem);
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                filteredRegistry[url] = filteredHistoryItems;
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                delete window.localStorage[historyItem.key];
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.Revision._revisionHistoryRegistryObject = filteredRegistry;
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function persist()
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        window.localStorage["revision-history"] = JSON.stringify(filteredRegistry);
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Schedule async storage.
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setTimeout(persist, 0);
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Revision.prototype = {
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
950a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.UISourceCode}
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get uiSourceCode()
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._uiSourceCode;
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
958a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Date}
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get timestamp()
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._timestamp;
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {?string}
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get content()
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._content || null;
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    revertToThis: function()
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        /**
97609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {string} content
97709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.Revision}
9781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)         */
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function revert(content)
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._uiSourceCode._content !== content)
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._uiSourceCode.addRevision(content);
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.requestContent(revert.bind(this));
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentURL: function()
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._uiSourceCode.originURL();
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
996a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!WebInspector.ResourceType}
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    contentType: function()
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._uiSourceCode.contentType();
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
100409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {function(string)} callback
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    requestContent: function(callback)
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        callback(this._content || "");
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} caseSensitive
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} isRegex
1015a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!Array.<!WebInspector.ContentProvider.SearchMatch>)} callback
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    searchInContent: function(query, caseSensitive, isRegex, callback)
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        callback([]);
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _persist: function()
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1024591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem)
1025591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return;
1026591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!window.localStorage)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var url = this.contentURL();
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!url || url.startsWith("inspector://"))
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var loaderId = WebInspector.resourceTreeModel.mainFrame.loaderId;
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var timestamp = this.timestamp.getTime();
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var key = "revision-history|" + url + "|" + loaderId + "|" + timestamp;
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var registry = WebInspector.Revision._revisionHistoryRegistry();
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var historyItems = registry[url];
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!historyItems) {
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            historyItems = [];
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            registry[url] = historyItems;
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        historyItems.push({url: url, loaderId: loaderId, timestamp: timestamp, key: key});
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
104809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.Revision}
104909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function persist()
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            window.localStorage[key] = this._content;
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            window.localStorage["revision-history"] = JSON.stringify(registry);
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Schedule async storage.
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setTimeout(persist.bind(this), 0);
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1060