Home | History | Annotate | Download | only in front_end
      1 /*
      2  * Copyright (C) 2012 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 /**
     32  * @constructor
     33  * @extends {WebInspector.ContentProviderBasedProjectDelegate}
     34  * @param {string} name
     35  * @param {string} type
     36  */
     37 WebInspector.SimpleProjectDelegate = function(name, type)
     38 {
     39     WebInspector.ContentProviderBasedProjectDelegate.call(this, type);
     40     this._name = name;
     41     this._lastUniqueSuffix = 0;
     42 }
     43 
     44 WebInspector.SimpleProjectDelegate.projectId = function(name, type)
     45 {
     46     var typePrefix = type !== WebInspector.projectTypes.Network ? (type + ":") : "";
     47     return typePrefix + name;
     48 }
     49 
     50 WebInspector.SimpleProjectDelegate.prototype = {
     51     /**
     52      * @return {string}
     53      */
     54     id: function()
     55     {
     56         return WebInspector.SimpleProjectDelegate.projectId(this._name, this.type());
     57     },
     58 
     59     /**
     60      * @return {string}
     61      */
     62     displayName: function()
     63     {
     64         if (typeof this._displayName !== "undefined")
     65             return this._displayName;
     66         if (!this._name) {
     67             this._displayName = this.type() !== WebInspector.projectTypes.Snippets ? WebInspector.UIString("(no domain)") : "";
     68             return this._displayName;
     69         }
     70         var parsedURL = new WebInspector.ParsedURL(this._name);
     71         if (parsedURL.isValid) {
     72             this._displayName = parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "");
     73             if (!this._displayName)
     74                 this._displayName = this._name;
     75         }
     76         else
     77             this._displayName = this._name;
     78         return this._displayName;
     79     },
     80 
     81     /**
     82      * @param {string} parentPath
     83      * @param {string} name
     84      * @param {string} url
     85      * @param {WebInspector.ContentProvider} contentProvider
     86      * @param {boolean} isEditable
     87      * @param {boolean=} isContentScript
     88      * @return {string}
     89      */
     90     addFile: function(parentPath, name, forceUniquePath, url, contentProvider, isEditable, isContentScript)
     91     {
     92         if (forceUniquePath)
     93             name = this._ensureUniqueName(parentPath, name);
     94         return this.addContentProvider(parentPath, name, url, contentProvider, isEditable, isContentScript);
     95     },
     96 
     97     /**
     98      * @param {string} parentPath
     99      * @param {string} name
    100      * @return {string}
    101      */
    102     _ensureUniqueName: function(parentPath, name)
    103      {
    104         var path = parentPath ? parentPath + "/" + name : name;
    105         var uniquePath = path;
    106         var suffix = "";
    107         var contentProviders = this.contentProviders();
    108         while (contentProviders[uniquePath]) {
    109             suffix = " (" + (++this._lastUniqueSuffix) + ")";
    110             uniquePath = path + suffix;
    111         }
    112         return name + suffix;
    113     },
    114 
    115     __proto__: WebInspector.ContentProviderBasedProjectDelegate.prototype
    116 }
    117 
    118 /**
    119  * @constructor
    120  * @extends {WebInspector.Object}
    121  * @param {WebInspector.Workspace} workspace
    122  * @param {string} type
    123  */
    124 WebInspector.SimpleWorkspaceProvider = function(workspace, type)
    125 {
    126     this._workspace = workspace;
    127     this._type = type;
    128     this._simpleProjectDelegates = {};
    129 }
    130 
    131 WebInspector.SimpleWorkspaceProvider.prototype = {
    132     /**
    133      * @param {string} projectName
    134      * @return {WebInspector.SimpleProjectDelegate}
    135      */
    136     _projectDelegate: function(projectName)
    137     {
    138         if (this._simpleProjectDelegates[projectName])
    139             return this._simpleProjectDelegates[projectName];
    140         var simpleProjectDelegate = new WebInspector.SimpleProjectDelegate(projectName, this._type);
    141         this._simpleProjectDelegates[projectName] = simpleProjectDelegate;
    142         this._workspace.addProject(simpleProjectDelegate);
    143         return simpleProjectDelegate;
    144     },
    145 
    146     /**
    147      * @param {string} url
    148      * @param {WebInspector.ContentProvider} contentProvider
    149      * @param {boolean} isEditable
    150      * @param {boolean=} isContentScript
    151      * @return {WebInspector.UISourceCode}
    152      */
    153     addFileForURL: function(url, contentProvider, isEditable, isContentScript)
    154     {
    155         return this._innerAddFileForURL(url, contentProvider, isEditable, false, isContentScript);
    156     },
    157 
    158     /**
    159      * @param {string} url
    160      * @param {WebInspector.ContentProvider} contentProvider
    161      * @param {boolean} isEditable
    162      * @param {boolean=} isContentScript
    163      * @return {WebInspector.UISourceCode}
    164      */
    165     addUniqueFileForURL: function(url, contentProvider, isEditable, isContentScript)
    166     {
    167         return this._innerAddFileForURL(url, contentProvider, isEditable, true, isContentScript);
    168     },
    169 
    170     /**
    171      * @param {string} url
    172      * @param {WebInspector.ContentProvider} contentProvider
    173      * @param {boolean} isEditable
    174      * @param {boolean} forceUnique
    175      * @param {boolean=} isContentScript
    176      * @return {WebInspector.UISourceCode}
    177      */
    178     _innerAddFileForURL: function(url, contentProvider, isEditable, forceUnique, isContentScript)
    179     {
    180         var splitURL = WebInspector.ParsedURL.splitURL(url);
    181         var projectName = splitURL[0];
    182         var parentPath = splitURL.slice(1, splitURL.length - 1).join("/");
    183         var name = splitURL[splitURL.length - 1];
    184         var projectDelegate = this._projectDelegate(projectName);
    185         var path = projectDelegate.addFile(parentPath, name, forceUnique, url, contentProvider, isEditable, isContentScript);
    186         return this._workspace.uiSourceCode(projectDelegate.id(), path);
    187     },
    188 
    189     reset: function()
    190     {
    191         for (var projectName in this._simpleProjectDelegates)
    192             this._simpleProjectDelegates[projectName].reset();
    193         this._simpleProjectDelegates = {};
    194     },
    195 
    196     __proto__: WebInspector.Object.prototype
    197 }
    198