Chromium Code Reviews| Index: pkg/dev_compiler/lib/js/legacy/dart_library.js |
| diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js |
| index 9c6a376eb12b3a15931ffc07a565e73660efa08a..0eb6ee9f2a9b6b8cef8b8687903191a15f8b421c 100644 |
| --- a/pkg/dev_compiler/lib/js/legacy/dart_library.js |
| +++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js |
| @@ -52,9 +52,18 @@ dart_library = |
| }); |
| }; |
| + let reverseDeps = new Map(); |
|
vsm
2017/07/06 19:47:28
How about calling this "invalidationMap"?
jakemac
2017/07/06 20:12:11
Changed to `_reverseImports` since that exactly de
|
| class LibraryLoader { |
| constructor(name, defaultValue, imports, loader) { |
| + imports.forEach(function(i) { |
| + var deps = reverseDeps.get(i); |
| + if (!deps) { |
| + deps = new Set(); |
| + reverseDeps.set(i, deps); |
| + } |
| + deps.add(name); |
| + }); |
| this._name = name; |
| this._library = defaultValue ? defaultValue : {}; |
| this._imports = imports; |
| @@ -96,7 +105,6 @@ dart_library = |
| if (this._name == 'dart_sdk') { |
| // Eagerly load the SDK. |
| this._loader.apply(null, args); |
| - loader._loader = null; |
| } else { |
| // Load / parse other modules on demand. |
| let done = false; |
| @@ -105,7 +113,6 @@ dart_library = |
| if (!done) { |
| done = true; |
| loader._loader.apply(null, args); |
| - loader._loader = null; |
| } |
| return o[name]; |
| } |
| @@ -125,25 +132,36 @@ dart_library = |
| LibraryLoader.READY = 2; |
| // Map from name to LibraryLoader |
| - let libraries = new Map(); |
| + let _libraries = new Map(); |
| dart_library.libraries = function() { return libraries.keys(); }; |
| dart_library.debuggerLibraries = function() { |
| var debuggerLibraries = []; |
| - libraries.forEach(function (value, key, map) { |
| + _libraries.forEach(function (value, key, map) { |
| debuggerLibraries.push(value.load()); |
| }); |
| debuggerLibraries.__proto__ = null; |
| return debuggerLibraries; |
| }; |
| + // Invalidate a library and all things that depend on it |
| + function _invalidateLibrary(name) { |
| + let lib = _libraries.get(name); |
| + if (lib._state == LibraryLoader.NOT_LOADED) return; |
| + lib._state = LibraryLoader.NOT_LOADED; |
| + lib._library = {}; |
| + let deps = reverseDeps.get(name); |
| + if (!deps) return; |
| + deps.forEach(_invalidateLibrary); |
| + } |
| + |
| function library(name, defaultValue, imports, loader) { |
| - let result = libraries.get(name); |
| + let result = _libraries.get(name); |
| if (result) { |
| - console.warn('Already loaded ' + name); |
| - return result; |
| + console.log('Re-loading ' + name); |
| + _invalidateLibrary(name); |
| } |
| result = new LibraryLoader(name, defaultValue, imports, loader); |
| - libraries.set(name, result); |
| + _libraries.set(name, result); |
| return result; |
| } |
| dart_library.library = library; |
| @@ -152,7 +170,7 @@ dart_library = |
| // available, print the stack to show where/how it was requested. |
| let _stack = []; |
| function import_(name) { |
| - let lib = libraries.get(name); |
| + let lib = _libraries.get(name); |
| if (!lib) { |
| let message = 'Module ' + name + ' not loaded in the browser.'; |
| if (_stack != []) { |
| @@ -174,9 +192,42 @@ dart_library = |
| var _currentIsolate = false; |
| - function start(moduleName, libraryName) { |
| + function _restart() { |
| + start(_lastModuleName, _lastLibraryName, true); |
| + } |
| + |
| + function reload() { |
| + if (!window.$dartWarmReload) { |
|
vsm
2017/07/06 19:47:27
We haven't checked if window exists. Don't really
jakemac
2017/07/06 20:12:11
Done.
|
| + console.warn('Warm reload not supported in this environment.'); |
| + return; |
| + } |
| + var result; |
| + if (_lastLibrary && _lastLibrary.onReloadStart) { |
| + result = _lastLibrary.onReloadStart(); |
| + } |
| + if (result && result.then) { |
| + let sdk = _libraries.get("dart_sdk"); |
| + result.then(sdk._library.dart.Dynamic)(function() { |
| + window.$dartWarmReload(_restart); |
| + }); |
| + } else { |
| + window.$dartWarmReload(_restart); |
| + } |
| + } |
| + dart_library.reload = reload; |
| + |
| + |
| + var _lastModuleName; |
| + var _lastLibraryName; |
| + var _lastLibrary; |
| + var _originalBody; |
| + |
| + function start(moduleName, libraryName, isReload) { |
| if (libraryName == null) libraryName = moduleName; |
| + _lastModuleName = moduleName; |
| + _lastLibraryName = libraryName; |
| let library = import_(moduleName)[libraryName]; |
| + _lastLibrary = library; |
| let dart_sdk = import_('dart_sdk'); |
| if (!_currentIsolate) { |
| @@ -188,7 +239,17 @@ dart_library = |
| _currentIsolate = true; |
| dart_sdk._isolate_helper.startRootIsolate(() => {}, []); |
| } |
| - |
| + if (isReload) { |
| + if (library.onReloadEnd) { |
| + library.onReloadEnd(); |
| + return; |
| + } else { |
| + document.body = _originalBody; |
| + } |
| + } else { |
| + // If not a reload then store the initial html to reset it on reload. |
| + _originalBody = document.body.cloneNode(true); |
| + } |
| library.main(); |
| } |
| dart_library.start = start; |