Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/sdk/DebuggerModel.js

Issue 2781923002: [WIP] DevTools: user SourceMapManager in Debugger (Closed)
Patch Set: works great Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 23 matching lines...) Expand all
34 SDK.DebuggerModel = class extends SDK.SDKModel { 34 SDK.DebuggerModel = class extends SDK.SDKModel {
35 /** 35 /**
36 * @param {!SDK.Target} target 36 * @param {!SDK.Target} target
37 */ 37 */
38 constructor(target) { 38 constructor(target) {
39 super(target); 39 super(target);
40 40
41 target.registerDebuggerDispatcher(new SDK.DebuggerDispatcher(this)); 41 target.registerDebuggerDispatcher(new SDK.DebuggerDispatcher(this));
42 this._agent = target.debuggerAgent(); 42 this._agent = target.debuggerAgent();
43 this._runtimeModel = /** @type {!SDK.RuntimeModel} */ (target.model(SDK.Runt imeModel)); 43 this._runtimeModel = /** @type {!SDK.RuntimeModel} */ (target.model(SDK.Runt imeModel));
44 this._runtimeModel.addEventListener(SDK.RuntimeModel.Events.ExecutionContext Destroyed, this._executionContextDestroyed, this);
45
46 /** @type {!SDK.SourceMapManager<!SDK.Script>} */
47 this._sourceMapManager = new SDK.SourceMapManager(target);
48 /** @type {!Map<string, !SDK.Script>} */
49 this._sourceMapIdToScript = new Map();
44 50
45 /** @type {?SDK.DebuggerPausedDetails} */ 51 /** @type {?SDK.DebuggerPausedDetails} */
46 this._debuggerPausedDetails = null; 52 this._debuggerPausedDetails = null;
47 /** @type {!Object.<string, !SDK.Script>} */ 53 /** @type {!Object.<string, !SDK.Script>} */
48 this._scripts = {}; 54 this._scripts = {};
49 /** @type {!Map.<string, !Array.<!SDK.Script>>} */ 55 /** @type {!Map.<string, !Array.<!SDK.Script>>} */
50 this._scriptsBySourceURL = new Map(); 56 this._scriptsBySourceURL = new Map();
51 /** @type {!Array.<!SDK.Script>} */ 57 /** @type {!Array.<!SDK.Script>} */
52 this._discardableScripts = []; 58 this._discardableScripts = [];
53 59
54 /** @type {!Common.Object} */ 60 /** @type {!Common.Object} */
55 this._breakpointResolvedEventTarget = new Common.Object(); 61 this._breakpointResolvedEventTarget = new Common.Object();
56 62
57 this._isPausing = false; 63 this._isPausing = false;
58 Common.moduleSetting('pauseOnExceptionEnabled').addChangeListener(this._paus eOnExceptionStateChanged, this); 64 Common.moduleSetting('pauseOnExceptionEnabled').addChangeListener(this._paus eOnExceptionStateChanged, this);
59 Common.moduleSetting('pauseOnCaughtException').addChangeListener(this._pause OnExceptionStateChanged, this); 65 Common.moduleSetting('pauseOnCaughtException').addChangeListener(this._pause OnExceptionStateChanged, this);
60 Common.moduleSetting('enableAsyncStackTraces').addChangeListener(this.asyncS tackTracesStateChanged, this); 66 Common.moduleSetting('enableAsyncStackTraces').addChangeListener(this.asyncS tackTracesStateChanged, this);
61 67
62 /** @type {!Map<string, string>} */ 68 /** @type {!Map<string, string>} */
63 this._fileURLToNodeJSPath = new Map(); 69 this._fileURLToNodeJSPath = new Map();
64 this.enableDebugger(); 70 this.enableDebugger();
65 71
66 /** @type {!Map<string, string>} */ 72 /** @type {!Map<string, string>} */
67 this._stringMap = new Map(); 73 this._stringMap = new Map();
74 this._sourceMapManager.setEnabled(Common.moduleSetting('jsSourceMapsEnabled' ).get());
75 Common.moduleSetting('jsSourceMapsEnabled')
76 .addChangeListener(event => this._sourceMapManager.setEnabled(/** @type {boolean} */ (event.data)));
68 } 77 }
69 78
70 /** 79 /**
80 * @param {string} executionContextId
81 * @param {string} sourceURL
82 * @param {?string} sourceMapURL
83 * @return {?string}
84 */
85 static _sourceMapId(executionContextId, sourceURL, sourceMapURL) {
86 if (!sourceMapURL)
87 return null;
88 return executionContextId + ':' + sourceURL + ':' + sourceMapURL;
89 }
90
91 /**
92 * @return {!SDK.SourceMapManager<!SDK.Script>}
93 */
94 sourceMapManager() {
95 return this._sourceMapManager;
96 }
97
98 /**
71 * @return {!SDK.RuntimeModel} 99 * @return {!SDK.RuntimeModel}
72 */ 100 */
73 runtimeModel() { 101 runtimeModel() {
74 return this._runtimeModel; 102 return this._runtimeModel;
75 } 103 }
76 104
77 /** 105 /**
78 * @return {boolean} 106 * @return {boolean}
79 */ 107 */
80 debuggerEnabled() { 108 debuggerEnabled() {
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 this._reset(); 339 this._reset();
312 // TODO(dgozman): move clients to ExecutionContextDestroyed/ScriptCollected events. 340 // TODO(dgozman): move clients to ExecutionContextDestroyed/ScriptCollected events.
313 this.dispatchEventToListeners(SDK.DebuggerModel.Events.GlobalObjectCleared, this); 341 this.dispatchEventToListeners(SDK.DebuggerModel.Events.GlobalObjectCleared, this);
314 } 342 }
315 343
316 _reset() { 344 _reset() {
317 this._scripts = {}; 345 this._scripts = {};
318 this._scriptsBySourceURL.clear(); 346 this._scriptsBySourceURL.clear();
319 this._stringMap.clear(); 347 this._stringMap.clear();
320 this._discardableScripts = []; 348 this._discardableScripts = [];
349
350 for (var scriptWithSourceMap of this._sourceMapIdToScript.values())
351 this._sourceMapManager.detachSourceMap(scriptWithSourceMap);
352 this._sourceMapIdToScript.clear();
321 } 353 }
322 354
323 /** 355 /**
324 * @return {!Object.<string, !SDK.Script>} 356 * @return {!Object.<string, !SDK.Script>}
325 */ 357 */
326 get scripts() { 358 get scripts() {
327 return this._scripts; 359 return this._scripts;
328 } 360 }
329 361
330 /** 362 /**
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 sourceURL = this._internString(sourceURL); 511 sourceURL = this._internString(sourceURL);
480 } 512 }
481 var script = new SDK.Script( 513 var script = new SDK.Script(
482 this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, e xecutionContextId, 514 this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, e xecutionContextId,
483 this._internString(hash), isContentScript, isLiveEdit, sourceMapURL, has SourceURL, length); 515 this._internString(hash), isContentScript, isLiveEdit, sourceMapURL, has SourceURL, length);
484 this._registerScript(script); 516 this._registerScript(script);
485 if (!hasSyntaxError) 517 if (!hasSyntaxError)
486 this.dispatchEventToListeners(SDK.DebuggerModel.Events.ParsedScriptSource, script); 518 this.dispatchEventToListeners(SDK.DebuggerModel.Events.ParsedScriptSource, script);
487 else 519 else
488 this.dispatchEventToListeners(SDK.DebuggerModel.Events.FailedToParseScript Source, script); 520 this.dispatchEventToListeners(SDK.DebuggerModel.Events.FailedToParseScript Source, script);
521
522 var sourceMapId = SDK.DebuggerModel._sourceMapId(script.executionContextId, script.sourceURL, script.sourceMapURL);
523 if (sourceMapId && !hasSyntaxError) {
524 var previousSourceMapClient = this._sourceMapIdToScript.get(sourceMapId);
525 if (previousSourceMapClient)
526 this._sourceMapManager.detachSourceMap(previousSourceMapClient);
527 this._sourceMapIdToScript.set(sourceMapId, script);
528 this._sourceMapManager.attachSourceMap(script, script.sourceURL, script.so urceMapURL);
529 }
530
489 var isDiscardable = hasSyntaxError && script.isAnonymousScript(); 531 var isDiscardable = hasSyntaxError && script.isAnonymousScript();
490 if (isDiscardable) { 532 if (isDiscardable) {
491 this._discardableScripts.push(script); 533 this._discardableScripts.push(script);
492 this._collectDiscardedScripts(); 534 this._collectDiscardedScripts();
493 } 535 }
494 return script; 536 return script;
495 } 537 }
496 538
497 /** 539 /**
498 * @param {!SDK.Script} script 540 * @param {!SDK.Script} script
541 * @param {string} newSourceMapURL
542 */
543 setSourceMapURL(script, newSourceMapURL) {
544 var sourceMapId = SDK.DebuggerModel._sourceMapId(script.executionContextId, script.sourceURL, script.sourceMapURL);
545 if (sourceMapId && this._sourceMapIdToScript.get(sourceMapId) === script)
546 this._sourceMapIdToScript.delete(sourceMapId);
547 this._sourceMapManager.detachSourceMap(script);
548
549 script.sourceMapURL = newSourceMapURL;
550 sourceMapId = SDK.DebuggerModel._sourceMapId(script.executionContextId, scri pt.sourceURL, script.sourceMapURL);
551 this._sourceMapIdToScript.set(sourceMapId, script);
552 this._sourceMapManager.attachSourceMap(script, script.sourceURL, script.sour ceMapURL);
553 }
554
555 /**
556 * @param {!Common.Event} event
557 */
558 _executionContextDestroyed(event) {
559 var executionContext = /** @type {!SDK.ExecutionContext} */ (event.data);
560 for (var script of this._sourceMapIdToScript.values()) {
561 if (script.executionContextId === executionContext.id)
562 this._sourceMapManager.detachSourceMap(script);
563 }
564 }
565
566 /**
567 * @param {!SDK.Script} script
499 */ 568 */
500 _registerScript(script) { 569 _registerScript(script) {
501 this._scripts[script.scriptId] = script; 570 this._scripts[script.scriptId] = script;
502 if (script.isAnonymousScript()) 571 if (script.isAnonymousScript())
503 return; 572 return;
504 573
505 var scripts = this._scriptsBySourceURL.get(script.sourceURL); 574 var scripts = this._scriptsBySourceURL.get(script.sourceURL);
506 if (!scripts) { 575 if (!scripts) {
507 scripts = []; 576 scripts = [];
508 this._scriptsBySourceURL.set(script.sourceURL, scripts); 577 this._scriptsBySourceURL.set(script.sourceURL, scripts);
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 if (error) 834 if (error)
766 console.error(error); 835 console.error(error);
767 callback(!error); 836 callback(!error);
768 } 837 }
769 } 838 }
770 839
771 /** 840 /**
772 * @override 841 * @override
773 */ 842 */
774 dispose() { 843 dispose() {
844 this._runtimeModel.removeEventListener(SDK.RuntimeModel.Events.ExecutionCont extDestroyed, this._executionContextDestroyed, this);
775 Common.moduleSetting('pauseOnExceptionEnabled').removeChangeListener(this._p auseOnExceptionStateChanged, this); 845 Common.moduleSetting('pauseOnExceptionEnabled').removeChangeListener(this._p auseOnExceptionStateChanged, this);
776 Common.moduleSetting('pauseOnCaughtException').removeChangeListener(this._pa useOnExceptionStateChanged, this); 846 Common.moduleSetting('pauseOnCaughtException').removeChangeListener(this._pa useOnExceptionStateChanged, this);
777 Common.moduleSetting('enableAsyncStackTraces').removeChangeListener(this.asy ncStackTracesStateChanged, this); 847 Common.moduleSetting('enableAsyncStackTraces').removeChangeListener(this.asy ncStackTracesStateChanged, this);
778 } 848 }
779 849
780 /** 850 /**
781 * @override 851 * @override
782 * @return {!Promise} 852 * @return {!Promise}
783 */ 853 */
784 suspendModel() { 854 suspendModel() {
(...skipping 26 matching lines...) Expand all
811 881
812 /** 882 /**
813 * @param {string} string 883 * @param {string} string
814 * @return {string} string 884 * @return {string} string
815 */ 885 */
816 _internString(string) { 886 _internString(string) {
817 if (!this._stringMap.has(string)) 887 if (!this._stringMap.has(string))
818 this._stringMap.set(string, string); 888 this._stringMap.set(string, string);
819 return this._stringMap.get(string); 889 return this._stringMap.get(string);
820 } 890 }
891
892 /**
893 * @override
894 */
895 dispose() {
896 super.dispose();
897 this._sourceMapManager.dispose();
898 }
821 }; 899 };
822 900
823 SDK.SDKModel.register(SDK.DebuggerModel, SDK.Target.Capability.JS, true); 901 SDK.SDKModel.register(SDK.DebuggerModel, SDK.Target.Capability.JS, true);
824 902
825 /** @typedef {{location: ?SDK.DebuggerModel.Location, functionName: string}} */ 903 /** @typedef {{location: ?SDK.DebuggerModel.Location, functionName: string}} */
826 SDK.DebuggerModel.FunctionDetails; 904 SDK.DebuggerModel.FunctionDetails;
827 905
828 /** 906 /**
829 * Keep these in sync with WebCore::V8Debugger 907 * Keep these in sync with WebCore::V8Debugger
830 * 908 *
831 * @enum {string} 909 * @enum {string}
832 */ 910 */
833 SDK.DebuggerModel.PauseOnExceptionsState = { 911 SDK.DebuggerModel.PauseOnExceptionsState = {
834 DontPauseOnExceptions: 'none', 912 DontPauseOnExceptions: 'none',
835 PauseOnAllExceptions: 'all', 913 PauseOnAllExceptions: 'all',
836 PauseOnUncaughtExceptions: 'uncaught' 914 PauseOnUncaughtExceptions: 'uncaught'
837 }; 915 };
838 916
839 /** @enum {symbol} */ 917 /** @enum {symbol} */
840 SDK.DebuggerModel.Events = { 918 SDK.DebuggerModel.Events = {
841 DebuggerWasEnabled: Symbol('DebuggerWasEnabled'), 919 DebuggerWasEnabled: Symbol('DebuggerWasEnabled'),
842 DebuggerWasDisabled: Symbol('DebuggerWasDisabled'), 920 DebuggerWasDisabled: Symbol('DebuggerWasDisabled'),
843 DebuggerPaused: Symbol('DebuggerPaused'), 921 DebuggerPaused: Symbol('DebuggerPaused'),
844 DebuggerResumed: Symbol('DebuggerResumed'), 922 DebuggerResumed: Symbol('DebuggerResumed'),
845 ParsedScriptSource: Symbol('ParsedScriptSource'), 923 ParsedScriptSource: Symbol('ParsedScriptSource'),
846 FailedToParseScriptSource: Symbol('FailedToParseScriptSource'), 924 FailedToParseScriptSource: Symbol('FailedToParseScriptSource'),
847 DiscardedAnonymousScriptSource: Symbol('DiscardedAnonymousScriptSource'), 925 DiscardedAnonymousScriptSource: Symbol('DiscardedAnonymousScriptSource'),
848 GlobalObjectCleared: Symbol('GlobalObjectCleared'), 926 GlobalObjectCleared: Symbol('GlobalObjectCleared'),
849 CallFrameSelected: Symbol('CallFrameSelected'), 927 CallFrameSelected: Symbol('CallFrameSelected'),
850 ConsoleCommandEvaluatedInSelectedCallFrame: Symbol('ConsoleCommandEvaluatedInS electedCallFrame'), 928 ConsoleCommandEvaluatedInSelectedCallFrame: Symbol('ConsoleCommandEvaluatedInS electedCallFrame')
851 SourceMapURLAdded: Symbol('SourceMapURLAdded')
852 }; 929 };
853 930
854 /** @enum {string} */ 931 /** @enum {string} */
855 SDK.DebuggerModel.BreakReason = { 932 SDK.DebuggerModel.BreakReason = {
856 DOM: 'DOM', 933 DOM: 'DOM',
857 EventListener: 'EventListener', 934 EventListener: 'EventListener',
858 XHR: 'XHR', 935 XHR: 'XHR',
859 Exception: 'exception', 936 Exception: 'exception',
860 PromiseRejection: 'promiseRejection', 937 PromiseRejection: 'promiseRejection',
861 Assert: 'assert', 938 Assert: 'assert',
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 stack.callFrames.shift(); 1468 stack.callFrames.shift();
1392 if (previous && (!stack.callFrames.length && !stack.promiseCreationFrame)) 1469 if (previous && (!stack.callFrames.length && !stack.promiseCreationFrame))
1393 previous.parent = stack.parent; 1470 previous.parent = stack.parent;
1394 else 1471 else
1395 previous = stack; 1472 previous = stack;
1396 stack = stack.parent; 1473 stack = stack.parent;
1397 } 1474 }
1398 return asyncStackTrace; 1475 return asyncStackTrace;
1399 } 1476 }
1400 }; 1477 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698