| 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 |