| Index: third_party/pkg/js/lib/js.dart
|
| diff --git a/third_party/pkg/js/lib/js.dart b/third_party/pkg/js/lib/js.dart
|
| deleted file mode 100644
|
| index 52b0eea19c540ba9029873716380153b40f03e61..0000000000000000000000000000000000000000
|
| --- a/third_party/pkg/js/lib/js.dart
|
| +++ /dev/null
|
| @@ -1,327 +0,0 @@
|
| -// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -/**
|
| - * The js.dart library provides simple JavaScript invocation from Dart that
|
| - * works on both Dartium and on other modern browsers via Dart2JS.
|
| - *
|
| - * It provides a model based on scoped [Proxy] objects. Proxies give Dart
|
| - * code access to JavaScript objects, fields, and functions as well as the
|
| - * ability to pass Dart objects and functions to JavaScript functions. Scopes
|
| - * enable developers to use proxies without memory leaks - a common challenge
|
| - * with cross-runtime interoperation.
|
| - *
|
| - * The top-level [context] getter provides a [Proxy] to the global JavaScript
|
| - * context for the page your Dart code is running on. In the following example:
|
| - *
|
| - * import 'package:js/js.dart' as js;
|
| - *
|
| - * void main() {
|
| - * js.context.alert('Hello from Dart via JavaScript');
|
| - * }
|
| - *
|
| - * js.context.alert creates a proxy to the top-level alert function in
|
| - * JavaScript. It is invoked from Dart as a regular function that forwards to
|
| - * the underlying JavaScript one. By default, proxies are released when
|
| - * the currently executing event completes, e.g., when main is completes
|
| - * in this example.
|
| - *
|
| - * The library also enables JavaScript proxies to Dart objects and functions.
|
| - * For example, the following Dart code:
|
| - *
|
| - * js.context.dartCallback = (x) => print(x*2);
|
| - *
|
| - * defines a top-level JavaScript function 'dartCallback' that is a proxy to
|
| - * the corresponding Dart function.
|
| - *
|
| - * Note, parameters and return values are intuitively passed by value for
|
| - * primitives and by reference for non-primitives. In the latter case, the
|
| - * references are automatically wrapped and unwrapped as proxies by the library.
|
| - *
|
| - * This library also allows construction of JavaScripts objects given a [Proxy]
|
| - * to a corresponding JavaScript constructor. For example, if the following
|
| - * JavaScript is loaded on the page:
|
| - *
|
| - * function Foo(x) {
|
| - * this.x = x;
|
| - * }
|
| - *
|
| - * Foo.prototype.add = function(other) {
|
| - * return new Foo(this.x + other.x);
|
| - * }
|
| - *
|
| - * then, the following Dart:
|
| - *
|
| - * var foo = new js.Proxy(js.context.Foo, 42);
|
| - * var foo2 = foo.add(foo);
|
| - * print(foo2.x);
|
| - *
|
| - * will construct a JavaScript Foo object with the parameter 42, invoke its
|
| - * add method, and return a [Proxy] to a new Foo object whose x field is 84.
|
| - *
|
| - * See [samples](http://dart-lang.github.com/js-interop/example) for more
|
| - * examples of usage.
|
| - *
|
| - * See this [article](http://www.dartlang.org/articles/js-dart-interop) for
|
| - * more detailed discussion.
|
| - */
|
| -
|
| -library js;
|
| -
|
| -import 'dart:js' as js;
|
| -import 'dart:mirrors';
|
| -
|
| -/**
|
| - * A proxy on the global JavaScript context for this page.
|
| - */
|
| -final Proxy context = new Proxy._(js.context);
|
| -
|
| -/**
|
| - * Check if [proxy] is instance of [type].
|
| - */
|
| -bool instanceof(Serializable<Proxy> proxy, Serializable<FunctionProxy> type) =>
|
| - proxy.toJs()._jsObject.instanceof(type.toJs()._jsObject);
|
| -
|
| -/**
|
| - * Check if [proxy] has a [name] property.
|
| - */
|
| -bool hasProperty(Serializable<Proxy> proxy, String name) =>
|
| - proxy.toJs()._jsObject.hasProperty(name);
|
| -
|
| -/**
|
| - * Delete the [name] property of [proxy].
|
| - */
|
| -void deleteProperty(Serializable<Proxy> proxy, String name) {
|
| - proxy.toJs()._jsObject.deleteProperty(name);
|
| -}
|
| -
|
| -/**
|
| - * Converts a Dart map [data] to a JavaScript map and return a [Proxy] to it.
|
| - */
|
| -Proxy map(Map data) => new Proxy._json(data);
|
| -
|
| -/**
|
| - * Converts a Dart [Iterable] to a JavaScript array and return a [Proxy] to it.
|
| - */
|
| -Proxy array(Iterable data) => new Proxy._json(data);
|
| -
|
| -// Detect unspecified arguments.
|
| -class _Undefined {
|
| - const _Undefined();
|
| -}
|
| -
|
| -const _undefined = const _Undefined();
|
| -
|
| -List _pruneUndefined(arg1, arg2, arg3, arg4, arg5, arg6) {
|
| - // This assumes no argument
|
| - final args = [arg1, arg2, arg3, arg4, arg5, arg6];
|
| - final index = args.indexOf(_undefined);
|
| - if (index < 0) return args;
|
| - return args.sublist(0, index);
|
| -}
|
| -
|
| -/**
|
| - * Proxies to JavaScript objects.
|
| - */
|
| -@proxy
|
| -class Proxy<T extends Proxy> implements Serializable<T> {
|
| - final js.JsObject _jsObject;
|
| -
|
| - Proxy._(this._jsObject);
|
| -
|
| - /**
|
| - * Constructs a [Proxy] that proxies a native Dart object; _for expert use
|
| - * only_.
|
| - *
|
| - * Use this constructor only if you wish to get access to JavaScript
|
| - * properties attached to a browser host object, such as a Node or Blob, that
|
| - * is normally automatically converted into a native Dart object.
|
| - *
|
| - * An exception will be thrown if [object] either is `null` or has the type
|
| - * `bool`, `num`, or `String`.
|
| - */
|
| - Proxy.fromBrowserObject(o) : this._(new js.JsObject.fromBrowserObject(o));
|
| -
|
| - /**
|
| - * Constructs a [Proxy] to a new JavaScript object by invoking a (proxy to a)
|
| - * JavaScript [constructor]. The arguments should be either
|
| - * primitive values, DOM elements, or Proxies.
|
| - */
|
| - factory Proxy(Serializable<FunctionProxy> constructor,
|
| - [arg1 = _undefined,
|
| - arg2 = _undefined,
|
| - arg3 = _undefined,
|
| - arg4 = _undefined,
|
| - arg5 = _undefined,
|
| - arg6 = _undefined]) {
|
| - var arguments = _pruneUndefined(arg1, arg2, arg3, arg4, arg5, arg6);
|
| - return new Proxy.withArgList(constructor, arguments);
|
| - }
|
| -
|
| - /**
|
| - * Constructs a [Proxy] to a new JavaScript object by invoking a (proxy to a)
|
| - * JavaScript [constructor]. The [arguments] list should contain either
|
| - * primitive values, DOM elements, or Proxies.
|
| - */
|
| - factory Proxy.withArgList(Serializable<FunctionProxy> constructor,
|
| - List arguments) => new Proxy._(new js.JsObject(
|
| - constructor.toJs()._jsObject, arguments.map(_serialize).toList()));
|
| -
|
| - /**
|
| - * Constructs a [Proxy] to a new JavaScript map or list created defined via
|
| - * Dart map or list.
|
| - */
|
| - factory Proxy._json(data) =>
|
| - new Proxy._(new js.JsObject.jsify(_serializeDataTree(data)));
|
| -
|
| - static _serializeDataTree(data) {
|
| - if (data is Map) {
|
| - final map = new Map();
|
| - for (var key in data.keys) {
|
| - map[key] = _serializeDataTree(data[key]);
|
| - }
|
| - return map;
|
| - } else if (data is Iterable) {
|
| - return data.map(_serializeDataTree).toList();
|
| - } else {
|
| - return _serialize(data);
|
| - }
|
| - }
|
| -
|
| - Proxy toJs() => this;
|
| -
|
| - // Resolve whether this is needed.
|
| - operator[](arg) => _deserialize(_jsObject[arg], thisArg: this);
|
| -
|
| - // Resolve whether this is needed.
|
| - operator[]=(key, value) => _jsObject[key] = _serialize(value);
|
| -
|
| - int get hashCode => _jsObject.hashCode;
|
| -
|
| - // Test if this is equivalent to another Proxy. This essentially
|
| - // maps to JavaScript's == operator.
|
| - operator==(other) => _jsObject == _serialize(other);
|
| -
|
| - String toString() => _jsObject.toString();
|
| -
|
| - // Forward member accesses to the backing JavaScript object.
|
| - noSuchMethod(Invocation invocation) {
|
| - String member = MirrorSystem.getName(invocation.memberName);
|
| - // If trying to access a JavaScript field/variable that starts with
|
| - // _ (underscore), Dart treats it a library private and member name
|
| - // it suffixed with '@internalLibraryIdentifier' which we have to
|
| - // strip before sending over to the JS side.
|
| - if (member.indexOf('@') != -1) {
|
| - member = member.substring(0, member.indexOf('@'));
|
| - }
|
| - if (invocation.isGetter) {
|
| - if (_jsObject.hasProperty(member)) {
|
| - return _deserialize(_jsObject[member], thisArg: this);
|
| - } else {
|
| - super.noSuchMethod(invocation);
|
| - }
|
| - } else if (invocation.isSetter) {
|
| - if (member.endsWith('=')) {
|
| - member = member.substring(0, member.length - 1);
|
| - }
|
| - _jsObject[member] = _serialize(invocation.positionalArguments[0]);
|
| - return null;
|
| - } else {
|
| - return _deserialize(_jsObject.callMethod(member,
|
| - invocation.positionalArguments.map(_serialize).toList()),
|
| - thisArg: this);
|
| - }
|
| - }
|
| -}
|
| -
|
| -class _CallbackFunction implements Function {
|
| - final Function f;
|
| - final bool withThis;
|
| -
|
| - _CallbackFunction(this.f, {this.withThis});
|
| -
|
| - call() => throw new StateError('There should always been at least 1 parameter'
|
| - '(js this).');
|
| -
|
| - noSuchMethod(Invocation invocation) {
|
| - final args = invocation.positionalArguments.skip(
|
| - withThis != null && withThis ? 0 : 1);
|
| - return _serialize(Function.apply(f,
|
| - args.map((e) => _deserialize(e)).toList()));
|
| - }
|
| -}
|
| -
|
| -/// A [Proxy] subtype to JavaScript functions.
|
| -class FunctionProxy extends Proxy<FunctionProxy> implements Function {
|
| - final js.JsFunction _jsFunction;
|
| - final _thisArg;
|
| -
|
| - FunctionProxy._(js.JsFunction jsFunction, {thisArg}) :
|
| - _jsFunction = jsFunction,
|
| - _thisArg = thisArg,
|
| - super._(jsFunction);
|
| -
|
| - factory FunctionProxy(Function f) => new FunctionProxy._(
|
| - new js.JsFunction.withThis(new _CallbackFunction(f)));
|
| -
|
| - factory FunctionProxy.withThis(Function f) => new FunctionProxy._(
|
| - new js.JsFunction.withThis(new _CallbackFunction(f, withThis: true)));
|
| -
|
| - // We need to implement call() to satisfy the Function "interface"
|
| - // This handles the no-arg case, noSuchMethod handles the rest.
|
| - call() => _deserialize(_jsFunction.apply([], thisArg: _serialize(_thisArg)),
|
| - thisArg: this);
|
| -
|
| - noSuchMethod(Invocation invocation) {
|
| - String member = MirrorSystem.getName(invocation.memberName);
|
| - // If trying to access a JavaScript field/variable that starts with
|
| - // _ (underscore), Dart treats it a library private and member name
|
| - // it suffixed with '@internalLibraryIdentifier' which we have to
|
| - // strip before sending over to the JS side.
|
| - if (member.indexOf('@') != -1) {
|
| - member = member.substring(0, member.indexOf('@'));
|
| - }
|
| - if (member == 'call') {
|
| - // A 'call' (probably) means that this proxy was invoked directly
|
| - // as if it was a function. Map this to JS function application.
|
| - return _deserialize(_jsFunction.apply(
|
| - invocation.positionalArguments.map(_serialize).toList(),
|
| - thisArg: _serialize(_thisArg)), thisArg: this);
|
| - }
|
| - return super.noSuchMethod(invocation);
|
| - }
|
| -}
|
| -
|
| -/// Marker class used to indicate it is serializable to js. If a class is a
|
| -/// [Serializable] the "toJs" method will be called and the result will be used
|
| -/// as value.
|
| -abstract class Serializable<T> {
|
| - T toJs();
|
| -}
|
| -
|
| -_serialize(var o) {
|
| - if (o == null) {
|
| - return null;
|
| - } else if (o is Proxy) {
|
| - return o._jsObject;
|
| - } else if (o is Serializable) {
|
| - return _serialize(o.toJs());
|
| - } else if (o is Function) {
|
| - return _serialize(new FunctionProxy(o));
|
| - } else {
|
| - return o;
|
| - }
|
| -}
|
| -
|
| -_deserialize(var o, {thisArg}) {
|
| - if (o == null) {
|
| - return null;
|
| - } else if (o is js.JsFunction) {
|
| - return new FunctionProxy._(o, thisArg: thisArg);
|
| - } else if (o is js.JsObject) {
|
| - return new Proxy._(o);
|
| - } else {
|
| - return o;
|
| - }
|
| -}
|
|
|