Chromium Code Reviews| Index: tools/dom/src/native_DOMImplementation.dart |
| diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart |
| index 97487bf7036a2fce7b676690d335ba64a54ddf6d..e9db0239bd287d1f441902247428d50f2ff7dff2 100644 |
| --- a/tools/dom/src/native_DOMImplementation.dart |
| +++ b/tools/dom/src/native_DOMImplementation.dart |
| @@ -5,12 +5,12 @@ |
| part of html; |
| class _Property { |
| - _Property(this.name) : |
| - _hasValue = false, |
| - writable = false, |
| - isMethod = false, |
| - isOwn = true, |
| - wasThrown = false; |
| + _Property(this.name) |
| + : _hasValue = false, |
| + writable = false, |
| + isMethod = false, |
| + isOwn = true, |
| + wasThrown = false; |
| bool get hasValue => _hasValue; |
| get value => _value; |
| @@ -30,6 +30,192 @@ class _Property { |
| bool wasThrown; |
| } |
| +/** |
| + * Manager for navigating between libraries from the devtools console. |
| + */ |
| +class _LibraryManager { |
| + /** |
| + * Current active library |
| + */ |
| + static var _currentLibrary; |
| + static var _validCache = false; |
| + |
| + static Map<String, Uri> _libraryUris; |
| + static Map<String, Uri> _libraryNames; |
| + |
| + // List of all maps to check to determine if there is an exact match. |
| + static List<Map<String, Uri>> _fastPaths; |
| + |
| + static cache() { |
| + if (_validCache) return; |
| + _validCache = true; |
| + _libraryUris = new Map<String, Uri>(); |
| + _libraryNames = new Map<String, Uri>(); |
| + _fastPaths = [_libraryUris, _libraryNames]; |
| + var system = currentMirrorSystem(); |
| + system.libraries.forEach((uri, library) { |
| + _libraryUris[uri.toString()] = uri; |
|
Alan Knight
2016/04/06 20:07:27
What happens if multiple libraries have the same s
Jacob
2016/04/07 00:09:25
cleaned this code up. Now that case is properly ha
|
| + _libraryNames[MirrorSystem.getName(library.simpleName)] = uri; |
| + }); |
| + } |
| + |
| + static String get currentLibrary { |
| + if (_currentLibrary == null) { |
| + _currentLibrary = |
| + currentMirrorSystem().isolate.rootLibrary.uri.toString(); |
| + } |
| + return _currentLibrary; |
| + } |
| + |
| + /** |
| + * Find libraries matching a given name. |
| + * |
| + * Uses heuristics to only return a single match when the user intent is |
| + * generally unambiguous. |
| + */ |
| + static List<Uri> findMatches(String name) { |
| + cache(); |
| + var nameAsFile = name.endsWith('.dart') ? name : '${name}.dart'; |
| + |
| + // Perfect match first. |
| + for (var map in _fastPaths) { |
|
Alan Knight
2016/04/06 20:07:28
In the spirit of heuristics for what the user want
Jacob
2016/04/07 00:09:25
Done. Added a case insensitive check as a final fa
|
| + var match = map[name]; |
| + if (match != null) return [match]; |
| + match = map[nameAsFile]; |
| + if (match != null) return [match]; |
| + } |
| + |
| + // Exact match for file path. |
| + var matches = new LinkedHashSet<Uri>(); |
| + for (var uri in _libraryUris.values) { |
| + if (uri.path == name || uri.path == nameAsFile) matches.add(uri); |
| + } |
| + if (matches.length == 1) return matches.toList(); |
| + |
| + // Exact match for file name. |
| + if (name != nameAsFile) { |
| + for (var uri in _libraryUris.values) { |
| + if (uri.pathSegments.isNotEmpty && |
| + (uri.pathSegments.last == nameAsFile)) { |
| + matches.add(uri); |
| + } |
| + } |
| + if (matches.length == 1) return matches.toList(); |
| + } |
| + |
| + for (var uri in _libraryUris.values) { |
| + if (uri.pathSegments.isNotEmpty && (uri.pathSegments.last == name)) { |
| + matches.add(uri); |
| + } |
| + } |
| + if (matches.length == 1) return matches.toList(); |
| + |
| + // Partial match on path. |
| + for (var uri in _libraryUris.values) { |
| + if (uri.path.contains(name)) { |
| + matches.add(uri); |
| + } |
| + } |
| + if (matches.length == 1) return matches.toList(); |
| + |
| + // Partial match on entire uri. |
| + for (var uri in _libraryUris.values) { |
| + if (uri.toString().contains(name)) { |
| + matches.add(uri); |
| + } |
| + } |
| + return matches.toList(); |
| + } |
| + |
| + static setLibrary([String name]) { |
| + // Bust cache in case library list has changed. Ideally we would listen for |
| + // when libraries are loaded and invalidate based on that. |
| + _validCache = false; |
| + cache(); |
| + if (name == null) { |
| + window.console |
| + ..group("Current library: $_currentLibrary") |
| + ..groupCollapsed("All libraries:"); |
| + _listLibraries(); |
| + window.console..groupEnd()..groupEnd(); |
| + return; |
| + } |
| + var matches = findMatches(name); |
| + if (matches.length != 1) { |
| + if (matches.length > 1) { |
| + window.console.warn("Ambiguous library name."); |
|
Alan Knight
2016/04/06 20:07:27
Say what the ambiguous name is?
Jacob
2016/04/07 00:09:25
Done.
|
| + } |
| + showMatches(name, matches); |
| + return; |
| + } |
| + _currentLibrary = matches.first.toString(); |
| + window.console.log("Set library to $_currentLibrary"); |
| + } |
| + |
| + static getLibrary() { |
| + return currentLibrary; |
| + } |
| + |
| + static List<Uri> _sortUris(Iterable<Uri> uris) { |
| + return (uris.toList()) |
| + ..sort((Uri a, Uri b) { |
| + if (a.scheme != b.scheme) { |
| + if (a.scheme == 'dart') return -1; |
| + if (b.scheme == 'dart') return 1; |
| + return a.scheme.compareTo(b.scheme); |
| + } |
| + return a.toString().compareTo(b.toString()); |
| + }); |
| + } |
| + |
| + static void listLibraries() { |
| + _validCache = false; |
| + cache(); |
| + _listLibraries(); |
| + } |
| + |
| + static void _listLibraries() { |
| + window.console.log(_sortUris(_libraryUris.values).join("\n")); |
| + } |
| + |
| + // Workaround to allow calling console.log with an arbitrary number of |
| + // arguments. |
| + static void _log(List<String> args) { |
| + js.JsNative.callMethod(window.console, 'log', args); |
| + } |
| + |
| + static showMatches(String key, Iterable<Uri> uris) { |
| + var boldPairs = []; |
| + var sb = new StringBuffer(); |
| + if (uris.isEmpty) { |
| + window.console.group("All libraries:"); |
| + _listLibraries(); |
| + window.console |
| + ..groupEnd() |
| + ..error("No library names or URIs match '$key'"); |
| + return; |
| + } |
| + sb.write("${uris.length} matches\n"); |
| + for (var uri in uris) { |
| + var txt = uri.toString(); |
| + int index = txt.indexOf(key); |
| + if (index != -1) { |
| + // %c enables styling console log messages with css |
| + // specified at the end of the console. |
| + sb..write(txt.substring(0, index))..write('%c'); |
| + var matchEnd = index + key.length; |
| + sb |
| + ..write(txt.substring(index, matchEnd)) |
| + ..write('%c') |
| + ..write(txt.substring(matchEnd)) |
| + ..write('\n'); |
| + boldPairs..add('font-weight: bold')..add('font-weight: normal'); |
| + } |
| + } |
| + _log([sb.toString()]..addAll(boldPairs)); |
| + } |
| +} |
| + |
| class _ConsoleVariables { |
| Map<String, Object> _data = new Map<String, Object>(); |
| @@ -75,15 +261,15 @@ abstract class _Trampoline implements Function { |
| } |
| class _MethodTrampoline extends _Trampoline { |
| - _MethodTrampoline(ObjectMirror receiver, MethodMirror methodMirror, |
| - Symbol selector) : |
| - super(receiver, methodMirror, selector); |
| + _MethodTrampoline( |
| + ObjectMirror receiver, MethodMirror methodMirror, Symbol selector) |
| + : super(receiver, methodMirror, selector); |
| noSuchMethod(Invocation msg) { |
| if (msg.memberName != #call) return super.noSuchMethod(msg); |
| - return _receiver.invoke(_selector, |
| - msg.positionalArguments, |
| - msg.namedArguments).reflectee; |
| + return _receiver |
| + .invoke(_selector, msg.positionalArguments, msg.namedArguments) |
| + .reflectee; |
| } |
| } |
| @@ -91,9 +277,9 @@ class _MethodTrampoline extends _Trampoline { |
| * Invocation trampoline class used to closurize getters. |
| */ |
| class _GetterTrampoline extends _Trampoline { |
| - _GetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror, |
| - Symbol selector) : |
| - super(receiver, methodMirror, selector); |
| + _GetterTrampoline( |
| + ObjectMirror receiver, MethodMirror methodMirror, Symbol selector) |
| + : super(receiver, methodMirror, selector); |
| call() => _receiver.getField(_selector).reflectee; |
| } |
| @@ -102,9 +288,9 @@ class _GetterTrampoline extends _Trampoline { |
| * Invocation trampoline class used to closurize setters. |
| */ |
| class _SetterTrampoline extends _Trampoline { |
| - _SetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror, |
| - Symbol selector) : |
| - super(receiver, methodMirror, selector); |
| + _SetterTrampoline( |
| + ObjectMirror receiver, MethodMirror methodMirror, Symbol selector) |
| + : super(receiver, methodMirror, selector); |
| call(value) { |
| _receiver.setField(_selector, value); |
| @@ -117,7 +303,7 @@ class _Utils { |
| static DateTime doubleToDateTime(double dateTime) { |
| try { |
| return new DateTime.fromMillisecondsSinceEpoch(dateTime.toInt()); |
| - } catch(_) { |
| + } catch (_) { |
| // TODO(antonnm): treat exceptions properly in bindings and |
| // find out how to treat NaNs. |
| return null; |
| @@ -162,7 +348,10 @@ class _Utils { |
| static Map createMap() => {}; |
| - static parseJson(String jsonSource) => const JsonDecoder().convert(jsonSource); |
| + static parseJson(String jsonSource) => |
| + const JsonDecoder().convert(jsonSource); |
| + |
| + static String getLibraryUrl() => _LibraryManager.currentLibrary; |
| static makeUnimplementedError(String fileName, int lineNo) { |
| return new UnsupportedError('[info: $fileName:$lineNo]'); |
| @@ -187,7 +376,8 @@ class _Utils { |
| return element; |
| } |
| - static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message); |
| + static forwardingPrint(String message) => |
| + _blink.Blink_Utils.forwardingPrint(message); |
| static void spawnDomHelper(Function f, int replyTo) => |
| _blink.Blink_Utils.spawnDomHelper(f, replyTo); |
| @@ -220,8 +410,8 @@ class _Utils { |
| */ |
| static Map<String, dynamic> createLocalVariablesMap(List localVariables) { |
| var map = {}; |
| - for (int i = 0; i < localVariables.length; i+=2) { |
| - map[stripMemberName(localVariables[i])] = localVariables[i+1]; |
| + for (int i = 0; i < localVariables.length; i += 2) { |
| + map[stripMemberName(localVariables[i])] = localVariables[i + 1]; |
| } |
| return map; |
| } |
| @@ -250,8 +440,8 @@ class _Utils { |
| * [_consoleTempVariables, 40, 2, someValue, someOtherValue]] |
| * </code> |
| */ |
| - static List wrapExpressionAsClosure(String expression, List locals, |
| - bool includeCommandLineAPI) { |
| + static List wrapExpressionAsClosure( |
| + String expression, List locals, bool includeCommandLineAPI) { |
| var args = {}; |
| var sb = new StringBuffer("("); |
| addArg(arg, value) { |
| @@ -286,26 +476,24 @@ class _Utils { |
| final _SET_VARIABLE = new RegExp("^(\\s*)(\\w+)(\\s*=)"); |
| // Match trailing semicolons. |
| final _ENDING_SEMICOLONS = new RegExp("(;\\s*)*\$"); |
| - expression = expression.replaceAllMapped(_VARIABLE_DECLARATION, |
| - (match) { |
| - var variableName = match[2]; |
| - // Set the console variable if it isn't already set. |
| - if (!_consoleTempVariables._data.containsKey(variableName)) { |
| - _consoleTempVariables._data[variableName] = null; |
| - } |
| - return "${match[1]}\$consoleVariables.${variableName}"; |
| - }); |
| - |
| - expression = expression.replaceAllMapped(_SET_VARIABLE, |
| - (match) { |
| - var variableName = match[2]; |
| - // Only rewrite if the name matches an existing console variable. |
| - if (_consoleTempVariables._data.containsKey(variableName)) { |
| - return "${match[1]}\$consoleVariables.${variableName}${match[3]}"; |
| - } else { |
| - return match[0]; |
| - } |
| - }); |
| + expression = expression.replaceAllMapped(_VARIABLE_DECLARATION, (match) { |
| + var variableName = match[2]; |
| + // Set the console variable if it isn't already set. |
| + if (!_consoleTempVariables._data.containsKey(variableName)) { |
| + _consoleTempVariables._data[variableName] = null; |
| + } |
| + return "${match[1]}\$consoleVariables.${variableName}"; |
| + }); |
| + |
| + expression = expression.replaceAllMapped(_SET_VARIABLE, (match) { |
| + var variableName = match[2]; |
| + // Only rewrite if the name matches an existing console variable. |
| + if (_consoleTempVariables._data.containsKey(variableName)) { |
| + return "${match[1]}\$consoleVariables.${variableName}${match[3]}"; |
| + } else { |
| + return match[0]; |
| + } |
| + }); |
| // We only allow dart expressions not Dart statements. Silently remove |
| // trailing semicolons the user might have added by accident to reduce the |
| @@ -314,8 +502,8 @@ class _Utils { |
| } |
| if (locals != null) { |
| - for (int i = 0; i < locals.length; i+= 2) { |
| - addArg(locals[i], locals[i+1]); |
| + for (int i = 0; i < locals.length; i += 2) { |
| + addArg(locals[i], locals[i + 1]); |
| } |
| } |
| // Inject all the already defined console variables. |
| @@ -330,12 +518,12 @@ class _Utils { |
| return [sb.toString(), args.values.toList(growable: false)]; |
| } |
| - static String _getShortSymbolName(Symbol symbol, |
| - DeclarationMirror declaration) { |
| + static String _getShortSymbolName( |
| + Symbol symbol, DeclarationMirror declaration) { |
| var name = MirrorSystem.getName(symbol); |
| if (declaration is MethodMirror) { |
| - if (declaration.isSetter && name[name.length-1] == "=") { |
| - return name.substring(0, name.length-1); |
| + if (declaration.isSetter && name[name.length - 1] == "=") { |
| + return name.substring(0, name.length - 1); |
| } |
| if (declaration.isConstructor) { |
| return name.substring(name.indexOf('.') + 1); |
| @@ -345,6 +533,38 @@ class _Utils { |
| } |
| /** |
| + * Handle special console commands such as $lib and $libs that should not be |
|
Alan Knight
2016/04/06 20:07:27
It says $lib here, but library below. Or are these
|
| + * evaluated as Dart expressions and instead should be interpreted directly. |
| + * Commands supported: |
| + * library <-- shows the current library and lists all libraries. |
| + * library "library_uri" <-- select a specific library |
| + * library "library_uri_fragment" |
| + */ |
| + static bool maybeHandleSpecialConsoleCommand(String expression) { |
| + expression = expression.trim(); |
| + var setLibraryCommand = r'library '; |
|
Alan Knight
2016/04/06 20:07:27
Why the r'?
|
| + if (expression == r'library') { |
| + _LibraryManager.setLibrary(); |
| + return true; |
| + } |
| + if (expression.startsWith(setLibraryCommand)) { |
| + expression = expression.substring(setLibraryCommand.length); |
| + if (expression.length >= 2) { |
| + String start = expression[0]; |
| + String end = expression[expression.length - 1]; |
| + // TODO(jacobr): maybe we should require quotes. |
| + if ((start == "'" && end == "'") || (start == '"' && end == '"')) { |
| + expression = expression.substring(1, expression.length - 1); |
| + } |
| + } |
| + |
| + _LibraryManager.setLibrary(expression); |
| + return true; |
| + } |
| + return false; |
| + } |
| + |
| + /** |
| * Returns a list of completions to use if the receiver is o. |
| */ |
| static List<String> getCompletions(o) { |
| @@ -354,19 +574,17 @@ class _Utils { |
| map.forEach((symbol, mirror) { |
| if (mirror.isStatic == isStatic && !mirror.isPrivate) { |
| var name = MirrorSystem.getName(symbol); |
| - if (mirror is MethodMirror && mirror.isSetter) |
| - name = name.substring(0, name.length - 1); |
| + if (mirror is MethodMirror && mirror.isSetter) name = |
| + name.substring(0, name.length - 1); |
| completions.add(name); |
| } |
| }); |
| } |
| addForClass(ClassMirror mirror, bool isStatic) { |
| - if (mirror == null) |
| - return; |
| + if (mirror == null) return; |
| addAll(mirror.declarations, isStatic); |
| - if (mirror.superclass != null) |
| - addForClass(mirror.superclass, isStatic); |
| + if (mirror.superclass != null) addForClass(mirror.superclass, isStatic); |
| for (var interface in mirror.superinterfaces) { |
| addForClass(interface, isStatic); |
| } |
| @@ -384,8 +602,8 @@ class _Utils { |
| * Adds all candidate String completitions from [declarations] to [output] |
| * filtering based on [staticContext] and [includePrivate]. |
| */ |
| - static void _getCompletionsHelper(ClassMirror classMirror, |
| - bool staticContext, LibraryMirror libraryMirror, Set<String> output) { |
| + static void _getCompletionsHelper(ClassMirror classMirror, bool staticContext, |
| + LibraryMirror libraryMirror, Set<String> output) { |
| bool includePrivate = libraryMirror == classMirror.owner; |
| classMirror.declarations.forEach((symbol, declaration) { |
| if (!includePrivate && declaration.isPrivate) return; |
| @@ -408,12 +626,11 @@ class _Utils { |
| if (!staticContext) { |
| for (var interface in classMirror.superinterfaces) { |
| - _getCompletionsHelper(interface, staticContext, |
| - libraryMirror, output); |
| + _getCompletionsHelper(interface, staticContext, libraryMirror, output); |
| } |
| if (classMirror.superclass != null) { |
| - _getCompletionsHelper(classMirror.superclass, staticContext, |
| - libraryMirror, output); |
| + _getCompletionsHelper( |
| + classMirror.superclass, staticContext, libraryMirror, output); |
| } |
| } |
| } |
| @@ -480,13 +697,13 @@ class _Utils { |
| } |
| static final SIDE_EFFECT_FREE_LIBRARIES = new Set<String>() |
| - ..add('dart:html') |
| - ..add('dart:indexed_db') |
| - ..add('dart:svg') |
| - ..add('dart:typed_data') |
| - ..add('dart:web_audio') |
| - ..add('dart:web_gl') |
| - ..add('dart:web_sql'); |
| + ..add('dart:html') |
| + ..add('dart:indexed_db') |
| + ..add('dart:svg') |
| + ..add('dart:typed_data') |
| + ..add('dart:web_audio') |
| + ..add('dart:web_gl') |
| + ..add('dart:web_sql'); |
| static LibraryMirror _getLibrary(MethodMirror methodMirror) { |
| var owner = methodMirror.owner; |
| @@ -505,8 +722,8 @@ class _Utils { |
| * In the future we should consider adding an annotation to tag getters |
| * in user libraries as side effect free. |
| */ |
| - static bool _isSideEffectFreeGetter(MethodMirror methodMirror, |
| - LibraryMirror libraryMirror) { |
| + static bool _isSideEffectFreeGetter( |
| + MethodMirror methodMirror, LibraryMirror libraryMirror) { |
| // This matches JavaScript behavior. We should consider displaying |
| // getters for all dart platform libraries rather than just the DOM |
| // libraries. |
| @@ -518,11 +735,11 @@ class _Utils { |
| * Whether we should treat a property as a field for the purposes of the |
| * debugger. |
| */ |
| - static bool treatPropertyAsField(MethodMirror methodMirror, |
| - LibraryMirror libraryMirror) { |
| + static bool treatPropertyAsField( |
| + MethodMirror methodMirror, LibraryMirror libraryMirror) { |
| return (methodMirror.isGetter || methodMirror.isSetter) && |
| - (methodMirror.isSynthetic || |
| - _isSideEffectFreeGetter(methodMirror,libraryMirror)); |
| + (methodMirror.isSynthetic || |
| + _isSideEffectFreeGetter(methodMirror, libraryMirror)); |
| } |
| // TODO(jacobr): generate more concise function descriptions instead of |
| @@ -539,27 +756,36 @@ class _Utils { |
| static List getInvocationTrampolineDetails(_Trampoline method) { |
| var loc = method._methodMirror.location; |
| - return [loc.line, loc.column, loc.sourceUri.toString(), |
| - MirrorSystem.getName(method._selector)]; |
| + return [ |
| + loc.line, |
| + loc.column, |
| + loc.sourceUri.toString(), |
| + MirrorSystem.getName(method._selector) |
| + ]; |
| } |
| - static List getLibraryProperties(String libraryUrl, bool ownProperties, |
| - bool accessorPropertiesOnly) { |
| + static List getLibraryProperties( |
| + String libraryUrl, bool ownProperties, bool accessorPropertiesOnly) { |
| var properties = new Map<String, _Property>(); |
| var libraryMirror = getLibraryMirror(libraryUrl); |
| - _addInstanceMirrors(libraryMirror, libraryMirror, |
| + _addInstanceMirrors( |
| + libraryMirror, |
| + libraryMirror, |
| libraryMirror.declarations, |
| - ownProperties, accessorPropertiesOnly, false, false, |
| + ownProperties, |
| + accessorPropertiesOnly, |
| + false, |
| + false, |
| properties); |
| if (!accessorPropertiesOnly) { |
| // We need to add class properties for all classes in the library. |
| libraryMirror.declarations.forEach((symbol, declarationMirror) { |
| if (declarationMirror is ClassMirror) { |
| var name = MirrorSystem.getName(symbol); |
| - if (declarationMirror.hasReflectedType |
| - && !properties.containsKey(name)) { |
| + if (declarationMirror.hasReflectedType && |
| + !properties.containsKey(name)) { |
| properties[name] = new _Property(name) |
| - ..value = declarationMirror.reflectedType; |
| + ..value = declarationMirror.reflectedType; |
| } |
| } |
| }); |
| @@ -567,34 +793,44 @@ class _Utils { |
| return packageProperties(properties); |
| } |
| - static List getObjectProperties(o, bool ownProperties, |
| - bool accessorPropertiesOnly) { |
| + static List getObjectProperties( |
| + o, bool ownProperties, bool accessorPropertiesOnly) { |
| var properties = new Map<String, _Property>(); |
| var names = new Set<String>(); |
| var objectMirror = reflect(o); |
| var classMirror = objectMirror.type; |
| - _addInstanceMirrors(objectMirror, classMirror.owner, |
| + _addInstanceMirrors( |
| + objectMirror, |
| + classMirror.owner, |
| classMirror.instanceMembers, |
| - ownProperties, accessorPropertiesOnly, false, true, |
| + ownProperties, |
| + accessorPropertiesOnly, |
| + false, |
| + true, |
| properties); |
| return packageProperties(properties); |
| } |
| - static List getObjectClassProperties(o, bool ownProperties, |
| - bool accessorPropertiesOnly) { |
| + static List getObjectClassProperties( |
| + o, bool ownProperties, bool accessorPropertiesOnly) { |
| var properties = new Map<String, _Property>(); |
| var objectMirror = reflect(o); |
| var classMirror = objectMirror.type; |
| - _addInstanceMirrors(objectMirror, classMirror.owner, |
| + _addInstanceMirrors( |
| + objectMirror, |
| + classMirror.owner, |
| classMirror.instanceMembers, |
| - ownProperties, accessorPropertiesOnly, true, false, |
| + ownProperties, |
| + accessorPropertiesOnly, |
| + true, |
| + false, |
| properties); |
| _addStatics(classMirror, properties, accessorPropertiesOnly); |
| return packageProperties(properties); |
| } |
| - static List getClassProperties(Type t, bool ownProperties, |
| - bool accessorPropertiesOnly) { |
| + static List getClassProperties( |
| + Type t, bool ownProperties, bool accessorPropertiesOnly) { |
| var properties = new Map<String, _Property>(); |
| var classMirror = reflectClass(t); |
| _addStatics(classMirror, properties, accessorPropertiesOnly); |
| @@ -602,8 +838,7 @@ class _Utils { |
| } |
| static void _addStatics(ClassMirror classMirror, |
| - Map<String, _Property> properties, |
| - bool accessorPropertiesOnly) { |
| + Map<String, _Property> properties, bool accessorPropertiesOnly) { |
| var libraryMirror = classMirror.owner; |
| classMirror.declarations.forEach((symbol, declaration) { |
| var name = _getShortSymbolName(symbol, declaration); |
| @@ -612,8 +847,8 @@ class _Utils { |
| if (accessorPropertiesOnly) return; |
| if (!declaration.isStatic) return; |
| properties.putIfAbsent(name, () => new _Property(name)) |
| - ..value = classMirror.getField(symbol).reflectee |
| - ..writable = !declaration.isFinal && !declaration.isConst; |
| + ..value = classMirror.getField(symbol).reflectee |
| + ..writable = !declaration.isFinal && !declaration.isConst; |
| } else if (declaration is MethodMirror) { |
| MethodMirror methodMirror = declaration; |
| // FIXMEDART: should we display constructors? |
| @@ -635,31 +870,35 @@ class _Utils { |
| }); |
| } |
| - static void _fillMethodMirrorProperty(LibraryMirror libraryMirror, |
| - methodOwner, MethodMirror methodMirror, Symbol symbol, |
| - bool accessorPropertiesOnly, _Property property) { |
| + static void _fillMethodMirrorProperty( |
| + LibraryMirror libraryMirror, |
| + methodOwner, |
| + MethodMirror methodMirror, |
| + Symbol symbol, |
| + bool accessorPropertiesOnly, |
| + _Property property) { |
| if (methodMirror.isRegularMethod) { |
| property |
| - ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol) |
| - ..isMethod = true; |
| + ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol) |
| + ..isMethod = true; |
| } else if (methodMirror.isGetter) { |
| if (treatPropertyAsField(methodMirror, libraryMirror)) { |
| try { |
| property.value = methodOwner.getField(symbol).reflectee; |
| } catch (e) { |
| property |
| - ..wasThrown = true |
| - ..value = e; |
| + ..wasThrown = true |
| + ..value = e; |
| } |
| } else if (accessorPropertiesOnly) { |
| - property.getter = new _GetterTrampoline(methodOwner, |
| - methodMirror, symbol); |
| + property.getter = |
| + new _GetterTrampoline(methodOwner, methodMirror, symbol); |
| } |
| } else if (methodMirror.isSetter) { |
| if (accessorPropertiesOnly && |
| !treatPropertyAsField(methodMirror, libraryMirror)) { |
| - property.setter = new _SetterTrampoline(methodOwner, |
| - methodMirror, MirrorSystem.getSymbol(property.name, libraryMirror)); |
| + property.setter = new _SetterTrampoline(methodOwner, methodMirror, |
| + MirrorSystem.getSymbol(property.name, libraryMirror)); |
| } |
| property.writable = true; |
| } |
| @@ -679,8 +918,10 @@ class _Utils { |
| ObjectMirror objectMirror, |
| LibraryMirror libraryMirror, |
| Map<Symbol, Mirror> declarations, |
| - bool ownProperties, bool accessorPropertiesOnly, |
| - bool hideFields, bool hideMethods, |
| + bool ownProperties, |
| + bool accessorPropertiesOnly, |
| + bool hideFields, |
| + bool hideMethods, |
| Map<String, _Property> properties) { |
| declarations.forEach((symbol, declaration) { |
| if (declaration is TypedefMirror || declaration is ClassMirror) return; |
| @@ -691,7 +932,8 @@ class _Utils { |
| treatPropertyAsField(declaration, libraryMirror)); |
| if ((isField && hideFields) || (hideMethods && !isField)) return; |
| if (accessorPropertiesOnly) { |
| - if (declaration is VariableMirror || declaration.isRegularMethod || |
| + if (declaration is VariableMirror || |
| + declaration.isRegularMethod || |
| isField) { |
| return; |
| } |
| @@ -703,8 +945,8 @@ class _Utils { |
| var property = properties.putIfAbsent(name, () => new _Property(name)); |
| if (declaration is VariableMirror) { |
| property |
| - ..value = objectMirror.getField(symbol).reflectee |
| - ..writable = !declaration.isFinal && !declaration.isConst; |
| + ..value = objectMirror.getField(symbol).reflectee |
| + ..writable = !declaration.isFinal && !declaration.isConst; |
| return; |
| } |
| _fillMethodMirrorProperty(libraryMirror, objectMirror, declaration, |
| @@ -719,15 +961,17 @@ class _Utils { |
| static List packageProperties(Map<String, _Property> properties) { |
| var ret = []; |
| for (var property in properties.values) { |
| - ret.addAll([property.name, |
| - property.setter, |
| - property.getter, |
| - property.value, |
| - property.hasValue, |
| - property.writable, |
| - property.isMethod, |
| - property.isOwn, |
| - property.wasThrown]); |
| + ret.addAll([ |
| + property.name, |
| + property.setter, |
| + property.getter, |
| + property.value, |
| + property.hasValue, |
| + property.writable, |
| + property.isMethod, |
| + property.isOwn, |
| + property.wasThrown |
| + ]); |
| } |
| return ret; |
| } |
| @@ -746,9 +990,10 @@ class _Utils { |
| LibraryMirror library = classMirror.owner; |
| if (!attemptedLibraries.contains(library)) { |
| try { |
| - return objectMirror.getField( |
| - MirrorSystem.getSymbol(propertyName, library)).reflectee; |
| - } catch (e) { } |
| + return objectMirror |
| + .getField(MirrorSystem.getSymbol(propertyName, library)) |
| + .reflectee; |
| + } catch (e) {} |
| attemptedLibraries.add(library); |
| } |
| classMirror = classMirror.superclass; |
| @@ -756,8 +1001,9 @@ class _Utils { |
| return null; |
| } |
| try { |
| - return objectMirror.getField( |
| - MirrorSystem.getSymbol(propertyName)).reflectee; |
| + return objectMirror |
| + .getField(MirrorSystem.getSymbol(propertyName)) |
| + .reflectee; |
| } catch (e) { |
| return null; |
| } |
| @@ -769,25 +1015,25 @@ class _Utils { |
| */ |
| static List consoleApi(host) { |
| return [ |
| - "inspect", |
| - (o) { |
| - js.JsNative.callMethod(host, "_inspect", [o]); |
| - return o; |
| - }, |
| - "dir", |
| - window.console.dir, |
| - "dirxml", |
| - window.console.dirxml |
| - // FIXME: add copy method. |
| - ]; |
| + "inspect", |
| + (o) { |
| + js.JsNative.callMethod(host, "_inspect", [o]); |
| + return o; |
| + }, |
| + "dir", |
| + window.console.dir, |
| + "dirxml", |
| + window.console.dirxml |
| + // FIXME: add copy method. |
| + ]; |
| } |
| static List getMapKeyList(Map map) => map.keys.toList(); |
| static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError; |
| - static void register(Document document, String tag, Type type, |
| - String extendsTagName) { |
| + static void register( |
| + Document document, String tag, Type type, String extendsTagName) { |
| var nativeClass = _validateCustomType(type); |
| if (extendsTagName == null) { |
| @@ -801,7 +1047,8 @@ class _Utils { |
| } |
| static void _register(Document document, String tag, Type customType, |
| - String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName); |
| + String extendsTagName) => |
| + _blink.Blink_Utils.register(document, tag, customType, extendsTagName); |
| static Element createElement(Document document, String tagName) => |
| _blink.Blink_Utils.createElement(document, tagName); |
| @@ -810,16 +1057,16 @@ class _Utils { |
| // TODO(jacobr): this seems busted. I believe we are actually |
| // giving users real windows for opener, parent, top, etc. |
| // Or worse, we are probaly returning a raw JSObject. |
| -class _DOMWindowCrossFrame extends DartHtmlDomObject implements |
| - WindowBase { |
| - |
| +class _DOMWindowCrossFrame extends DartHtmlDomObject implements WindowBase { |
| _DOMWindowCrossFrame.internal(); |
| - |
| - static _createSafe(win) => _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame); |
| + |
| + static _createSafe(win) => |
| + _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame); |
| // Fields. |
| HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this); |
| - LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this); |
| + LocationBase get location => |
| + _blink.Blink_DOMWindowCrossFrame.get_location(this); |
| bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this); |
| WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this); |
| WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this); |
| @@ -827,35 +1074,43 @@ class _DOMWindowCrossFrame extends DartHtmlDomObject implements |
| // Methods. |
| void close() => _blink.Blink_DOMWindowCrossFrame.close(this); |
| - void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) => |
| - _blink.Blink_DOMWindowCrossFrame.postMessage(this, |
| - convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts); |
| + void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, |
| + [List messagePorts]) => |
| + _blink.Blink_DOMWindowCrossFrame.postMessage( |
| + this, |
| + convertDartToNative_SerializedScriptValue(message), |
| + targetOrigin, |
| + messagePorts); |
| // Implementation support. |
| String get typeName => "Window"; |
| // TODO(efortuna): Remove this method. dartbug.com/16814 |
| Events get on => throw new UnsupportedError( |
| - 'You can only attach EventListeners to your own window.'); |
| + 'You can only attach EventListeners to your own window.'); |
| // TODO(efortuna): Remove this method. dartbug.com/16814 |
| - void _addEventListener([String type, EventListener listener, bool useCapture]) |
| - => throw new UnsupportedError( |
| - 'You can only attach EventListeners to your own window.'); |
| + void _addEventListener( |
| + [String type, EventListener listener, bool useCapture]) => |
| + throw new UnsupportedError( |
| + 'You can only attach EventListeners to your own window.'); |
| // TODO(efortuna): Remove this method. dartbug.com/16814 |
| - void addEventListener(String type, EventListener listener, [bool useCapture]) |
| - => throw new UnsupportedError( |
| - 'You can only attach EventListeners to your own window.'); |
| + void addEventListener(String type, EventListener listener, |
| + [bool useCapture]) => |
| + throw new UnsupportedError( |
| + 'You can only attach EventListeners to your own window.'); |
| // TODO(efortuna): Remove this method. dartbug.com/16814 |
| bool dispatchEvent(Event event) => throw new UnsupportedError( |
| - 'You can only attach EventListeners to your own window.'); |
| + 'You can only attach EventListeners to your own window.'); |
| // TODO(efortuna): Remove this method. dartbug.com/16814 |
| - void _removeEventListener([String type, EventListener listener, |
| - bool useCapture]) => throw new UnsupportedError( |
| - 'You can only attach EventListeners to your own window.'); |
| + void _removeEventListener( |
| + [String type, EventListener listener, bool useCapture]) => |
| + throw new UnsupportedError( |
| + 'You can only attach EventListeners to your own window.'); |
| // TODO(efortuna): Remove this method. dartbug.com/16814 |
| void removeEventListener(String type, EventListener listener, |
| - [bool useCapture]) => throw new UnsupportedError( |
| - 'You can only attach EventListeners to your own window.'); |
| + [bool useCapture]) => |
| + throw new UnsupportedError( |
| + 'You can only attach EventListeners to your own window.'); |
| } |
| class _HistoryCrossFrame extends DartHtmlDomObject implements HistoryBase { |
| @@ -897,8 +1152,9 @@ _makeSendPortFuture(spawnRequest) { |
| return completer.future; |
| } |
| -Future<SendPort> _spawnDomHelper(Function f) => |
| - _makeSendPortFuture((portId) { _Utils.spawnDomHelper(f, portId); }); |
| +Future<SendPort> _spawnDomHelper(Function f) => _makeSendPortFuture((portId) { |
| + _Utils.spawnDomHelper(f, portId); |
| + }); |
| final Future<SendPort> __HELPER_ISOLATE_PORT = |
| _spawnDomHelper(_helperIsolateMain); |
| @@ -940,10 +1196,15 @@ _helperIsolateMain(originalSendPort) { |
| if (cmd == _NEW_TIMER) { |
| final duration = new Duration(milliseconds: msg[1]); |
| bool periodic = msg[2]; |
| - ping() { replyTo.send(_TIMER_PING); }; |
| - _TIMER_REGISTRY[replyTo] = periodic ? |
| - new Timer.periodic(duration, (_) { ping(); }) : |
| - new Timer(duration, ping); |
| + ping() { |
| + replyTo.send(_TIMER_PING); |
| + } |
| + ; |
| + _TIMER_REGISTRY[replyTo] = periodic |
| + ? new Timer.periodic(duration, (_) { |
| + ping(); |
| + }) |
| + : new Timer(duration, ping); |
| } else if (cmd == _CANCEL_TIMER) { |
| _TIMER_REGISTRY.remove(replyTo).cancel(); |
| } else if (cmd == _PRINT) { |
| @@ -956,7 +1217,7 @@ _helperIsolateMain(originalSendPort) { |
| final _printClosure = (s) => window.console.log(s); |
| final _pureIsolatePrintClosure = (s) { |
| - _sendToHelperIsolate([_PRINT, s], null); |
| + _sendToHelperIsolate([_PRINT, s], null); |
| }; |
| final _forwardingPrintClosure = _Utils.forwardingPrint; |
| @@ -965,7 +1226,7 @@ final _uriBaseClosure = () => Uri.parse(window.location.href); |
| final _pureIsolateUriBaseClosure = () { |
| throw new UnimplementedError("Uri.base on a background isolate " |
| - "is not supported in the browser"); |
| + "is not supported in the browser"); |
| }; |
| class _Timer implements Timer { |
| @@ -976,13 +1237,17 @@ class _Timer implements Timer { |
| _Timer(int milliSeconds, void callback(Timer timer), bool repeating) { |
| if (repeating) { |
| _state = (window._setInterval(() { |
| - callback(this); |
| - }, milliSeconds) << 1) | _STATE_INTERVAL; |
| + callback(this); |
| + }, milliSeconds) << |
| + 1) | |
| + _STATE_INTERVAL; |
| } else { |
| _state = (window._setTimeout(() { |
| - _state = null; |
| - callback(this); |
| - }, milliSeconds) << 1) | _STATE_TIMEOUT; |
| + _state = null; |
| + callback(this); |
| + }, milliSeconds) << |
| + 1) | |
| + _STATE_TIMEOUT; |
| } |
| } |
| @@ -1002,8 +1267,8 @@ class _Timer implements Timer { |
| get _timerFactoryClosure => |
| (int milliSeconds, void callback(Timer timer), bool repeating) { |
| - return new _Timer(milliSeconds, callback, repeating); |
| -}; |
| + return new _Timer(milliSeconds, callback, repeating); |
| + }; |
| class _PureIsolateTimer implements Timer { |
| bool _isActive = true; |
| @@ -1043,7 +1308,7 @@ class _PureIsolateTimer implements Timer { |
| get _pureIsolateTimerFactoryClosure => |
| ((int milliSeconds, void callback(Timer time), bool repeating) => |
| - new _PureIsolateTimer(milliSeconds, callback, repeating)); |
| + new _PureIsolateTimer(milliSeconds, callback, repeating)); |
| class _ScheduleImmediateHelper { |
| MutationObserver _observer; |
| @@ -1082,13 +1347,12 @@ final _ScheduleImmediateHelper _scheduleImmediateHelper = |
| new _ScheduleImmediateHelper(); |
| get _scheduleImmediateClosure => (void callback()) { |
| - _scheduleImmediateHelper._schedule(callback); |
| -}; |
| + _scheduleImmediateHelper._schedule(callback); |
| + }; |
| get _pureIsolateScheduleImmediateClosure => ((void callback()) => |
| - throw new UnimplementedError("scheduleMicrotask in background isolates " |
| - "are not supported in the browser")); |
| + throw new UnimplementedError("scheduleMicrotask in background isolates " |
| + "are not supported in the browser")); |
| // Class for unsupported native browser 'DOM' objects. |
| -class _UnsupportedBrowserObject extends DartHtmlDomObject { |
| -} |
| +class _UnsupportedBrowserObject extends DartHtmlDomObject {} |