OLD | NEW |
---|---|
(Empty) | |
1 | |
2 // Copyright 2014 The Chromium Authors. All rights reserved. | |
3 // Use of this source code is governed by a BSD-style license that can be | |
4 // found in the LICENSE file. | |
5 | |
6 /** | |
7 * @constructor | |
8 * @param {!WebInspector.SourcesPanel} sourcesPanel | |
9 * @param {!WebInspector.Workspace} workspace | |
10 */ | |
11 WebInspector.WorkspaceMappingSuggester = function(sourcesPanel, workspace) | |
pfeldman
2014/10/03 11:26:56
WorkspaceMappingTip
WorkspaceMappingHint
| |
12 { | |
13 this._sourcesPanel = sourcesPanel; | |
14 this._workspace = workspace; | |
15 | |
16 this._sourcesView = this._sourcesPanel.sourcesView(); | |
17 this._sourcesView.addEventListener(WebInspector.SourcesView.Events.EditorSel ected, this._editorSelected.bind(this)); | |
18 } | |
19 | |
20 WebInspector.WorkspaceMappingSuggester._infobarSymbol = Symbol("infobar"); | |
21 | |
22 WebInspector.WorkspaceMappingSuggester.prototype = { | |
23 /** | |
24 * @param {!WebInspector.Event} event | |
25 */ | |
26 _editorSelected: function(event) | |
27 { | |
28 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data ); | |
29 if (Runtime.experiments.isEnabled("suggestUsingWorkspace")) { | |
30 if (this._editorSelectedTimer) | |
31 clearTimeout(this._editorSelectedTimer); | |
32 this._editorSelectedTimer = setTimeout(this._updateSuggestedMappingI nfobar.bind(this, uiSourceCode), 3000); | |
33 } | |
34 }, | |
35 | |
36 /** | |
37 * @param {!WebInspector.UISourceCode} uiSourceCode | |
38 */ | |
39 _updateSuggestedMappingInfobar: function(uiSourceCode) | |
40 { | |
41 var uiSourceCodeFrame = this._sourcesView.viewForFile(uiSourceCode); | |
42 | |
43 if (!uiSourceCodeFrame.isShowing()) | |
44 return; | |
45 if (uiSourceCode[WebInspector.WorkspaceMappingSuggester._infobarSymbol]) | |
46 return; | |
47 | |
48 // First try mapping filesystem -> network. | |
49 if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSyst em) { | |
50 var hasMappings = !!uiSourceCode.url; | |
51 if (hasMappings) | |
52 return; | |
53 } | |
54 | |
55 var networkProjects = this._workspace.projectsForType(WebInspector.proje ctTypes.FileSystem); | |
56 networkProjects = networkProjects.concat(this._workspace.projectsForType (WebInspector.projectTypes.ContentScripts)); | |
57 for (var i = 0; i < networkProjects.length; ++i) { | |
58 var name = uiSourceCode.name(); | |
59 var networkUiSourceCodes = networkProjects[i].uiSourceCodes(); | |
60 for (var j = 0; j < networkUiSourceCodes.length; ++j) { | |
61 if (networkUiSourceCodes[j].name() === name) { | |
62 this._createMappingInfobar(uiSourceCode, false); | |
63 return; | |
64 } | |
65 } | |
66 } | |
67 | |
68 // Then map network -> filesystem. | |
69 if (uiSourceCode.project().type() === WebInspector.projectTypes.Network || uiSourceCode.project().type() === WebInspector.projectTypes.ContentScripts) { | |
70 if (this._workspace.uiSourceCodeForURL(uiSourceCode.url) !== uiSourc eCode) | |
71 return; | |
72 | |
73 var filesystemProjects = this._workspace.projectsForType(WebInspecto r.projectTypes.FileSystem); | |
74 for (var i = 0; i < filesystemProjects.length; ++i) { | |
75 var name = uiSourceCode.name(); | |
76 var fsUiSourceCodes = filesystemProjects[i].uiSourceCodes(); | |
77 for (var j = 0; j < fsUiSourceCodes.length; ++j) { | |
78 if (fsUiSourceCodes[j].name() === name) { | |
79 this._createMappingInfobar(uiSourceCode, true); | |
80 return; | |
81 } | |
82 } | |
83 } | |
84 | |
85 // There are no matching filesystems. Suggest adding a filesystem in case of localhost. | |
86 var originURL = uiSourceCode.originURL().asParsedURL(); | |
87 if (originURL && originURL.host === "localhost") | |
88 this._createWorkspaceInfobar(uiSourceCode); | |
89 } | |
90 }, | |
91 | |
92 /** | |
93 * @param {!WebInspector.UISourceCode} uiSourceCode | |
94 */ | |
95 _createWorkspaceInfobar: function(uiSourceCode) | |
96 { | |
97 var infobar = new WebInspector.UISourceCodeFrame.Infobar(WebInspecto r.UISourceCodeFrame.Infobar.Level.Info, WebInspector.UIString("Serving from the file system? Add your files into the workspace.")); | |
98 infobar.createDetailsRowMessage(WebInspector.UIString("If you add fi les into your DevTools workspace, your changes will be persisted to disk.")); | |
99 infobar.createDetailsRowMessage(WebInspector.UIString("To add a fold er into the workspace, drag and drop it into the Sources panel.")); | |
100 this._appendInfobar(uiSourceCode, infobar); | |
101 }, | |
102 | |
103 /** | |
104 * @param {!WebInspector.UISourceCode} uiSourceCode | |
105 * @param {boolean} isNetwork | |
106 */ | |
107 _createMappingInfobar: function(uiSourceCode, isNetwork) | |
108 { | |
109 var title; | |
110 if (isNetwork) | |
111 title = WebInspector.UIString("Map network resource '%s' to workspac e?", uiSourceCode.originURL()); | |
112 else | |
113 title = WebInspector.UIString("Map workspace resource '%s' to networ k?", uiSourceCode.path()); | |
114 | |
115 var infobar = new WebInspector.UISourceCodeFrame.Infobar(WebInspector.UI SourceCodeFrame.Infobar.Level.Info, title); | |
116 infobar.createDetailsRowMessage(WebInspector.UIString("You can map files in your workspace to the ones loaded over the network. As a result, changes mad e in DevTools will be persisted to disk.")); | |
117 infobar.createDetailsRowMessage(WebInspector.UIString("Use context menu to establish the mapping at any time.")); | |
118 var actionLink = infobar.createDetailsRowMessage("").createChild("a"); | |
119 actionLink.href = ""; | |
120 actionLink.onclick = this._establishTheMapping.bind(this, uiSourceCode); | |
121 actionLink.textContent = WebInspector.UIString("Establish the mapping no w..."); | |
122 this._appendInfobar(uiSourceCode, infobar); | |
123 }, | |
124 | |
125 /** | |
126 * @param {!WebInspector.UISourceCode} uiSourceCode | |
127 * @param {?Event} event | |
128 */ | |
129 _establishTheMapping: function(uiSourceCode, event) | |
130 { | |
131 event.consume(true); | |
132 if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSyst em) | |
133 this._sourcesPanel.mapFileSystemToNetwork(uiSourceCode); | |
134 else | |
135 this._sourcesPanel.mapNetworkToFileSystem(uiSourceCode); | |
136 }, | |
137 | |
138 /** | |
139 * @param {!WebInspector.UISourceCode} uiSourceCode | |
140 * @param {!WebInspector.UISourceCodeFrame.Infobar} infobar | |
141 */ | |
142 _appendInfobar: function(uiSourceCode, infobar) | |
143 { | |
144 var uiSourceCodeFrame = this._sourcesView.viewForFile(uiSourceCode); | |
145 | |
146 infobar.createDetailsRowMessage("").createChild("br"); | |
147 var rowElement = infobar.createDetailsRowMessage(WebInspector.UIString(" For more information on workspaces, refer to the ")); | |
148 var a = rowElement.createChild("a"); | |
149 a.textContent = "workspaces documentation"; | |
150 a.href = "https://developer.chrome.com/devtools/docs/workspaces"; | |
151 rowElement.createTextChild("."); | |
152 uiSourceCode[WebInspector.WorkspaceMappingSuggester._infobarSymbol] = in fobar; | |
153 uiSourceCodeFrame.attachInfobars([infobar]); | |
154 } | |
155 } | |
OLD | NEW |