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

Side by Side Diff: pkg/polymer/lib/src/build/import_inliner.dart

Issue 404623002: normalize url attributes on entry point elements (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review updates Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/.gitignore ('k') | pkg/polymer/test/build/import_inliner_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// Transfomer that inlines polymer-element definitions from html imports. 5 /// Transfomer that inlines polymer-element definitions from html imports.
6 library polymer.src.build.import_inliner; 6 library polymer.src.build.import_inliner;
7 7
8 import 'dart:async'; 8 import 'dart:async';
9 import 'dart:convert'; 9 import 'dart:convert';
10 10
(...skipping 27 matching lines...) Expand all
38 38
39 _HtmlInliner(this.options, Transform transform) 39 _HtmlInliner(this.options, Transform transform)
40 : transform = transform, 40 : transform = transform,
41 logger = transform.logger, 41 logger = transform.logger,
42 docId = transform.primaryInput.id; 42 docId = transform.primaryInput.id;
43 43
44 Future apply() { 44 Future apply() {
45 seen.add(docId); 45 seen.add(docId);
46 46
47 Document document; 47 Document document;
48 bool changed; 48 bool changed = false;
49 49
50 return readPrimaryAsHtml(transform).then((doc) { 50 return readPrimaryAsHtml(transform).then((doc) {
51 document = doc; 51 document = doc;
52 changed = new _UrlNormalizer(transform, docId).visit(document) || changed;
53
52 experimentalBootstrap = document.querySelectorAll('link').any((link) => 54 experimentalBootstrap = document.querySelectorAll('link').any((link) =>
53 link.attributes['rel'] == 'import' && 55 link.attributes['rel'] == 'import' &&
54 link.attributes['href'] == POLYMER_EXPERIMENTAL_HTML); 56 link.attributes['href'] == POLYMER_EXPERIMENTAL_HTML);
55 changed = _extractScripts(document); 57 changed = _extractScripts(document) || changed;
56 return _visitImports(document); 58 return _visitImports(document);
57 }).then((importsFound) { 59 }).then((importsFound) {
58 changed = changed || importsFound; 60 changed = changed || importsFound;
59 return _removeScripts(document); 61 return _removeScripts(document);
60 }).then((scriptsRemoved) { 62 }).then((scriptsRemoved) {
61 changed = changed || scriptsRemoved; 63 changed = changed || scriptsRemoved;
62 64
63 var output = transform.primaryInput; 65 var output = transform.primaryInput;
64 if (changed) output = new Asset.fromString(docId, document.outerHtml); 66 if (changed) output = new Asset.fromString(docId, document.outerHtml);
65 transform.addOutput(output); 67 transform.addOutput(output);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 /// Asset where the original content (and original url) was found. 297 /// Asset where the original content (and original url) was found.
296 final AssetId sourceId; 298 final AssetId sourceId;
297 299
298 /// Counter used to ensure that every library name we inject is unique. 300 /// Counter used to ensure that every library name we inject is unique.
299 int _count = 0; 301 int _count = 0;
300 302
301 /// Path to the top level folder relative to the transform primaryInput. 303 /// Path to the top level folder relative to the transform primaryInput.
302 /// This should just be some arbitrary # of ../'s. 304 /// This should just be some arbitrary # of ../'s.
303 final String topLevelPath; 305 final String topLevelPath;
304 306
307 /// Whether or not the normalizer has changed something in the tree.
308 bool changed = false;
309
305 _UrlNormalizer(transform, this.sourceId) 310 _UrlNormalizer(transform, this.sourceId)
306 : transform = transform, 311 : transform = transform,
307 topLevelPath = 312 topLevelPath =
308 '../' * (transform.primaryInput.id.path.split('/').length - 2); 313 '../' * (transform.primaryInput.id.path.split('/').length - 2);
309 314
315 visit(Element node) {
316 super.visit(node);
317 return changed;
318 }
319
310 visitElement(Element node) { 320 visitElement(Element node) {
311 // TODO(jakemac): Support custom elements that extend html elements which 321 // TODO(jakemac): Support custom elements that extend html elements which
312 // have url-like attributes. This probably means keeping a list of which 322 // have url-like attributes. This probably means keeping a list of which
313 // html elements support each url-like attribute. 323 // html elements support each url-like attribute.
314 if (!isCustomTagName(node.localName)) { 324 if (!isCustomTagName(node.localName)) {
315 node.attributes.forEach((name, value) { 325 node.attributes.forEach((name, value) {
316 if (_urlAttributes.contains(name)) { 326 if (_urlAttributes.contains(name)) {
317 if (value != '' && !value.trim().startsWith('{{')) { 327 if (value != '' && !value.trim().startsWith('{{')) {
318 node.attributes[name] = _newUrl(value, node.sourceSpan); 328 node.attributes[name] = _newUrl(value, node.sourceSpan);
329 changed = changed || value != node.attributes[name];
319 } 330 }
320 } 331 }
321 }); 332 });
322 } 333 }
323 if (node.localName == 'style') { 334 if (node.localName == 'style') {
324 node.text = visitCss(node.text); 335 node.text = visitCss(node.text);
336 changed = true;
325 } else if (node.localName == 'script' && 337 } else if (node.localName == 'script' &&
326 node.attributes['type'] == TYPE_DART && 338 node.attributes['type'] == TYPE_DART &&
327 !node.attributes.containsKey('src')) { 339 !node.attributes.containsKey('src')) {
328 // TODO(jmesserly): we might need to visit JS too to handle ES Harmony 340 // TODO(jmesserly): we might need to visit JS too to handle ES Harmony
329 // modules. 341 // modules.
330 node.text = visitInlineDart(node.text); 342 node.text = visitInlineDart(node.text);
343 changed = true;
331 } 344 }
332 super.visitElement(node); 345 return super.visitElement(node);
333 } 346 }
334 347
335 static final _URL = new RegExp(r'url\(([^)]*)\)', multiLine: true); 348 static final _URL = new RegExp(r'url\(([^)]*)\)', multiLine: true);
336 static final _QUOTE = new RegExp('["\']', multiLine: true); 349 static final _QUOTE = new RegExp('["\']', multiLine: true);
337 350
338 /// Visit the CSS text and replace any relative URLs so we can inline it. 351 /// Visit the CSS text and replace any relative URLs so we can inline it.
339 // Ported from: 352 // Ported from:
340 // https://github.com/Polymer/vulcanize/blob/c14f63696797cda18dc3d372b78aa3378 acc691f/lib/vulcan.js#L149 353 // https://github.com/Polymer/vulcanize/blob/c14f63696797cda18dc3d372b78aa3378 acc691f/lib/vulcan.js#L149
341 // TODO(jmesserly): use csslib here instead? Parsing with RegEx is sadness. 354 // TODO(jmesserly): use csslib here instead? Parsing with RegEx is sadness.
342 // Maybe it's reliable enough for finding URLs in CSS? I'm not sure. 355 // Maybe it's reliable enough for finding URLs in CSS? I'm not sure.
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 /// When inlining <link rel="stylesheet"> tags copy over all attributes to the 457 /// When inlining <link rel="stylesheet"> tags copy over all attributes to the
445 /// style tag except these ones. 458 /// style tag except these ones.
446 const IGNORED_LINKED_STYLE_ATTRS = 459 const IGNORED_LINKED_STYLE_ATTRS =
447 const ['charset', 'href', 'href-lang', 'rel', 'rev']; 460 const ['charset', 'href', 'href-lang', 'rel', 'rev'];
448 461
449 /// Global RegExp objects for validating generated library names. 462 /// Global RegExp objects for validating generated library names.
450 final INVALID_LIB_CHARS_REGEX = new RegExp('[^a-z0-9_]'); 463 final INVALID_LIB_CHARS_REGEX = new RegExp('[^a-z0-9_]');
451 final NUM_REGEX = new RegExp('[0-9]'); 464 final NUM_REGEX = new RegExp('[0-9]');
452 465
453 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end); 466 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
OLDNEW
« no previous file with comments | « pkg/.gitignore ('k') | pkg/polymer/test/build/import_inliner_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698