Version 1.7.0-dev.4.1

svn merge -c 40683 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40690 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40692 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40693 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40695 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40701 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40788 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 40802 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@40806 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/stack_trace/CHANGELOG.md b/pkg/stack_trace/CHANGELOG.md
index bbb7eb5..2850cfc 100644
--- a/pkg/stack_trace/CHANGELOG.md
+++ b/pkg/stack_trace/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.1
+
+* Widen the SDK constraint to include 1.7.0-dev.4.0.
+
 ## 1.1.0
 
 * Unify the parsing of Safari and Firefox stack traces. This fixes an error in
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index cd798bf..4d9793d 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the major version is upgraded, you *must* update that version constraint
 # in pub to stay in sync with this.
-version: 1.1.0
+version: 1.1.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
@@ -19,4 +19,4 @@
 dev_dependencies:
   unittest: ">=0.9.0 <0.12.0"
 environment:
-  sdk: ">=1.7.0-edge.40308 <2.0.0"
+  sdk: ">=1.7.0-dev.4.0 <2.0.0"
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index 48675840..eb1c726 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -1080,6 +1080,8 @@
         '<(nss_directory)/nss/lib/util/pkcs11p.h',
         '<(nss_directory)/nss/lib/util/pkcs11t.h',
         '<(nss_directory)/nss/lib/util/pkcs11u.h',
+        '<(nss_directory)/nss/lib/util/pkcs1sig.c',
+        '<(nss_directory)/nss/lib/util/pkcs1sig.h',
         '<(nss_directory)/nss/lib/util/portreg.c',
         '<(nss_directory)/nss/lib/util/portreg.h',
         '<(nss_directory)/nss/lib/util/quickder.c',
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 23c1a48..5e77cb3 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -29,7 +29,7 @@
         staticPackages = [r"$pub", r"$sdk"]..addAll(
             graph.packages.keys.where(graph.isPackageStatic));
 
-  Future<Asset> getAsset(AssetId id) {
+  Future<Asset> getAsset(AssetId id) async {
     // "$pub" is a psuedo-package that allows pub's transformer-loading
     // infrastructure to share code with pub proper.
     if (id.package == r'$pub') {
@@ -38,19 +38,20 @@
       assert(components.first == 'lib');
       components[0] = 'dart';
       var file = assetPath(path.joinAll(components));
+      _assertExists(file, id);
 
       // Barback may not be in the package graph if there are no user-defined
       // transformers being used at all. The "$pub" sources are still provided,
       // but will never be loaded.
       if (!_graph.packages.containsKey("barback")) {
-        return new Future.value(new Asset.fromPath(id, file));
+        return new Asset.fromPath(id, file);
       }
 
       var versions = mapMap(_graph.packages,
           value: (_, package) => package.version);
       var contents = readTextFile(file);
       contents = preprocess(contents, versions, path.toUri(file));
-      return new Future.value(new Asset.fromString(id, contents));
+      return new Asset.fromString(id, contents);
     }
 
     // "$sdk" is a pseudo-package that provides access to the Dart library
@@ -66,12 +67,19 @@
       parts = parts.skip(1);
 
       var file = path.join(sdk.rootDirectory, path.joinAll(parts));
-      return new Future.value(new Asset.fromPath(id, file));
+      _assertExists(file, id);
+      return new Asset.fromPath(id, file);
     }
 
     var nativePath = path.fromUri(id.path);
     var file = _graph.packages[id.package].path(nativePath);
-    return new Future.value(new Asset.fromPath(id, file));
+    _assertExists(file, id);
+    return new Asset.fromPath(id, file);
+  }
+
+  /// Throw an [AssetNotFoundException] for [id] if [path] doesn't exist.
+  void _assertExists(String path, AssetId id) {
+    if (!fileExists(path)) throw new AssetNotFoundException(id);
   }
 
   Stream<AssetId> getAllAssetIds(String packageName) {
diff --git a/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart b/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart
index f3769ee..613d9cb 100644
--- a/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart
@@ -32,6 +32,30 @@
 }
 """;
 
+const HAS_INPUT_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class HasInputTransformer extends Transformer {
+  HasInputTransformer.asPlugin();
+
+  bool get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return Future.wait([
+      transform.hasInput(new AssetId("foo", "lib/foo.dart")),
+      transform.hasInput(new AssetId("foo", "lib/does/not/exist.dart"))
+    ]).then((results) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          "lib/foo.dart: \${results.first}, "
+              "lib/does/not/exist.dart: \${results.last}"));
+    });
+  }
+}
+""";
+
 main() {
   initConfig();
 
@@ -314,6 +338,44 @@
     pub.stdout.expect("Hello!");
     pub.shouldExit();
   });
+
+  // Regression test for issue 21087.
+  integration("hasInput works for static packages", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "void main() => print('Hello!');")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": "1.2.3"},
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", HAS_INPUT_TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    pubServe();
+    requestShouldSucceed("foo.txt",
+        "lib/foo.dart: true, lib/does/not/exist.dart: false");
+    endPubServe();
+  });
 }
 
 String replaceTransformer(String input, String output) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart
index ee505c2..77807e7 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart
@@ -18,31 +18,57 @@
           r"$pub",
           r"$sdk"]..addAll(graph.packages.keys.where(graph.isPackageStatic));
   Future<Asset> getAsset(AssetId id) {
-    if (id.package == r'$pub') {
-      var components = path.url.split(id.path);
-      assert(components.isNotEmpty);
-      assert(components.first == 'lib');
-      components[0] = 'dart';
-      var file = assetPath(path.joinAll(components));
-      if (!_graph.packages.containsKey("barback")) {
-        return new Future.value(new Asset.fromPath(id, file));
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          join1() {
+            var nativePath = path.fromUri(id.path);
+            var file = _graph.packages[id.package].path(nativePath);
+            _assertExists(file, id);
+            completer0.complete(new Asset.fromPath(id, file));
+          }
+          if (id.package == r'$sdk') {
+            var parts = path.split(path.fromUri(id.path));
+            assert(parts.isNotEmpty && parts[0] == 'lib');
+            parts = parts.skip(1);
+            var file = path.join(sdk.rootDirectory, path.joinAll(parts));
+            _assertExists(file, id);
+            completer0.complete(new Asset.fromPath(id, file));
+          } else {
+            join1();
+          }
+        }
+        if (id.package == r'$pub') {
+          var components = path.url.split(id.path);
+          assert(components.isNotEmpty);
+          assert(components.first == 'lib');
+          components[0] = 'dart';
+          var file = assetPath(path.joinAll(components));
+          _assertExists(file, id);
+          join2() {
+            var versions =
+                mapMap(_graph.packages, value: ((_, package) => package.version));
+            var contents = readTextFile(file);
+            contents = preprocess(contents, versions, path.toUri(file));
+            completer0.complete(new Asset.fromString(id, contents));
+          }
+          if (!_graph.packages.containsKey("barback")) {
+            completer0.complete(new Asset.fromPath(id, file));
+          } else {
+            join2();
+          }
+        } else {
+          join0();
+        }
+      } catch (e0) {
+        completer0.completeError(e0);
       }
-      var versions =
-          mapMap(_graph.packages, value: (_, package) => package.version);
-      var contents = readTextFile(file);
-      contents = preprocess(contents, versions, path.toUri(file));
-      return new Future.value(new Asset.fromString(id, contents));
-    }
-    if (id.package == r'$sdk') {
-      var parts = path.split(path.fromUri(id.path));
-      assert(parts.isNotEmpty && parts[0] == 'lib');
-      parts = parts.skip(1);
-      var file = path.join(sdk.rootDirectory, path.joinAll(parts));
-      return new Future.value(new Asset.fromPath(id, file));
-    }
-    var nativePath = path.fromUri(id.path);
-    var file = _graph.packages[id.package].path(nativePath);
-    return new Future.value(new Asset.fromPath(id, file));
+    });
+    return completer0.future;
+  }
+  void _assertExists(String path, AssetId id) {
+    if (!fileExists(path)) throw new AssetNotFoundException(id);
   }
   Stream<AssetId> getAllAssetIds(String packageName) {
     if (packageName == r'$pub') {
diff --git a/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart b/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart
index 6a05685..7661ff6 100644
--- a/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart
@@ -24,6 +24,29 @@
   }
 }
 """;
+const HAS_INPUT_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class HasInputTransformer extends Transformer {
+  HasInputTransformer.asPlugin();
+
+  bool get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return Future.wait([
+      transform.hasInput(new AssetId("foo", "lib/foo.dart")),
+      transform.hasInput(new AssetId("foo", "lib/does/not/exist.dart"))
+    ]).then((results) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          "lib/foo.dart: \${results.first}, "
+            "lib/does/not/exist.dart: \${results.last}"));
+    });
+  }
+}
+""";
 main() {
   initConfig();
   integration("caches a transformed dependency", () {
@@ -278,6 +301,39 @@
     pub.stdout.expect("Hello!");
     pub.shouldExit();
   });
+  integration("hasInput works for static packages", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "void main() => print('Hello!');")])]);
+    });
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "1.2.3"
+        },
+        "transformers": ["myapp/src/transformer"]
+      }),
+          d.dir(
+              "lib",
+              [d.dir("src", [d.file("transformer.dart", HAS_INPUT_TRANSFORMER)])]),
+          d.dir("web", [d.file("foo.txt", "foo")])]).create();
+    pubGet(output: contains("Precompiled foo."));
+    pubServe();
+    requestShouldSucceed(
+        "foo.txt",
+        "lib/foo.dart: true, lib/does/not/exist.dart: false");
+    endPubServe();
+  });
 }
 String replaceTransformer(String input, String output) {
   return """
diff --git a/tools/VERSION b/tools/VERSION
index f40729c..8e6bf6c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 7
 PATCH 0
 PRERELEASE 4
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1