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

Unified Diff: pkg/polymer/lib/src/build/import_inliner.dart

Issue 225043004: Replace bootstrap logic with 'boot.js', use 'component/dart' mime-type and add (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 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
Index: pkg/polymer/lib/src/build/import_inliner.dart
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 992ae78f2fe9770fb1e67347bb4aea9d5003dbda..f565068f69110ffe2959b4bda4763ec708e4e60f 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -20,6 +20,7 @@ import 'package:source_maps/span.dart';
import 'common.dart';
+// TODO(sigmund): move to web_components package (dartbug.com/18037).
class _HtmlInliner extends PolymerTransformer {
final TransformOptions options;
final Transform transform;
@@ -50,7 +51,8 @@ class _HtmlInliner extends PolymerTransformer {
changed = _extractScripts(document, docId);
return _visitImports(document);
}).then((importsFound) {
- changed = changed || importsFound;
+ bool scriptsRemoved = _removeScripts(document);
+ changed = changed || importsFound || scriptsRemoved;
var output = transform.primaryInput;
if (changed) output = new Asset.fromString(docId, document.outerHtml);
@@ -120,7 +122,8 @@ class _HtmlInliner extends PolymerTransformer {
var type = node.attributes['type'];
var rel = node.attributes['rel'];
if (tag == 'style' || tag == 'script' &&
- (type == null || type == TYPE_JS || type == TYPE_DART) ||
+ (type == null || type == TYPE_JS || type == TYPE_DART_APP ||
+ type == TYPE_DART_COMPONENT) ||
tag == 'link' && (rel == 'stylesheet' || rel == 'import')) {
// Move the node into the body, where its contents will be placed.
doc.body.insertBefore(node, insertionPoint);
@@ -135,7 +138,6 @@ class _HtmlInliner extends PolymerTransformer {
new _UrlNormalizer(transform, id).visit(doc);
return _visitImports(doc).then((_) {
_extractScripts(doc, id);
- _removeScripts(doc);
// TODO(jmesserly): figure out how this is working in vulcanizer.
// Do they produce a <body> tag with a <head> and <body> inside?
@@ -153,23 +155,22 @@ class _HtmlInliner extends PolymerTransformer {
});
}
- /// Remove scripts from HTML imports, and remember their [AssetId]s for later
- /// use.
+ /// Remove "application/dart;component=1" scripts and remember their
+ /// [AssetId]s for later use.
///
/// Dartium only allows a single script tag per page, so we can't inline
/// the script tags. Instead we remove them entirely.
- void _removeScripts(Document doc) {
+ bool _removeScripts(Document doc) {
+ bool changed = false;
for (var script in doc.querySelectorAll('script')) {
- if (script.attributes['type'] == TYPE_DART) {
+ if (script.attributes['type'] == TYPE_DART_COMPONENT) {
+ changed = true;
script.remove();
var src = script.attributes['src'];
scriptIds.add(uriToAssetId(docId, src, logger, script.sourceSpan));
-
- // only the first script needs to be added.
- // others are already removed by _extractScripts
- return;
}
}
+ return changed;
}
/// Split inline scripts into their own files. We need to do this for dart2js
@@ -180,23 +181,15 @@ class _HtmlInliner extends PolymerTransformer {
bool changed = false;
bool first = true;
for (var script in doc.querySelectorAll('script')) {
- if (script.attributes['type'] != TYPE_DART) continue;
+ var type = script.attributes['type'];
+ if (type != TYPE_DART_COMPONENT && type != TYPE_DART_APP) continue;
// only one Dart script per document is supported in Dartium.
- if (!first) {
- // Remove the script. It's invalid to have more than one in Dartium.
- script.remove();
- changed = true;
-
- // TODO(jmesserly): remove this when we are running linter.
- logger.warning('more than one Dart script per HTML '
- 'document is not supported. Script will be ignored.',
- span: script.sourceSpan);
- continue;
+ if (type == TYPE_DART_APP) {
+ if (!first) logger.warning(COMPONENT_WARNING, span: script.sourceSpan);
+ first = false;
}
- first = false;
-
var src = script.attributes['src'];
if (src != null) continue;
@@ -222,7 +215,7 @@ class _HtmlInliner extends PolymerTransformer {
'${path.extension(sourceId.path).substring(1)}';
if (libName.startsWith('lib/')) libName = libName.substring(4);
libName = libName.replaceAll('/', '.').replaceAll('-', '_');
- libName = '${sourceId.package}.$libName';
+ libName = '${sourceId.package}.${libName}_$count';
code = "library $libName;\n$code";
}
@@ -258,7 +251,8 @@ class ImportInliner extends Transformer {
new _HtmlInliner(options, transform).apply();
}
-const TYPE_DART = 'application/dart';
+const TYPE_DART_APP = 'application/dart';
+const TYPE_DART_COMPONENT = 'application/dart;component=1';
const TYPE_JS = 'text/javascript';
/// Internally adjusts urls in the html that we are about to inline.
@@ -280,11 +274,13 @@ class _UrlNormalizer extends TreeVisitor {
});
if (node.localName == 'style') {
node.text = visitCss(node.text);
- } else if (node.localName == 'script' &&
- node.attributes['type'] == TYPE_DART) {
+ } else if (node.localName == 'script') {
+ var type = node.attributes['type'];
// TODO(jmesserly): we might need to visit JS too to handle ES Harmony
// modules.
- node.text = visitInlineDart(node.text);
+ if (type == TYPE_DART_APP || type == TYPE_DART_COMPONENT) {
+ node.text = visitInlineDart(node.text);
+ }
}
super.visitElement(node);
}
@@ -391,3 +387,10 @@ const _urlAttributes = const [
];
_getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
+
+const COMPONENT_WARNING =
+ 'More than one Dart script per HTML document is not supported, but in the '
+ 'near future Dartium will execute each tag as a separate isolate. If this '
+ 'code is meant to load definitions that are part of the same application '
+ 'you should switch it to use the "application/dart;component=1" mime-type '
+ 'instead.';

Powered by Google App Engine
This is Rietveld 408576698