Index: lib/src/dependency_graph.dart |
diff --git a/lib/src/dependency_graph.dart b/lib/src/dependency_graph.dart |
index 14dda6285276b43b7cce56f621cb61943caf6fbf..cfcc49541fd6ba021b709e157ab49252254b0ed1 100644 |
--- a/lib/src/dependency_graph.dart |
+++ b/lib/src/dependency_graph.dart |
@@ -5,7 +5,7 @@ |
/// Tracks the shape of the import/export graph and dependencies between files. |
library dev_compiler.src.dependency_graph; |
-import 'dart:collection' show HashSet; |
+import 'dart:collection' show HashSet, HashMap; |
import 'package:analyzer/analyzer.dart' show parseDirectives; |
import 'package:analyzer/src/generated/ast.dart' |
@@ -21,7 +21,7 @@ import 'package:analyzer/src/generated/ast.dart' |
import 'package:analyzer/src/generated/engine.dart' |
show ParseDartTask, AnalysisContext; |
import 'package:analyzer/src/generated/source.dart' show Source, SourceKind; |
-import 'package:html/dom.dart' show Document, Node; |
+import 'package:html/dom.dart' show Document, Node, Element; |
import 'package:html/parser.dart' as html; |
import 'package:logging/logging.dart' show Logger, Level; |
import 'package:path/path.dart' as path; |
@@ -167,6 +167,10 @@ class HtmlSourceNode extends SourceNode { |
/// Parsed document, updated whenever [update] is invoked. |
Document document; |
+ /// Tracks resource files referenced from HTML nodes, e.g. |
+ /// `<link rel=stylesheet href=...>` and `<img src=...>` |
+ final htmlResourceNodes = new HashMap<Element, ResourceSourceNode>(); |
+ |
HtmlSourceNode(SourceGraph graph, Uri uri, Source source) |
: runtimeDeps = graph.runtimeDeps, |
super(graph, uri, source); |
@@ -199,16 +203,24 @@ class HtmlSourceNode extends SourceNode { |
scripts = newScripts; |
} |
+ // TODO(jmesserly): simplify the design here. Ideally we wouldn't need |
+ // to track user-defined CSS, images, etc. Also we don't have a clear |
+ // way to distinguish runtime injected resources, like messages.css, from |
+ // user-defined files. |
+ htmlResourceNodes.clear(); |
var newResources = new Set<SourceNode>(); |
for (var resource in graph.resources) { |
newResources.add(graph.nodeFromUri(uri.resolve(resource))); |
} |
for (var tag in document.querySelectorAll('link[rel="stylesheet"]')) { |
- newResources |
- .add(graph.nodeFromUri(uri.resolve(tag.attributes['href']))); |
+ var res = graph.nodeFromUri(uri.resolve(tag.attributes['href'])); |
+ htmlResourceNodes[tag] = res; |
+ newResources.add(res); |
} |
- for (var tag in document.querySelectorAll('img')) { |
- newResources.add(graph.nodeFromUri(uri.resolve(tag.attributes['src']))); |
+ for (var tag in document.querySelectorAll('img[src]')) { |
+ var res = graph.nodeFromUri(uri.resolve(tag.attributes['src'])); |
+ htmlResourceNodes[tag] = res; |
+ newResources.add(res); |
} |
if (!_same(newResources, resources)) { |
structureChanged = true; |