OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012, the Dart project authors. | 2 * Copyright (c) 2012, the Dart project authors. |
3 * | 3 * |
4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u
se this file except | 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u
se this file except |
5 * in compliance with the License. You may obtain a copy of the License at | 5 * in compliance with the License. You may obtain a copy of the License at |
6 * | 6 * |
7 * http://www.eclipse.org/legal/epl-v10.html | 7 * http://www.eclipse.org/legal/epl-v10.html |
8 * | 8 * |
9 * Unless required by applicable law or agreed to in writing, software distribut
ed under the License | 9 * Unless required by applicable law or agreed to in writing, software distribut
ed under the License |
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express | 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express |
11 * or implied. See the License for the specific language governing permissions a
nd limitations under | 11 * or implied. See the License for the specific language governing permissions a
nd limitations under |
12 * the License. | 12 * the License. |
13 */ | 13 */ |
14 | 14 |
15 package com.google.dart.tools.debug.core.dartium; | 15 package com.google.dart.tools.debug.core.dartium; |
16 | 16 |
| 17 import com.google.common.annotations.VisibleForTesting; |
17 import com.google.dart.tools.core.DartCore; | 18 import com.google.dart.tools.core.DartCore; |
18 import com.google.dart.tools.debug.core.DartDebugCorePlugin; | 19 import com.google.dart.tools.debug.core.DartDebugCorePlugin; |
19 import com.google.dart.tools.debug.core.breakpoints.DartBreakpoint; | 20 import com.google.dart.tools.debug.core.breakpoints.DartBreakpoint; |
20 import com.google.dart.tools.debug.core.util.IResourceResolver; | 21 import com.google.dart.tools.debug.core.util.IResourceResolver; |
21 import com.google.dart.tools.debug.core.webkit.WebkitBreakpoint; | 22 import com.google.dart.tools.debug.core.webkit.WebkitBreakpoint; |
22 import com.google.dart.tools.debug.core.webkit.WebkitCallback; | 23 import com.google.dart.tools.debug.core.webkit.WebkitCallback; |
23 import com.google.dart.tools.debug.core.webkit.WebkitLocation; | 24 import com.google.dart.tools.debug.core.webkit.WebkitLocation; |
24 import com.google.dart.tools.debug.core.webkit.WebkitResult; | 25 import com.google.dart.tools.debug.core.webkit.WebkitResult; |
25 import com.google.dart.tools.debug.core.webkit.WebkitScript; | 26 import com.google.dart.tools.debug.core.webkit.WebkitScript; |
26 | 27 |
27 import org.eclipse.core.resources.IContainer; | 28 import org.eclipse.core.resources.IContainer; |
28 import org.eclipse.core.resources.IFile; | 29 import org.eclipse.core.resources.IFile; |
29 import org.eclipse.core.resources.IMarkerDelta; | 30 import org.eclipse.core.resources.IMarkerDelta; |
30 import org.eclipse.core.resources.IWorkspaceRoot; | 31 import org.eclipse.core.resources.IWorkspaceRoot; |
| 32 import org.eclipse.core.runtime.Path; |
31 import org.eclipse.debug.core.DebugPlugin; | 33 import org.eclipse.debug.core.DebugPlugin; |
32 import org.eclipse.debug.core.IBreakpointListener; | 34 import org.eclipse.debug.core.IBreakpointListener; |
33 import org.eclipse.debug.core.model.IBreakpoint; | 35 import org.eclipse.debug.core.model.IBreakpoint; |
34 | 36 |
35 import java.io.IOException; | 37 import java.io.IOException; |
36 import java.util.ArrayList; | 38 import java.util.ArrayList; |
37 import java.util.HashMap; | 39 import java.util.HashMap; |
38 import java.util.List; | 40 import java.util.List; |
39 import java.util.Map; | 41 import java.util.Map; |
40 | 42 |
41 /** | 43 /** |
42 * Handle adding a removing breakpoints to the WebKit connection for the Dartium
DebugTarget class. | 44 * Handle adding a removing breakpoints to the WebKit connection for the Dartium
DebugTarget class. |
43 */ | 45 */ |
44 class BreakpointManager implements IBreakpointListener { | 46 public class BreakpointManager implements IBreakpointListener { |
45 | 47 |
46 private static String PACKAGES_DIRECTORY_PATH = "/packages/"; | 48 private static String PACKAGES_DIRECTORY_PATH = "/packages/"; |
47 private static String LIB_DIRECTORY_PATH = "/lib/"; | 49 private static String LIB_DIRECTORY_PATH = "/lib/"; |
48 | 50 |
49 private DartiumDebugTarget debugTarget; | 51 private DartiumDebugTarget debugTarget; |
50 | 52 |
51 private Map<IBreakpoint, List<String>> breakpointToIdMap = new HashMap<IBreakp
oint, List<String>>(); | 53 private Map<IBreakpoint, List<String>> |
52 private Map<String, DartBreakpoint> breakpointsToUpdateMap = new HashMap<Strin
g, DartBreakpoint>(); | 54 breakpointToIdMap = new HashMap<IBreakpoint, List<String>>(); |
| 55 private Map<String, DartBreakpoint> |
| 56 breakpointsToUpdateMap = new HashMap<String, DartBreakpoint>(); |
53 | 57 |
54 private List<IBreakpoint> ignoredBreakpoints = new ArrayList<IBreakpoint>(); | 58 private List<IBreakpoint> ignoredBreakpoints = new ArrayList<IBreakpoint>(); |
55 | 59 |
56 public BreakpointManager(DartiumDebugTarget debugTarget) { | 60 public BreakpointManager(DartiumDebugTarget debugTarget) { |
57 this.debugTarget = debugTarget; | 61 this.debugTarget = debugTarget; |
58 } | 62 } |
59 | 63 |
60 @Override | 64 @Override |
61 public void breakpointAdded(IBreakpoint breakpoint) { | 65 public void breakpointAdded(IBreakpoint breakpoint) { |
62 if (debugTarget.supportsBreakpoint(breakpoint)) { | 66 if (debugTarget.supportsBreakpoint(breakpoint)) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 if (!debugTarget.isTerminated()) { | 104 if (!debugTarget.isTerminated()) { |
101 DartDebugCorePlugin.logError(exception); | 105 DartDebugCorePlugin.logError(exception); |
102 } | 106 } |
103 } | 107 } |
104 } | 108 } |
105 } | 109 } |
106 } | 110 } |
107 } | 111 } |
108 | 112 |
109 public void connect() throws IOException { | 113 public void connect() throws IOException { |
110 IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().
getBreakpoints( | 114 IBreakpoint[] breakpoints = DebugPlugin.getDefault() |
111 DartDebugCorePlugin.DEBUG_MODEL_ID); | 115 .getBreakpointManager().getBreakpoints(DartDebugCorePlugin.DEBUG_MODEL_I
D); |
112 | 116 |
113 for (IBreakpoint breakpoint : breakpoints) { | 117 for (IBreakpoint breakpoint : breakpoints) { |
114 if (debugTarget.supportsBreakpoint(breakpoint)) { | 118 if (debugTarget.supportsBreakpoint(breakpoint)) { |
115 addBreakpoint((DartBreakpoint) breakpoint); | 119 addBreakpoint((DartBreakpoint) breakpoint); |
116 } | 120 } |
117 } | 121 } |
118 | 122 |
119 DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); | 123 DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); |
120 } | 124 } |
121 | 125 |
(...skipping 14 matching lines...) Expand all Loading... |
136 DartDebugCorePlugin.logError(exception); | 140 DartDebugCorePlugin.logError(exception); |
137 } | 141 } |
138 } | 142 } |
139 } | 143 } |
140 | 144 |
141 DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(t
his); | 145 DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(t
his); |
142 } | 146 } |
143 } | 147 } |
144 | 148 |
145 public DartBreakpoint getBreakpointFor(WebkitLocation location) { | 149 public DartBreakpoint getBreakpointFor(WebkitLocation location) { |
146 IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().
getBreakpoints( | 150 IBreakpoint[] breakpoints = DebugPlugin.getDefault() |
147 DartDebugCorePlugin.DEBUG_MODEL_ID); | 151 .getBreakpointManager().getBreakpoints(DartDebugCorePlugin.DEBUG_MODEL_I
D); |
148 | 152 |
149 WebkitScript script = debugTarget.getWebkitConnection().getDebugger().getScr
ipt( | 153 WebkitScript script = debugTarget.getWebkitConnection() |
150 location.getScriptId()); | 154 .getDebugger().getScript(location.getScriptId()); |
151 | 155 |
152 if (script == null) { | 156 if (script == null) { |
153 return null; | 157 return null; |
154 } | 158 } |
155 | 159 |
156 String url = script.getUrl(); | 160 String url = script.getUrl(); |
157 int line = WebkitLocation.webkitToElipseLine(location.getLineNumber()); | 161 int line = WebkitLocation.webkitToElipseLine(location.getLineNumber()); |
158 | 162 |
159 for (IBreakpoint bp : breakpoints) { | 163 for (IBreakpoint bp : breakpoints) { |
160 if (debugTarget.supportsBreakpoint(bp)) { | 164 if (debugTarget.supportsBreakpoint(bp)) { |
161 DartBreakpoint breakpoint = (DartBreakpoint) bp; | 165 DartBreakpoint breakpoint = (DartBreakpoint) bp; |
162 | 166 |
163 if (breakpoint.getLine() == line) { | 167 if (breakpoint.getLine() == line) { |
164 String bpUrl = getResourceResolver().getUrlForResource(breakpoint.getF
ile()); | 168 String bpUrl = getResourceResolver().getUrlForResource(breakpoint.getF
ile()); |
165 | 169 |
166 if (bpUrl != null && bpUrl.equals(url)) { | 170 if (bpUrl != null && bpUrl.equals(url)) { |
167 return breakpoint; | 171 return breakpoint; |
168 } | 172 } |
169 } | 173 } |
170 } | 174 } |
171 } | 175 } |
172 | 176 |
173 return null; | 177 return null; |
174 } | 178 } |
175 | 179 |
| 180 @VisibleForTesting |
| 181 public String getPackagePath(String regex, IFile resource) { |
| 182 Path path = new Path(regex); |
| 183 int i = 0; |
| 184 if (regex.indexOf(LIB_DIRECTORY_PATH) != -1) { |
| 185 // remove all segments after "lib", they show path in the package |
| 186 while (i < path.segmentCount() && !path.segment(i).equals("lib")) { |
| 187 i++; |
| 188 } |
| 189 } else { |
| 190 i = 1; |
| 191 } |
| 192 String filePath = new Path(regex).removeLastSegments(path.segmentCount() - (
i + 1)).toString(); |
| 193 |
| 194 String packagePath = resolvePathToPackage(resource, filePath); |
| 195 if (packagePath != null) { |
| 196 packagePath += "/" + path.removeFirstSegments(i + 1); |
| 197 } |
| 198 return packagePath; |
| 199 } |
| 200 |
| 201 @VisibleForTesting |
| 202 protected String resolvePathToPackage(IFile resource, String filePath) { |
| 203 return DartCore.getProjectManager().resolvePathToPackage(resource, filePath)
; |
| 204 } |
| 205 |
176 void addToBreakpointMap(IBreakpoint breakpoint, String id, boolean trackChange
s) { | 206 void addToBreakpointMap(IBreakpoint breakpoint, String id, boolean trackChange
s) { |
177 synchronized (breakpointToIdMap) { | 207 synchronized (breakpointToIdMap) { |
178 if (breakpointToIdMap.get(breakpoint) == null) { | 208 if (breakpointToIdMap.get(breakpoint) == null) { |
179 breakpointToIdMap.put(breakpoint, new ArrayList<String>()); | 209 breakpointToIdMap.put(breakpoint, new ArrayList<String>()); |
180 } | 210 } |
181 | 211 |
182 breakpointToIdMap.get(breakpoint).add(id); | 212 breakpointToIdMap.get(breakpoint).add(id); |
183 | 213 |
184 if (trackChanges) { | 214 if (trackChanges) { |
185 breakpointsToUpdateMap.put(id, (DartBreakpoint) breakpoint); | 215 breakpointsToUpdateMap.put(id, (DartBreakpoint) breakpoint); |
186 } | 216 } |
187 } | 217 } |
188 } | 218 } |
189 | 219 |
190 void handleBreakpointResolved(WebkitBreakpoint webkitBreakpoint) { | 220 void handleBreakpointResolved(WebkitBreakpoint webkitBreakpoint) { |
191 DartBreakpoint breakpoint = breakpointsToUpdateMap.get(webkitBreakpoint.getB
reakpointId()); | 221 DartBreakpoint breakpoint = breakpointsToUpdateMap.get(webkitBreakpoint.getB
reakpointId()); |
192 | 222 |
193 if (breakpoint != null) { | 223 if (breakpoint != null) { |
194 int eclipseLine = WebkitLocation.webkitToElipseLine(webkitBreakpoint.getLo
cation().getLineNumber()); | 224 int eclipseLine = WebkitLocation.webkitToElipseLine( |
| 225 webkitBreakpoint.getLocation().getLineNumber()); |
195 | 226 |
196 if (breakpoint.getLine() != eclipseLine) { | 227 if (breakpoint.getLine() != eclipseLine) { |
197 ignoredBreakpoints.add(breakpoint); | 228 ignoredBreakpoints.add(breakpoint); |
198 | 229 |
199 String message = "[breakpoint in " + breakpoint.getFile().getName() + "
moved from line " | 230 String message = "[breakpoint in " + breakpoint.getFile().getName() + "
moved from line " |
200 + breakpoint.getLine() + " to " + eclipseLine + "]"; | 231 + breakpoint.getLine() + " to " + eclipseLine + "]"; |
201 debugTarget.writeToStdout(message); | 232 debugTarget.writeToStdout(message); |
202 | 233 |
203 breakpoint.updateLineNumber(eclipseLine); | 234 breakpoint.updateLineNumber(eclipseLine); |
204 } | 235 } |
(...skipping 23 matching lines...) Expand all Loading... |
228 // Check if source is located in the "lib" directory; if there is a link
to it from the | 259 // Check if source is located in the "lib" directory; if there is a link
to it from the |
229 // packages directory breakpoint should be /packages/... | 260 // packages directory breakpoint should be /packages/... |
230 String packageName = DartCore.getSelfLinkedPackageName(breakpoint.getFil
e()); | 261 String packageName = DartCore.getSelfLinkedPackageName(breakpoint.getFil
e()); |
231 | 262 |
232 if (packageName != null) { | 263 if (packageName != null) { |
233 // Create a breakpoint for self-links. | 264 // Create a breakpoint for self-links. |
234 int libIndex = regex.lastIndexOf(LIB_DIRECTORY_PATH); | 265 int libIndex = regex.lastIndexOf(LIB_DIRECTORY_PATH); |
235 String packageRegex = packageName + "/" | 266 String packageRegex = packageName + "/" |
236 + regex.substring(libIndex + LIB_DIRECTORY_PATH.length()); | 267 + regex.substring(libIndex + LIB_DIRECTORY_PATH.length()); |
237 | 268 |
238 debugTarget.getWebkitConnection().getDebugger().setBreakpointByUrl( | 269 debugTarget.getWebkitConnection().getDebugger() |
239 null, | 270 .setBreakpointByUrl(null, packageRegex, line, -1, new WebkitCallba
ck<String>() { |
240 packageRegex, | |
241 line, | |
242 -1, | |
243 new WebkitCallback<String>() { | |
244 @Override | 271 @Override |
245 public void handleResult(WebkitResult<String> result) { | 272 public void handleResult(WebkitResult<String> result) { |
246 if (!result.isError()) { | 273 if (!result.isError()) { |
247 addToBreakpointMap(breakpoint, result.getResult(), false); | 274 addToBreakpointMap(breakpoint, result.getResult(), false); |
248 } | 275 } |
249 } | 276 } |
250 }); | 277 }); |
251 } | 278 } |
252 } | 279 } |
253 | 280 |
254 debugTarget.getWebkitConnection().getDebugger().setBreakpointByUrl( | 281 // check if it is a file in a package, if so replace regex with package ur
i path |
255 null, | 282 // TODO(keertip): revisit when moved to calling pub for package info |
256 regex, | 283 String packagePath = getPackagePath(regex, breakpoint.getFile()); |
257 line, | 284 if (packagePath != null) { |
258 -1, | 285 regex = packagePath; |
259 new WebkitCallback<String>() { | 286 } |
| 287 |
| 288 debugTarget.getWebkitConnection() |
| 289 .getDebugger().setBreakpointByUrl(null, regex, line, -1, new WebkitCal
lback<String>() { |
260 @Override | 290 @Override |
261 public void handleResult(WebkitResult<String> result) { | 291 public void handleResult(WebkitResult<String> result) { |
262 if (!result.isError()) { | 292 if (!result.isError()) { |
263 addToBreakpointMap(breakpoint, result.getResult(), true); | 293 addToBreakpointMap(breakpoint, result.getResult(), true); |
264 } | 294 } |
265 } | 295 } |
266 }); | 296 }); |
267 | 297 |
268 // Handle source mapped breakpoints - set an additional breakpoint if the
file is under | 298 // Handle source mapped breakpoints - set an additional breakpoint if the
file is under |
269 // source mapping. | 299 // source mapping. |
270 SourceMapManager sourceMapManager = debugTarget.getSourceMapManager(); | 300 SourceMapManager sourceMapManager = debugTarget.getSourceMapManager(); |
271 | 301 |
272 if (sourceMapManager.isMapTarget(breakpoint.getFile())) { | 302 if (sourceMapManager.isMapTarget(breakpoint.getFile())) { |
273 List<SourceMapManager.SourceLocation> locations = sourceMapManager.getRe
verseMappingsFor( | 303 List<SourceMapManager.SourceLocation> locations = sourceMapManager.getRe
verseMappingsFor( |
274 breakpoint.getFile(), | 304 breakpoint.getFile(), |
275 line); | 305 line); |
276 | 306 |
277 for (SourceMapManager.SourceLocation location : locations) { | 307 for (SourceMapManager.SourceLocation location : locations) { |
278 String mappedRegex = getResourceResolver().getUrlRegexForResource(loca
tion.getFile()); | 308 String mappedRegex = getResourceResolver().getUrlRegexForResource(loca
tion.getFile()); |
279 | 309 |
280 if (mappedRegex != null) { | 310 if (mappedRegex != null) { |
281 if (DartDebugCorePlugin.LOGGING) { | 311 if (DartDebugCorePlugin.LOGGING) { |
282 System.out.println("breakpoint [" + regex + "," + breakpoint.getLi
ne() | 312 System.out.println( |
283 + ",-1] ==> mapped to [" + mappedRegex + "," + location.getLin
e() + "," | 313 "breakpoint [" + regex + "," + breakpoint.getLine() + ",-1] ==
> mapped to [" |
284 + location.getColumn() + "]"); | 314 + mappedRegex + "," + location.getLine() + "," + location.
getColumn() + "]"); |
285 } | 315 } |
286 | 316 |
287 debugTarget.getWebkitConnection().getDebugger().setBreakpointByUrl( | 317 debugTarget.getWebkitConnection().getDebugger().setBreakpointByUrl( |
288 null, | 318 null, |
289 mappedRegex, | 319 mappedRegex, |
290 location.getLine(), | 320 location.getLine(), |
291 location.getColumn(), | 321 location.getColumn(), |
292 new WebkitCallback<String>() { | 322 new WebkitCallback<String>() { |
293 @Override | 323 @Override |
294 public void handleResult(WebkitResult<String> result) { | 324 public void handleResult(WebkitResult<String> result) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 } | 357 } |
328 | 358 |
329 if (container.getParent() instanceof IWorkspaceRoot) { | 359 if (container.getParent() instanceof IWorkspaceRoot) { |
330 return false; | 360 return false; |
331 } | 361 } |
332 | 362 |
333 return isPubLib(container.getParent()); | 363 return isPubLib(container.getParent()); |
334 } | 364 } |
335 | 365 |
336 } | 366 } |
OLD | NEW |