OLD | NEW |
| (Empty) |
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.SDKObject} | |
34 * @param {!WebInspector.Target} target | |
35 * @param {!WebInspector.Workspace} workspace | |
36 * @param {!WebInspector.DebuggerWorkspaceBinding} debuggerWorkspaceBinding | |
37 */ | |
38 WebInspector.LiveEditSupport = function(target, workspace, debuggerWorkspaceBind
ing) | |
39 { | |
40 WebInspector.SDKObject.call(this, target); | |
41 this._workspace = workspace; | |
42 this._debuggerWorkspaceBinding = debuggerWorkspaceBinding; | |
43 this._projectId = "liveedit:" + target.id(); | |
44 this._projectDelegate = new WebInspector.DebuggerProjectDelegate(workspace,
this._projectId, WebInspector.projectTypes.LiveEdit); | |
45 target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.Glob
alObjectCleared, this._debuggerReset, this); | |
46 this._debuggerReset(); | |
47 } | |
48 | |
49 WebInspector.LiveEditSupport.prototype = { | |
50 /** | |
51 * @param {!WebInspector.UISourceCode} uiSourceCode | |
52 * @return {?WebInspector.UISourceCode} | |
53 */ | |
54 uiSourceCodeForLiveEdit: function(uiSourceCode) | |
55 { | |
56 var debuggerModelLocation = this._debuggerWorkspaceBinding.uiLocationToR
awLocation(this.target(), uiSourceCode, 0, 0); | |
57 if (!debuggerModelLocation) | |
58 return null; | |
59 var uiLocation = this._debuggerWorkspaceBinding.rawLocationToUILocation(
debuggerModelLocation); | |
60 | |
61 // FIXME: Support live editing of scripts mapped to some file. | |
62 if (uiLocation.uiSourceCode !== uiSourceCode) | |
63 return uiLocation.uiSourceCode; | |
64 | |
65 var script = debuggerModelLocation.script(); | |
66 if (this._uiSourceCodeForScriptId[script.scriptId]) | |
67 return this._uiSourceCodeForScriptId[script.scriptId]; | |
68 | |
69 console.assert(!script.isInlineScript()); | |
70 var path = this._projectDelegate.addScript(script); | |
71 var liveEditUISourceCode = this._workspace.uiSourceCode(this._projectId,
path); | |
72 | |
73 liveEditUISourceCode.addEventListener(WebInspector.UISourceCode.Events.W
orkingCopyCommitted, this._workingCopyCommitted, this); | |
74 this._uiSourceCodeForScriptId[script.scriptId] = liveEditUISourceCode; | |
75 this._scriptIdForUISourceCode.put(liveEditUISourceCode, script.scriptId)
; | |
76 return liveEditUISourceCode; | |
77 }, | |
78 | |
79 _debuggerReset: function() | |
80 { | |
81 /** @type {!Object.<string, !WebInspector.UISourceCode>} */ | |
82 this._uiSourceCodeForScriptId = {}; | |
83 /** @type {!Map.<!WebInspector.UISourceCode, string>} */ | |
84 this._scriptIdForUISourceCode = new Map(); | |
85 this._projectDelegate.reset(); | |
86 }, | |
87 | |
88 /** | |
89 * @param {!WebInspector.Event} event | |
90 */ | |
91 _workingCopyCommitted: function(event) | |
92 { | |
93 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.targ
et); | |
94 var scriptId = /** @type {string} */ (this._scriptIdForUISourceCode.get(
uiSourceCode)); | |
95 this.target().debuggerModel.setScriptSource(scriptId, uiSourceCode.worki
ngCopy(), innerCallback.bind(this)); | |
96 | |
97 /** | |
98 * @this {WebInspector.LiveEditSupport} | |
99 * @param {?string} error | |
100 * @param {!DebuggerAgent.SetScriptSourceError=} errorData | |
101 */ | |
102 function innerCallback(error, errorData) | |
103 { | |
104 if (error) { | |
105 var script = this.target().debuggerModel.scriptForId(scriptId); | |
106 WebInspector.LiveEditSupport.logDetailedError(error, errorData,
script); | |
107 return; | |
108 } | |
109 WebInspector.LiveEditSupport.logSuccess(); | |
110 } | |
111 }, | |
112 | |
113 __proto__: WebInspector.SDKObject.prototype | |
114 } | |
115 | |
116 /** | |
117 * @param {!WebInspector.UISourceCode} uiSourceCode | |
118 * @return {?WebInspector.LiveEditSupport} | |
119 */ | |
120 WebInspector.LiveEditSupport.liveEditSupportForUISourceCode = function(uiSourceC
ode) | |
121 { | |
122 var projectId = uiSourceCode.project().id(); | |
123 var target = null; | |
124 var targets = WebInspector.targetManager.targets(); | |
125 for (var i = 0; i < targets.length; ++i) { | |
126 if (projectId === WebInspector.DefaultScriptMapping.projectIdForTarget(t
argets[i])) { | |
127 target = targets[i]; | |
128 break; | |
129 } | |
130 } | |
131 return target ? WebInspector.debuggerWorkspaceBinding.liveEditSupport(target
) : null; | |
132 } | |
133 | |
134 /** | |
135 * @param {?string} error | |
136 * @param {!DebuggerAgent.SetScriptSourceError=} errorData | |
137 * @param {!WebInspector.Script=} contextScript | |
138 */ | |
139 WebInspector.LiveEditSupport.logDetailedError = function(error, errorData, conte
xtScript) | |
140 { | |
141 var warningLevel = WebInspector.Console.MessageLevel.Warning; | |
142 if (!errorData) { | |
143 if (error) | |
144 WebInspector.console.addMessage(WebInspector.UIString("LiveEdit fail
ed: %s", error), warningLevel); | |
145 return; | |
146 } | |
147 var compileError = errorData.compileError; | |
148 if (compileError) { | |
149 var location = contextScript ? WebInspector.UIString(" at %s:%d:%d", con
textScript.sourceURL, compileError.lineNumber, compileError.columnNumber) : ""; | |
150 var message = WebInspector.UIString("LiveEdit compile failed: %s%s", com
pileError.message, location); | |
151 WebInspector.console.error(message); | |
152 } else { | |
153 WebInspector.console.addMessage(WebInspector.UIString("Unknown LiveEdit
error: %s; %s", JSON.stringify(errorData), error), warningLevel); | |
154 } | |
155 } | |
156 | |
157 WebInspector.LiveEditSupport.logSuccess = function() | |
158 { | |
159 WebInspector.console.log(WebInspector.UIString("Recompilation and update suc
ceeded.")); | |
160 } | |
OLD | NEW |