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

Side by Side Diff: pkg/polymer/lib/src/mirror_loader.dart

Issue 293023008: Bring back initPolymer, allow boot.js only if using "polymer_experimental.html". (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 /// Contains logic to initialize polymer apps during development. This 5 /// Contains logic to initialize polymer apps during development. This
6 /// implementation uses dart:mirrors to load each library as they are discovered 6 /// implementation uses dart:mirrors to load each library as they are discovered
7 /// through HTML imports. This is only meant to be during development in 7 /// through HTML imports. This is only meant to be during development in
8 /// dartium, and the polymer transformers replace this implementation with 8 /// dartium, and the polymer transformers replace this implementation with
9 /// codege generation in the polymer-build steps. 9 /// codege generation in the polymer-build steps.
10 library polymer.src.mirror_loader; 10 library polymer.src.mirror_loader;
11 11
12 import 'dart:async'; 12 import 'dart:async';
13 import 'dart:html'; 13 import 'dart:html';
14 import 'dart:collection' show LinkedHashMap; 14 import 'dart:collection' show LinkedHashMap;
15 15
16 // Technically, we shouldn't need any @MirrorsUsed, since this is for 16 // Technically, we shouldn't need any @MirrorsUsed, since this is for
17 // development only, but our test bots don't yet run pub-build. See more details 17 // development only, but our test bots don't yet run pub-build. See more details
18 // on the comments of the mirrors import in `lib/polymer.dart`. 18 // on the comments of the mirrors import in `lib/polymer.dart`.
19 @MirrorsUsed(metaTargets: 19 @MirrorsUsed(metaTargets:
20 const [CustomTag, InitMethodAnnotation], 20 const [CustomTag, InitMethodAnnotation],
21 override: const ['smoke.mirrors', 'polymer.src.mirror_loader']) 21 override: const ['smoke.mirrors', 'polymer.src.mirror_loader'])
22 import 'dart:mirrors'; 22 import 'dart:mirrors';
23 23
24 import 'package:logging/logging.dart' show Logger; 24 import 'package:logging/logging.dart' show Logger;
25 import 'package:observe/src/dirty_check.dart';
26 import 'package:polymer/boot.dart' show discoverScripts, ScriptInfo;
Siggi Cherem (dart-lang) 2014/05/22 21:10:41 Q: I wonder if I should just move the code that is
Jennifer Messerly 2014/05/23 07:20:06 I guess the main reason is if you want it to be pu
Siggi Cherem (dart-lang) 2014/05/23 17:56:33 Done. Moved it here. At least now it is structured
25 import 'package:polymer/polymer.dart'; 27 import 'package:polymer/polymer.dart';
26 import 'package:observe/src/dirty_check.dart';
27 28
28 29
30 /// Used by code generated from the experimental polymer bootstrap in boot.js.
29 void startPolymerInDevelopment(List<String> librariesToLoad) { 31 void startPolymerInDevelopment(List<String> librariesToLoad) {
30 dirtyCheckZone()..run(() { 32 dirtyCheckZone()..run(() {
31 startPolymer(discoverInitializers(librariesToLoad), false); 33 startPolymer(discoverInitializers(librariesToLoad), false);
32 }); 34 });
33 } 35 }
34 36
35 /// Set of initializers that are invoked by `initPolymer`. This is computed the 37 /// Set of initializers that are invoked by `initPolymer`. This is computed the
36 /// list by crawling HTML imports, searching for script tags, and including an 38 /// list by crawling HTML imports, searching for script tags, and including an
37 /// initializer for each type tagged with a [CustomTag] annotation and for each 39 /// initializer for each type tagged with a [CustomTag] annotation and for each
38 /// top-level method annotated with [initMethod]. 40 /// top-level method annotated with [initMethod].
41 List<Function> initializers = discoverInitializers(
42 discoverLibrariesToLoad(document, window.location.href));
43
44 /// True if we're in deployment mode.
45 bool deployMode = false;
39 46
40 /// Discovers what script tags are loaded from HTML pages and collects the 47 /// Discovers what script tags are loaded from HTML pages and collects the
41 /// initializers of their corresponding libraries. 48 /// initializers of their corresponding libraries.
42 // Visible for testing only. 49 // Visible for testing only.
43 List<Function> discoverInitializers(List<String> librariesToLoad) { 50 List<Function> discoverInitializers(Iterable<String> librariesToLoad) {
44 var initializers = []; 51 var initializers = [];
45 for (var lib in librariesToLoad) { 52 for (var lib in librariesToLoad) {
46 try { 53 try {
47 _loadLibrary(lib, initializers); 54 _loadLibrary(lib, initializers);
48 } catch (e, s) { 55 } catch (e, s) {
49 // Deliver errors async, so if a single library fails it doesn't prevent 56 // Deliver errors async, so if a single library fails it doesn't prevent
50 // other things from loading. 57 // other things from loading.
51 new Completer().completeError(e, s); 58 new Completer().completeError(e, s);
52 } 59 }
53 } 60 }
54 return initializers; 61 return initializers;
55 } 62 }
56 63
64 Iterable<String> discoverLibrariesToLoad(Document doc, String baseUri) =>
65 discoverScripts(doc, baseUri).map(
66 (info) => _hasPackageUrl(info) ? info.packageUrl : info.resolvedUrl);
67
68 bool _hasPackageUrl(ScriptInfo info) =>
69 info.isPackage && _libs[Uri.parse(info.packageUrl)] != null;
70
57 /// All libraries in the current isolate. 71 /// All libraries in the current isolate.
58 final _libs = currentMirrorSystem().libraries; 72 final _libs = currentMirrorSystem().libraries;
59 73
60 final Logger _loaderLog = new Logger('polymer.src.mirror_loader'); 74 final Logger _loaderLog = new Logger('polymer.src.mirror_loader');
61 75
62 /// Reads the library at [uriString] (which can be an absolute URI or a relative 76 /// Reads the library at [uriString] (which can be an absolute URI or a relative
63 /// URI from the root library), and: 77 /// URI from the root library), and:
64 /// 78 ///
65 /// * If present, invokes any top-level and static functions marked 79 /// * If present, invokes any top-level and static functions marked
66 /// with the [initMethod] annotation (in the order they appear). 80 /// with the [initMethod] annotation (in the order they appear).
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 " ${method.simpleName} is not."); 167 " ${method.simpleName} is not.");
154 return; 168 return;
155 } 169 }
156 if (!method.parameters.where((p) => !p.isOptional).isEmpty) { 170 if (!method.parameters.where((p) => !p.isOptional).isEmpty) {
157 print("warning: methods marked with @initMethod should take no " 171 print("warning: methods marked with @initMethod should take no "
158 "arguments, ${method.simpleName} expects some."); 172 "arguments, ${method.simpleName} expects some.");
159 return; 173 return;
160 } 174 }
161 initializers.add(() => obj.invoke(method.simpleName, const [])); 175 initializers.add(() => obj.invoke(method.simpleName, const []));
162 } 176 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698