add option to ImportCrawler to start from an already parsed document
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f52cce3..6f0c931 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+#### 0.10.5
+ * Update `ImportCrawler` with support for pre-parsed initial documents. This
+ allows it to work better with other transformers in the same step (you can
+ pass in a modified document).
+
#### 0.10.4+2
* Fix `@CustomElement` test in internet explorer.
diff --git a/lib/build/import_crawler.dart b/lib/build/import_crawler.dart
index 5566efb..c655efc 100644
--- a/lib/build/import_crawler.dart
+++ b/lib/build/import_crawler.dart
@@ -30,7 +30,12 @@
final BuildLogger _logger;
final AssetId _primaryInputId;
- ImportCrawler(this._transform, this._primaryInputId, this._logger);
+ // Optional parsed document for the primary id if available.
+ final Document _primaryDocument;
+
+ ImportCrawler(this._transform, this._primaryInputId, this._logger,
+ {Document primaryDocument})
+ : _primaryDocument = primaryDocument;
/// Returns a post-ordered map of [AssetId]'s to [ImportData]. The [AssetId]'s
/// represent an asset which was discovered via an html import, and the
@@ -40,13 +45,11 @@
var documents = new LinkedHashMap<AssetId, ImportData>();
var seen = new Set<AssetId>();
- Future doCrawl(AssetId assetId, [Element import]) {
+ Future doCrawl(AssetId assetId, [Element import, Document document]) {
if (seen.contains(assetId)) return null;
seen.add(assetId);
- return _transform.readInputAsString(assetId).then((html) {
- var document = parseHtml(html, assetId.path);
-
+ Future crawlImports(Document document) {
var imports = document.querySelectorAll('link[rel="import"]');
var done =
Future.forEach(imports, (i) => doCrawl(_importId(assetId, i), i));
@@ -55,14 +58,23 @@
return done.then((_) {
documents[assetId] = new ImportData(document, import);
});
- }).catchError((error) {
- var span;
- if (import != null) span = import.sourceSpan;
- _logger.error(inlineImportFail.create({'error': error}), span: span);
- });
+ }
+
+ if (document != null) {
+ return crawlImports(document);
+ } else {
+ return _transform.readInputAsString(assetId).then((html) {
+ return crawlImports(parseHtml(html, assetId.path));
+ }).catchError((error) {
+ var span;
+ if (import != null) span = import.sourceSpan;
+ _logger.error(inlineImportFail.create({'error': error}), span: span);
+ });
+ }
}
- return doCrawl(_primaryInputId).then((_) => documents);
+ return
+ doCrawl(_primaryInputId, null, _primaryDocument).then((_) => documents);
}
AssetId _importId(AssetId source, Element import) {
diff --git a/pubspec.yaml b/pubspec.yaml
index 3e6cf30..d11d54e 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: web_components
-version: 0.10.4+2
+version: 0.10.5
author: Polymer.dart Authors <web-ui-dev@dartlang.org>
homepage: https://www.dartlang.org/polymer-dart/
description: >
diff --git a/test/build/import_crawler_test.dart b/test/build/import_crawler_test.dart
index 776ee1c..c140c09 100644
--- a/test/build/import_crawler_test.dart
+++ b/test/build/import_crawler_test.dart
@@ -3,24 +3,42 @@
// BSD-style license that can be found in the LICENSE file.
library web_components.test.build.import_crawler_test;
+import 'dart:async';
import 'package:barback/barback.dart';
import 'package:code_transformers/tests.dart';
import 'package:code_transformers/messages/build_logger.dart';
+import 'package:html5lib/dom.dart' show Document;
+import 'package:web_components/build/common.dart';
import 'package:web_components/build/import_crawler.dart';
import 'package:unittest/compact_vm_config.dart';
class _TestTransformer extends Transformer {
final String _entryPoint;
Map<AssetId, ImportData> documents;
+ final bool _preParseDocument;
- _TestTransformer(this._entryPoint);
+ _TestTransformer(this._entryPoint, [this._preParseDocument = false]);
isPrimary(AssetId id) => id.path == _entryPoint;
apply(Transform transform) {
var primaryInput = transform.primaryInput;
var logger = new BuildLogger(transform, primaryId: primaryInput.id);
- var crawler = new ImportCrawler(transform, primaryInput.id, logger);
+ if (_preParseDocument) {
+ return primaryInput.readAsString().then((html) {
+ var document = parseHtml(html, primaryInput.id.path);
+ return crawlDocument(transform, logger, document);
+ });
+ } else {
+ return crawlDocument(transform, logger);
+ }
+ }
+
+ Future crawlDocument(
+ Transform transform, BuildLogger logger, [Document document]) {
+ var primaryInput = transform.primaryInput;
+ var crawler = new ImportCrawler(
+ transform, primaryInput.id, logger, primaryDocument: document);
return crawler.crawlImports().then((docs) {
documents = docs;
transform.addOutput(new Asset.fromString(
@@ -31,8 +49,13 @@
main() {
useCompactVMConfiguration();
+ runTests([[new _TestTransformer('web/index.html')]]);
+ // Test with a preparsed original document as well.
+ runTests([[new _TestTransformer('web/index.html', true)]]);
+}
- testPhases('basic', [[new _TestTransformer('web/index.html')]], {
+runTests(List<List<Transformer>> phases) {
+ testPhases('basic', phases, {
'a|web/index.html': '''
<link rel="import" href="foo.html">
<link rel="import" href="packages/a/foo.html">
@@ -53,7 +76,7 @@
''',
}, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
- testPhases('cycle', [[new _TestTransformer('web/index.html')]], {
+ testPhases('cycle', phases, {
'a|web/index.html': '''
<link rel="import" href="packages/a/foo.html">
<div>a|web/index.html</div>
@@ -70,7 +93,7 @@
''',
}, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
- testPhases('deep imports', [[new _TestTransformer('web/index.html')]], {
+ testPhases('deep imports', phases, {
'a|web/index.html': '''
<link rel="import" href="packages/a/foo.html">
<div>a|web/index.html</div>