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

Unified Diff: pkg/dev_compiler/lib/js/legacy/dart_library.js

Issue 2970283002: add `reload` to `dart_library` (Closed)
Patch Set: code review updates Created 3 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..3ffbda294e5869cd926308f9e059a3381ae26bd4 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 _reverseImports = new Map();
class LibraryLoader {
constructor(name, defaultValue, imports, loader) {
+ imports.forEach(function(i) {
+ var deps = _reverseImports.get(i);
+ if (!deps) {
+ deps = new Set();
+ _reverseImports.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 = _reverseImports.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 || !window.$dartWarmReload) {
+ 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;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698