OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** Collects several code emitters for the template tool. */ | 5 /** Collects several code emitters for the template tool. */ |
6 library emitters; | 6 library emitters; |
7 | 7 |
8 import 'package:csslib/parser.dart' as css; | 8 import 'package:csslib/parser.dart' as css; |
9 import 'package:csslib/visitor.dart'; | 9 import 'package:csslib/visitor.dart'; |
10 import 'package:html5lib/dom.dart'; | 10 import 'package:html5lib/dom.dart'; |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
406 | 406 |
407 if (info.element.attributes['apply-author-styles'] != null) { | 407 if (info.element.attributes['apply-author-styles'] != null) { |
408 _context.printer.addLine('if (_root is autogenerated.ShadowRoot) ' | 408 _context.printer.addLine('if (_root is autogenerated.ShadowRoot) ' |
409 '_root.applyAuthorStyles = true;'); | 409 '_root.applyAuthorStyles = true;'); |
410 // TODO(jmesserly): warn at runtime if apply-author-styles was not set, | 410 // TODO(jmesserly): warn at runtime if apply-author-styles was not set, |
411 // and we don't have Shadow DOM support? In that case, styles won't have | 411 // and we don't have Shadow DOM support? In that case, styles won't have |
412 // proper encapsulation. | 412 // proper encapsulation. |
413 } | 413 } |
414 | 414 |
415 if (info.template != null && !elemInfo.childrenCreatedInCode) { | 415 if (info.template != null && !elemInfo.childrenCreatedInCode) { |
416 // TODO(jmesserly): scoped styles probably don't work when | |
417 // childrenCreatedInCode is true. | |
418 if (info.styleSheet != null) { | |
419 var tag = cssPolyfill ? info.tagName : null; | |
420 // TODO(jmesserly): csslib+html5lib should work together. We shouldn't | |
421 // need to call a different function to serialize CSS. | |
422 // Calling innerHTML on a StyleElement should be | |
423 // enought - like a real browser. CSSOM and DOM | |
424 // should work together in the same tree. | |
425 // TODO(terry): Consider not emitting <style> tag inside of component. | |
426 // Maybe we can generate a .css file that has all the CSS | |
427 // polyfill. The style tag can change the rendering a bit. | |
428 var styleSheet = | |
429 '<style>\n' | |
430 '${emitStyleSheet(info.styleSheet, tag)}' | |
431 '\n</style>'; | |
432 var template = elemInfo.node; | |
433 template.insertBefore(new Element.html(styleSheet), | |
434 template.children[0]); | |
435 } | |
436 | |
437 _context.statics.add('final', '__shadowTemplate', | 416 _context.statics.add('final', '__shadowTemplate', |
438 elemInfo.node.sourceSpan, | 417 elemInfo.node.sourceSpan, |
439 "new autogenerated.DocumentFragment.html('''" | 418 "new autogenerated.DocumentFragment.html('''" |
440 "${escapeDartString(elemInfo.node.innerHtml, triple: true)}" | 419 "${escapeDartString(elemInfo.node.innerHtml, triple: true)}" |
441 "''')"); | 420 "''')"); |
442 _context.printer.addLine( | 421 _context.printer.addLine( |
443 "_root.nodes.add(__shadowTemplate.clone(true));"); | 422 "_root.nodes.add(__shadowTemplate.clone(true));"); |
444 } | 423 } |
445 | 424 |
446 visit(elemInfo); | 425 visit(elemInfo); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
544 document.queryAll('script').forEach((tag) { | 523 document.queryAll('script').forEach((tag) { |
545 var src = tag.attributes["src"]; | 524 var src = tag.attributes["src"]; |
546 if (tag.attributes['type'] == 'application/dart') { | 525 if (tag.attributes['type'] == 'application/dart') { |
547 tag.remove(); | 526 tag.remove(); |
548 } else if (src != null && rewriteUrls) { | 527 } else if (src != null && rewriteUrls) { |
549 tag.attributes["src"] = pathInfo.transformUrl(_fileInfo.path, src); | 528 tag.attributes["src"] = pathInfo.transformUrl(_fileInfo.path, src); |
550 } | 529 } |
551 }); | 530 }); |
552 document.queryAll('link').forEach((tag) { | 531 document.queryAll('link').forEach((tag) { |
553 var href = tag.attributes['href']; | 532 var href = tag.attributes['href']; |
554 if (tag.attributes['rel'] == 'components') { | 533 var rel = tag.attributes['rel']; |
534 if (rel == 'components') { | |
Siggi Cherem (dart-lang)
2013/03/07 22:14:20
do you mind adding rel == 'component' too, I think
terry
2013/03/08 20:11:24
Done.
| |
555 tag.remove(); | 535 tag.remove(); |
536 } else if (rel == 'stylesheet' && !href.startsWith('http')) { | |
Siggi Cherem (dart-lang)
2013/03/07 22:14:20
let's check also that && cssPolyfill is true, othe
terry
2013/03/08 20:11:24
I didn't think of this as polyfill but more of how
| |
537 tag.remove(); | |
556 } else if (href != null && rewriteUrls) { | 538 } else if (href != null && rewriteUrls) { |
557 tag.attributes['href'] = pathInfo.transformUrl(_fileInfo.path, href); | 539 tag.attributes['href'] = pathInfo.transformUrl(_fileInfo.path, href); |
558 } | 540 } |
559 }); | 541 }); |
560 | 542 |
543 var linkElem = new Element.html('<link rel="stylesheet" type="text/css"' | |
Siggi Cherem (dart-lang)
2013/03/07 22:14:20
likewise - we should only add this new link if css
terry
2013/03/08 20:11:24
Done.
| |
544 ' href="${_fileInfo.path.filename}.css">'); | |
545 document.head.insertBefore(linkElem, null); | |
Siggi Cherem (dart-lang)
2013/03/07 22:14:20
should this be done as the first child so that the
terry
2013/03/08 20:11:24
Good idea to make it first.
On 2013/03/07 22:14:20
| |
561 | 546 |
562 var codeInfo = _fileInfo.userCode; | 547 var codeInfo = _fileInfo.userCode; |
563 if (codeInfo == null) { | 548 if (codeInfo == null) { |
564 assert(transaction == null); | 549 assert(transaction == null); |
565 codeInfo = new DartCodeInfo(null, null, [], 'main(){\n}', null); | 550 codeInfo = new DartCodeInfo(null, null, [], 'main(){\n}', null); |
566 } | 551 } |
567 | 552 |
568 if (transaction == null) { | 553 if (transaction == null) { |
569 transaction = new TextEditTransaction(codeInfo.code, codeInfo.sourceFile); | 554 transaction = new TextEditTransaction(codeInfo.code, codeInfo.sourceFile); |
570 } | 555 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
691 } | 676 } |
692 typeName = htmlElementExtends[typeName]; | 677 typeName = htmlElementExtends[typeName]; |
693 } | 678 } |
694 // If we didn't find a DOM setter, and this is a component, set a property on | 679 // If we didn't find a DOM setter, and this is a component, set a property on |
695 // the component. | 680 // the component. |
696 if (info.component != null && !name.startsWith('data-')) { | 681 if (info.component != null && !name.startsWith('data-')) { |
697 return 'xtag.${toCamelCase(name)}'; | 682 return 'xtag.${toCamelCase(name)}'; |
698 } | 683 } |
699 return "attributes['$name']"; | 684 return "attributes['$name']"; |
700 } | 685 } |
OLD | NEW |