Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 /** | 4 /** |
| 5 * @unrestricted | 5 * @unrestricted |
| 6 */ | 6 */ |
| 7 Persistence.Persistence = class extends Common.Object { | 7 Persistence.Persistence = class extends Common.Object { |
| 8 /** | 8 /** |
| 9 * @param {!Workspace.Workspace} workspace | 9 * @param {!Workspace.Workspace} workspace |
| 10 * @param {!Bindings.BreakpointManager} breakpointManager | 10 * @param {!Bindings.BreakpointManager} breakpointManager |
| 11 * @param {!Workspace.FileSystemMapping} fileSystemMapping | 11 * @param {!Workspace.FileSystemMapping} fileSystemMapping |
| 12 */ | 12 */ |
| 13 constructor(workspace, breakpointManager, fileSystemMapping) { | 13 constructor(workspace, breakpointManager, fileSystemMapping) { |
| 14 super(); | 14 super(); |
| 15 this._workspace = workspace; | 15 this._workspace = workspace; |
| 16 this._breakpointManager = breakpointManager; | 16 this._breakpointManager = breakpointManager; |
| 17 /** @type {!Map<string, number>} */ | 17 /** @type {!Map<string, number>} */ |
| 18 this._filePathPrefixesToBindingCount = new Map(); | 18 this._filePathPrefixesToBindingCount = new Map(); |
| 19 | 19 |
| 20 /** @type {!Multimap<!Workspace.UISourceCode, function()>} */ | |
| 21 this._subscribedBindingEventListeners = new Multimap(); | |
| 22 | |
| 20 if (Runtime.experiments.isEnabled('persistence2')) { | 23 if (Runtime.experiments.isEnabled('persistence2')) { |
| 21 var linkDecorator = new Persistence.PersistenceUtils.LinkDecorator(this); | 24 var linkDecorator = new Persistence.PersistenceUtils.LinkDecorator(this); |
| 22 Components.Linkifier.setLinkDecorator(linkDecorator); | 25 Components.Linkifier.setLinkDecorator(linkDecorator); |
| 23 this._mapping = | 26 this._mapping = |
| 24 new Persistence.Automapping(workspace, this._validateBinding.bind(this ), this._onBindingRemoved.bind(this)); | 27 new Persistence.Automapping(workspace, this._validateBinding.bind(this ), this._onBindingRemoved.bind(this)); |
| 25 } else { | 28 } else { |
| 26 this._mapping = new Persistence.DefaultMapping( | 29 this._mapping = new Persistence.DefaultMapping( |
| 27 workspace, fileSystemMapping, this._validateBinding.bind(this), this._ onBindingRemoved.bind(this)); | 30 workspace, fileSystemMapping, this._validateBinding.bind(this), this._ onBindingRemoved.bind(this)); |
| 28 } | 31 } |
| 29 } | 32 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 87 binding.fileSystem.addEventListener( | 90 binding.fileSystem.addEventListener( |
| 88 Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyC ommitted, this); | 91 Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyC ommitted, this); |
| 89 binding.network.addEventListener( | 92 binding.network.addEventListener( |
| 90 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); | 93 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); |
| 91 binding.fileSystem.addEventListener( | 94 binding.fileSystem.addEventListener( |
| 92 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); | 95 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); |
| 93 | 96 |
| 94 this._addFilePathBindingPrefixes(binding.fileSystem.url()); | 97 this._addFilePathBindingPrefixes(binding.fileSystem.url()); |
| 95 | 98 |
| 96 this._moveBreakpoints(binding.fileSystem, binding.network); | 99 this._moveBreakpoints(binding.fileSystem, binding.network); |
| 100 | |
| 101 this._notifyBindingEvent(binding.network); | |
| 102 this._notifyBindingEvent(binding.fileSystem); | |
| 97 this.dispatchEventToListeners(Persistence.Persistence.Events.BindingCreated, binding); | 103 this.dispatchEventToListeners(Persistence.Persistence.Events.BindingCreated, binding); |
| 98 } | 104 } |
| 99 | 105 |
| 100 /** | 106 /** |
| 101 * @param {!Persistence.PersistenceBinding} binding | 107 * @param {!Persistence.PersistenceBinding} binding |
| 102 */ | 108 */ |
| 103 _onBindingRemoved(binding) { | 109 _onBindingRemoved(binding) { |
| 104 binding._removed = true; | 110 binding._removed = true; |
| 105 if (binding.network[Persistence.Persistence._binding] !== binding) | 111 if (binding.network[Persistence.Persistence._binding] !== binding) |
| 106 return; | 112 return; |
| 107 console.assert( | 113 console.assert( |
| 108 binding.network[Persistence.Persistence._binding] === binding.fileSystem [Persistence.Persistence._binding], | 114 binding.network[Persistence.Persistence._binding] === binding.fileSystem [Persistence.Persistence._binding], |
| 109 'ERROR: inconsistent binding for networkURL ' + binding.network.url()); | 115 'ERROR: inconsistent binding for networkURL ' + binding.network.url()); |
| 110 | 116 |
| 111 binding.network[Persistence.Persistence._binding] = null; | 117 binding.network[Persistence.Persistence._binding] = null; |
| 112 binding.fileSystem[Persistence.Persistence._binding] = null; | 118 binding.fileSystem[Persistence.Persistence._binding] = null; |
| 113 | 119 |
| 114 binding.network.removeEventListener( | 120 binding.network.removeEventListener( |
| 115 Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyC ommitted, this); | 121 Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyC ommitted, this); |
| 116 binding.fileSystem.removeEventListener( | 122 binding.fileSystem.removeEventListener( |
| 117 Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyC ommitted, this); | 123 Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyC ommitted, this); |
| 118 binding.network.removeEventListener( | 124 binding.network.removeEventListener( |
| 119 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); | 125 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); |
| 120 binding.fileSystem.removeEventListener( | 126 binding.fileSystem.removeEventListener( |
| 121 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); | 127 Workspace.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyCha nged, this); |
| 122 | 128 |
| 123 this._removeFilePathBindingPrefixes(binding.fileSystem.url()); | 129 this._removeFilePathBindingPrefixes(binding.fileSystem.url()); |
| 130 this._breakpointManager.copyBreakpoints(binding.network.url(), binding.fileS ystem); | |
| 124 | 131 |
| 125 this._breakpointManager.copyBreakpoints(binding.network.url(), binding.fileS ystem); | 132 this._notifyBindingEvent(binding.network); |
| 133 this._notifyBindingEvent(binding.fileSystem); | |
| 126 this.dispatchEventToListeners(Persistence.Persistence.Events.BindingRemoved, binding); | 134 this.dispatchEventToListeners(Persistence.Persistence.Events.BindingRemoved, binding); |
| 127 } | 135 } |
| 128 | 136 |
| 129 /** | 137 /** |
| 130 * @param {!Common.Event} event | 138 * @param {!Common.Event} event |
| 131 */ | 139 */ |
| 132 _onWorkingCopyChanged(event) { | 140 _onWorkingCopyChanged(event) { |
| 133 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); | 141 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data); |
| 134 var binding = uiSourceCode[Persistence.Persistence._binding]; | 142 var binding = uiSourceCode[Persistence.Persistence._binding]; |
| 135 if (!binding || binding[Persistence.Persistence._muteWorkingCopy]) | 143 if (!binding || binding[Persistence.Persistence._muteWorkingCopy]) |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 261 /** | 269 /** |
| 262 * @param {!Workspace.UISourceCode} uiSourceCode | 270 * @param {!Workspace.UISourceCode} uiSourceCode |
| 263 * @return {?Persistence.PersistenceBinding} | 271 * @return {?Persistence.PersistenceBinding} |
| 264 */ | 272 */ |
| 265 binding(uiSourceCode) { | 273 binding(uiSourceCode) { |
| 266 return uiSourceCode[Persistence.Persistence._binding] || null; | 274 return uiSourceCode[Persistence.Persistence._binding] || null; |
| 267 } | 275 } |
| 268 | 276 |
| 269 /** | 277 /** |
| 270 * @param {!Workspace.UISourceCode} uiSourceCode | 278 * @param {!Workspace.UISourceCode} uiSourceCode |
| 279 * @param {function()} listener | |
| 280 * @param {!Object=} thisObject | |
| 281 */ | |
| 282 subscribeForBindingEvent(uiSourceCode, listener, thisObject) { | |
|
lushnikov
2016/12/20 02:50:02
I called this "subscribeForBindingEvent" rather th
dgozman
2016/12/20 05:47:03
Let's not support thisObject - this will make code
lushnikov
2016/12/20 18:38:35
Done.
| |
| 283 listener[Persistence.Persistence._listenerReciever] = thisObject || null; | |
| 284 this._subscribedBindingEventListeners.set(uiSourceCode, listener); | |
| 285 } | |
| 286 | |
| 287 /** | |
| 288 * @param {!Workspace.UISourceCode} uiSourceCode | |
| 289 * @param {function()} listener | |
| 290 */ | |
| 291 unsubscribeFromBindingEvent(uiSourceCode, listener) { | |
|
dgozman
2016/12/20 05:47:03
... otherwise you have to pass thisObject here as
lushnikov
2016/12/20 18:38:34
Done.
| |
| 292 if (!this._subscribedBindingEventListeners.hasValue(uiSourceCode, listener)) | |
| 293 return; | |
| 294 listener[Persistence.Persistence._listenerReciever] = null; | |
| 295 this._subscribedBindingEventListeners.remove(uiSourceCode, listener); | |
| 296 } | |
| 297 | |
| 298 /** | |
| 299 * @param {!Workspace.UISourceCode} uiSourceCode | |
| 300 */ | |
| 301 _notifyBindingEvent(uiSourceCode) { | |
| 302 if (!this._subscribedBindingEventListeners.has(uiSourceCode)) | |
| 303 return; | |
| 304 var listeners = Array.from(this._subscribedBindingEventListeners.get(uiSourc eCode)); | |
| 305 for (var listener of listeners) | |
| 306 listener.call(listener[Persistence.Persistence._listenerReciever], uiSourc eCode); | |
|
dgozman
2016/12/20 05:47:03
Declared listener type doesn't take UISourceCode a
lushnikov
2016/12/20 18:38:34
Done.
| |
| 307 } | |
| 308 | |
| 309 /** | |
| 310 * @param {!Workspace.UISourceCode} uiSourceCode | |
| 271 * @return {?Workspace.UISourceCode} | 311 * @return {?Workspace.UISourceCode} |
| 272 */ | 312 */ |
| 273 fileSystem(uiSourceCode) { | 313 fileSystem(uiSourceCode) { |
| 274 var binding = this.binding(uiSourceCode); | 314 var binding = this.binding(uiSourceCode); |
| 275 return binding ? binding.fileSystem : null; | 315 return binding ? binding.fileSystem : null; |
| 276 } | 316 } |
| 277 | 317 |
| 278 /** | 318 /** |
| 279 * @param {string} filePath | 319 * @param {string} filePath |
| 280 */ | 320 */ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 313 } | 353 } |
| 314 | 354 |
| 315 dispose() { | 355 dispose() { |
| 316 this._mapping.dispose(); | 356 this._mapping.dispose(); |
| 317 } | 357 } |
| 318 }; | 358 }; |
| 319 | 359 |
| 320 Persistence.Persistence._binding = Symbol('Persistence.Binding'); | 360 Persistence.Persistence._binding = Symbol('Persistence.Binding'); |
| 321 Persistence.Persistence._muteCommit = Symbol('Persistence.MuteCommit'); | 361 Persistence.Persistence._muteCommit = Symbol('Persistence.MuteCommit'); |
| 322 Persistence.Persistence._muteWorkingCopy = Symbol('Persistence.MuteWorkingCopy') ; | 362 Persistence.Persistence._muteWorkingCopy = Symbol('Persistence.MuteWorkingCopy') ; |
| 363 Persistence.Persistence._listenerReciever = Symbol('Persistence.ListenerReciever '); | |
| 323 | 364 |
| 324 Persistence.Persistence._NodePrefix = '(function (exports, require, module, __fi lename, __dirname) { '; | 365 Persistence.Persistence._NodePrefix = '(function (exports, require, module, __fi lename, __dirname) { '; |
| 325 Persistence.Persistence._NodeSuffix = '\n});'; | 366 Persistence.Persistence._NodeSuffix = '\n});'; |
| 326 Persistence.Persistence._NodeShebang = '#!/usr/bin/env node'; | 367 Persistence.Persistence._NodeShebang = '#!/usr/bin/env node'; |
| 327 | 368 |
| 328 Persistence.Persistence.Events = { | 369 Persistence.Persistence.Events = { |
| 329 BindingCreated: Symbol('BindingCreated'), | 370 BindingCreated: Symbol('BindingCreated'), |
| 330 BindingRemoved: Symbol('BindingRemoved') | 371 BindingRemoved: Symbol('BindingRemoved') |
| 331 }; | 372 }; |
| 332 | 373 |
| 333 /** | 374 /** |
| 334 * @unrestricted | 375 * @unrestricted |
| 335 */ | 376 */ |
| 336 Persistence.PersistenceBinding = class { | 377 Persistence.PersistenceBinding = class { |
| 337 /** | 378 /** |
| 338 * @param {!Workspace.UISourceCode} network | 379 * @param {!Workspace.UISourceCode} network |
| 339 * @param {!Workspace.UISourceCode} fileSystem | 380 * @param {!Workspace.UISourceCode} fileSystem |
| 340 * @param {boolean} exactMatch | 381 * @param {boolean} exactMatch |
| 341 */ | 382 */ |
| 342 constructor(network, fileSystem, exactMatch) { | 383 constructor(network, fileSystem, exactMatch) { |
| 343 this.network = network; | 384 this.network = network; |
| 344 this.fileSystem = fileSystem; | 385 this.fileSystem = fileSystem; |
| 345 this.exactMatch = exactMatch; | 386 this.exactMatch = exactMatch; |
| 346 this._removed = false; | 387 this._removed = false; |
| 347 } | 388 } |
| 348 }; | 389 }; |
| 349 | 390 |
| 350 /** @type {!Persistence.Persistence} */ | 391 /** @type {!Persistence.Persistence} */ |
| 351 Persistence.persistence; | 392 Persistence.persistence; |
| OLD | NEW |