5
5
/// Tracks the shape of the import/export graph and dependencies between files.
6
6
library dev_compiler.src.dependency_graph;
7
7
8
- import 'dart:collection' show HashSet;
8
+ import 'dart:collection' show HashSet, HashMap ;
9
9
10
10
import 'package:analyzer/analyzer.dart' show parseDirectives;
11
11
import 'package:analyzer/src/generated/ast.dart'
@@ -21,7 +21,7 @@ import 'package:analyzer/src/generated/ast.dart'
21
21
import 'package:analyzer/src/generated/engine.dart'
22
22
show ParseDartTask, AnalysisContext;
23
23
import 'package:analyzer/src/generated/source.dart' show Source, SourceKind;
24
- import 'package:html/dom.dart' show Document, Node;
24
+ import 'package:html/dom.dart' show Document, Node, Element ;
25
25
import 'package:html/parser.dart' as html;
26
26
import 'package:logging/logging.dart' show Logger, Level;
27
27
import 'package:path/path.dart' as path;
@@ -167,6 +167,10 @@ class HtmlSourceNode extends SourceNode {
167
167
/// Parsed document, updated whenever [update] is invoked.
168
168
Document document;
169
169
170
+ /// Tracks resource files referenced from HTML nodes, e.g.
171
+ /// `<link rel=stylesheet href=...>` and `<img src=...>`
172
+ final htmlResourceNodes = new HashMap <Element , ResourceSourceNode >();
173
+
170
174
HtmlSourceNode (SourceGraph graph, Uri uri, Source source)
171
175
: runtimeDeps = graph.runtimeDeps,
172
176
super (graph, uri, source);
@@ -199,16 +203,24 @@ class HtmlSourceNode extends SourceNode {
199
203
scripts = newScripts;
200
204
}
201
205
206
+ // TODO(jmesserly): simplify the design here. Ideally we wouldn't need
207
+ // to track user-defined CSS, images, etc. Also we don't have a clear
208
+ // way to distinguish runtime injected resources, like messages.css, from
209
+ // user-defined files.
210
+ htmlResourceNodes.clear ();
202
211
var newResources = new Set <SourceNode >();
203
212
for (var resource in graph.resources) {
204
213
newResources.add (graph.nodeFromUri (uri.resolve (resource)));
205
214
}
206
215
for (var tag in document.querySelectorAll ('link[rel="stylesheet"]' )) {
207
- newResources
208
- .add (graph.nodeFromUri (uri.resolve (tag.attributes['href' ])));
216
+ var res = graph.nodeFromUri (uri.resolve (tag.attributes['href' ]));
217
+ htmlResourceNodes[tag] = res;
218
+ newResources.add (res);
209
219
}
210
- for (var tag in document.querySelectorAll ('img' )) {
211
- newResources.add (graph.nodeFromUri (uri.resolve (tag.attributes['src' ])));
220
+ for (var tag in document.querySelectorAll ('img[src]' )) {
221
+ var res = graph.nodeFromUri (uri.resolve (tag.attributes['src' ]));
222
+ htmlResourceNodes[tag] = res;
223
+ newResources.add (res);
212
224
}
213
225
if (! _same (newResources, resources)) {
214
226
structureChanged = true ;
0 commit comments