Version 1.14.0-dev.7.1

Cherry-pick a72ddf3a9d4eaa023e966cb39b52c4d78bb2186c to dev
Cherry-pick 82aeb1997ed6f9d84c117fb3f1636b5966ec2f62 to dev
Cherry-pick 9240052ebb59111bdcb58ed06b4a878347b8932f to dev
Cherry-pick 87c1bb4b39473fc59eb1cb6c04fc7c3fef8417ab to dev
Cherry-pick b508064e9e12bda7e454c24c326bc1601d382947 to dev
Cherry-pick ca1d105c5a110d356801a517d79550bff338a9bb to dev
Cherry-pick 0083cf8439be3d7c1aefbae4a541e63e1078e6c6 to dev
Cherry-pick 7b75f2dbb7642732f15ec3f810f91f8a6db3e4f6 to dev
Cherry-pick 28412d153e93c9421b1bfc6b304960d7de408169 to dev
Cherry-pick 04debc9c829cd5f7a34cdd03e7cd6682fa2e6cca to dev
Cherry-pick 6c2c928244450424e0f019c0e5ac5d85057684b5 to dev
Cherry-pick b2a186c2dd1b9407712382ac6e57396c7a57964b to dev
Cherry-pick a3e42b6f7b114e6600e0687872536a6be4caebf6 to dev
Cherry-pick 3dcef185d65c5bbe98162624ef4ddc49571702e2 to dev
Cherry-pick 4e35dd3b05ac9b05c9987d3b870b5e7ee10cb217 to dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 308dfa5..a3fffad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,8 +23,14 @@
     embedder for every generated random value.
 
 * `dart:io`
-  * `Platform` added an `isiOS` getter and `Platform.operatingSystem` may now
+  * `Platform` added an `isIOS` getter and `Platform.operatingSystem` may now
     return `ios`.
+  * Added support for WebSocket compression as standardized in RFC 7692. By
+    default compression is turned on for all WebSocket connections. The
+    optionally named parameter `compression` on the methods `WebSocket.connect`,
+    `WebSocket.fromUpgradedSocket`, and `WebSocketTransformer.upgrade` and on
+    the `WebSocketTransformer` constructor is used to select the compression
+    options.
 
 ### Tool changes
 
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 18694c0..e7a83a4 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -114,7 +114,7 @@
   String readAsStringSync() {
     try {
       io.File file = _entry as io.File;
-      return file.readAsStringSync();
+      return FileBasedSource.fileReadMode(file.readAsStringSync());
     } on io.FileSystemException catch (exception) {
       throw new FileSystemException(exception.path, exception.message);
     }
diff --git a/runtime/bin/platform_patch.dart b/runtime/bin/platform_patch.dart
index 50439c5..577bbb6 100644
--- a/runtime/bin/platform_patch.dart
+++ b/runtime/bin/platform_patch.dart
@@ -26,4 +26,19 @@
       => VMLibraryHooks.packageRootString;
   /* patch */ static String _packageConfig()
       => VMLibraryHooks.packageConfigString;
+
+  // This script singleton is written to by the embedder if applicable.
+  /* patch */ static void set _nativeScript(String path) {
+    if (path.startsWith('http:') ||
+        path.startsWith('https:') ||
+        path.startsWith('package:') ||
+        path.startsWith('dart:') ||
+        path.startsWith('data:') ||
+        path.startsWith('file:')) {
+      script = Uri.parse(path);
+    } else {
+      script = Uri.base.resolveUri(new Uri.file(path));
+    }
+    VMLibraryHooks.platformScript = script;
+  }
 }
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index bba7c38..3089830 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -28,6 +28,8 @@
   static var packageRootUriFuture;
   static var packageConfigUriFuture;
   static var resolvePackageUriFuture;
+
+  static var platformScript;
 }
 
 patch class CodeUnits {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index dd93fbe..773bac4 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -212,16 +212,17 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 9) {
+DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 10) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(1));
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(2));
-  GET_NON_NULL_NATIVE_ARGUMENT(Bool, paused, arguments->NativeArgAt(3));
-  GET_NATIVE_ARGUMENT(Bool, fatalErrors, arguments->NativeArgAt(4));
-  GET_NATIVE_ARGUMENT(SendPort, onExit, arguments->NativeArgAt(5));
-  GET_NATIVE_ARGUMENT(SendPort, onError, arguments->NativeArgAt(6));
-  GET_NATIVE_ARGUMENT(String, packageRoot, arguments->NativeArgAt(7));
-  GET_NATIVE_ARGUMENT(String, packageConfig, arguments->NativeArgAt(8));
+  GET_NON_NULL_NATIVE_ARGUMENT(String, script_uri, arguments->NativeArgAt(1));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(2));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(3));
+  GET_NON_NULL_NATIVE_ARGUMENT(Bool, paused, arguments->NativeArgAt(4));
+  GET_NATIVE_ARGUMENT(Bool, fatalErrors, arguments->NativeArgAt(5));
+  GET_NATIVE_ARGUMENT(SendPort, onExit, arguments->NativeArgAt(6));
+  GET_NATIVE_ARGUMENT(SendPort, onError, arguments->NativeArgAt(7));
+  GET_NATIVE_ARGUMENT(String, packageRoot, arguments->NativeArgAt(8));
+  GET_NATIVE_ARGUMENT(String, packageConfig, arguments->NativeArgAt(9));
 
   if (closure.IsClosure()) {
     Function& func = Function::Handle();
@@ -235,11 +236,6 @@
       // Get the parent function so that we get the right function name.
       func = func.parent_function();
 
-      // Get the script URI so that we know what script to load.
-      const Library& root_lib = Library::Handle(zone,
-          isolate->object_store()->root_library());
-      const String& script_uri = String::Handle(zone, root_lib.url());
-
       const char* utf8_package_root =
           packageRoot.IsNull() ? NULL : String2UTF8(packageRoot);
       const char* utf8_package_config =
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index de652ac..09ae531 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -300,7 +300,8 @@
 
   static bool _packageSupported() =>
       (VMLibraryHooks.packageRootUriFuture != null) &&
-      (VMLibraryHooks.packageConfigUriFuture != null);
+      (VMLibraryHooks.packageConfigUriFuture != null) &&
+      (VMLibraryHooks.resolvePackageUriFuture != null);
 
   /* patch */ static Future<Isolate> spawn(
       void entryPoint(message), var message,
@@ -318,7 +319,17 @@
         packageConfig = (await Isolate.packageConfig)?.toString();
       }
 
-      _spawnFunction(readyPort.sendPort, entryPoint, message,
+      var script = VMLibraryHooks.platformScript;
+      if (script == null) {
+        // We do not have enough information to support spawning the new
+        // isolate.
+        throw new UnsupportedError("Isolate.spawn");
+      }
+      if (script.scheme == "package") {
+        script = await Isolate.resolvePackageUri(script);
+      }
+
+      _spawnFunction(readyPort.sendPort, script.toString(), entryPoint, message,
                      paused, errorsAreFatal, onExit, onError,
                      packageRoot, packageConfig);
       return await _spawnCommon(readyPort);
@@ -365,7 +376,7 @@
       }
     }
     try {
-      // Resolve the uri agains the current isolate's root Uri first.
+      // Resolve the uri against the current isolate's root Uri first.
       var spawnedUri = _rootUri.resolveUri(uri);
 
       // Inherit this isolate's package resolution setup if not overridden.
@@ -378,6 +389,21 @@
         }
       }
 
+      // Ensure to resolve package: URIs being handed in as parameters.
+      if (packageRoot != null) {
+        // Avoid calling resolvePackageUri if not stricly necessary in case
+        // the API is not supported.
+        if (packageRoot.scheme == "package") {
+          packageRoot = await Isolate.resolvePackageUri(packageRoot);
+        }
+      } else if (packageConfig != null) {
+        // Avoid calling resolvePackageUri if not strictly necessary in case
+        // the API is not supported.
+        if (packageConfig.scheme == "package") {
+          packageConfig = await Isolate.resolvePackageUri(packageConfig);
+        }
+      }
+
       // The VM will invoke [_startIsolate] and not `main`.
       readyPort = new RawReceivePort();
       var packageRootString = packageRoot?.toString();
@@ -394,7 +420,7 @@
       if (readyPort != null) {
         readyPort.close();
       }
-      return await new Future<Isolate>.error(e, st);
+      rethrow;
     }
   }
 
@@ -436,7 +462,8 @@
   static const _ERROR_FATAL = 9;
 
 
-  static void _spawnFunction(SendPort readyPort, Function topLevelFunction,
+  static void _spawnFunction(SendPort readyPort, String uri,
+                             Function topLevelFunction,
                              var message, bool paused, bool errorsAreFatal,
                              SendPort onExit, SendPort onError,
                              String packageRoot, String packageConfig)
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 036f460..8803755 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -311,7 +311,7 @@
   V(Int32x4_setFlagZ, 2)                                                       \
   V(Int32x4_setFlagW, 2)                                                       \
   V(Int32x4_select, 3)                                                         \
-  V(Isolate_spawnFunction, 9)                                                  \
+  V(Isolate_spawnFunction, 10)                                                 \
   V(Isolate_spawnUri, 12)                                                      \
   V(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0)                         \
   V(Isolate_getCurrentRootUriStr, 0)                                           \
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index c1eb50c..abd8b65 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -275,12 +275,11 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
   const Register kInstanceReg = R0;
-  Error& malformed_error = Error::Handle(zone());
+  Error& bound_error = Error::Handle(zone());
   const Type& int_type = Type::Handle(zone(), Type::IntType());
-  const bool smi_is_ok =
-      int_type.IsSubtypeOf(type, &malformed_error, Heap::kOld);
+  const bool smi_is_ok = int_type.IsSubtypeOf(type, &bound_error, Heap::kOld);
   // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || malformed_error.IsNull());
+  ASSERT(smi_is_ok || bound_error.IsNull());
   __ tst(kInstanceReg, Operand(kSmiTagMask));
   if (smi_is_ok) {
     __ b(is_instance_lbl, EQ);
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index f21941f..359c89c 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -267,12 +267,11 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
   const Register kInstanceReg = R0;
-  Error& malformed_error = Error::Handle(zone());
+  Error& bound_error = Error::Handle(zone());
   const Type& int_type = Type::Handle(zone(), Type::IntType());
-  const bool smi_is_ok =
-      int_type.IsSubtypeOf(type, &malformed_error, Heap::kOld);
+  const bool smi_is_ok = int_type.IsSubtypeOf(type, &bound_error, Heap::kOld);
   // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || malformed_error.IsNull());
+  ASSERT(smi_is_ok || bound_error.IsNull());
   __ tsti(kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
     __ b(is_instance_lbl, EQ);
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index e3b0fcf..b2272fe9 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -279,12 +279,11 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
   const Register kInstanceReg = EAX;
-  Error& malformed_error = Error::Handle(zone());
+  Error& bound_error = Error::Handle(zone());
   const Type& int_type = Type::Handle(zone(), Type::IntType());
-  const bool smi_is_ok =
-      int_type.IsSubtypeOf(type, &malformed_error, Heap::kOld);
+  const bool smi_is_ok = int_type.IsSubtypeOf(type, &bound_error, Heap::kOld);
   // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || malformed_error.IsNull());
+  ASSERT(smi_is_ok || bound_error.IsNull());
   __ testl(kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
     __ j(ZERO, is_instance_lbl);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 83919f5..f98bb67 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -267,12 +267,11 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
   const Register kInstanceReg = A0;
-  Error& malformed_error = Error::Handle(zone());
+  Error& bound_error = Error::Handle(zone());
   const Type& int_type = Type::Handle(zone(), Type::IntType());
-  const bool smi_is_ok =
-      int_type.IsSubtypeOf(type, &malformed_error, Heap::kOld);
+  const bool smi_is_ok = int_type.IsSubtypeOf(type, &bound_error, Heap::kOld);
   // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || malformed_error.IsNull());
+  ASSERT(smi_is_ok || bound_error.IsNull());
   __ andi(CMPRES1, kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
     __ beq(CMPRES1, ZR, is_instance_lbl);
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 4a7c7ab..e54b1eb 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -276,12 +276,11 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
   const Register kInstanceReg = RAX;
-  Error& malformed_error = Error::Handle(zone());
+  Error& bound_error = Error::Handle(zone());
   const Type& int_type = Type::Handle(zone(), Type::IntType());
-  const bool smi_is_ok =
-      int_type.IsSubtypeOf(type, &malformed_error, Heap::kOld);
+  const bool smi_is_ok = int_type.IsSubtypeOf(type, &bound_error, Heap::kOld);
   // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || malformed_error.IsNull());
+  ASSERT(smi_is_ok || bound_error.IsNull());
   __ testq(kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
     __ j(ZERO, is_instance_lbl);
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 876a015..0a40848 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -3194,7 +3194,8 @@
   }
   virtual bool AttributesEqual(Instruction* other) const {
     IfThenElseInstr* other_if_then_else = other->AsIfThenElse();
-    return comparison()->AttributesEqual(other_if_then_else->comparison()) &&
+    return (comparison()->tag() == other_if_then_else->comparison()->tag()) &&
+           comparison()->AttributesEqual(other_if_then_else->comparison()) &&
            (if_true_ == other_if_then_else->if_true_) &&
            (if_false_ == other_if_then_else->if_false_);
   }
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 1caee52..4bf156d 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -77,8 +77,7 @@
   EXPECT_VALID(result);
   // Run until all ports to isolate are closed.
   result = Dart_RunLoop();
-  EXPECT_ERROR(result,
-               "Isolate spawn is not supported by this Dart implementation");
+  EXPECT_ERROR(result, "Unsupported operation: Isolate.spawn");
   EXPECT(Dart_ErrorHasException(result));
   Dart_Handle exception_result = Dart_ErrorGetException(result);
   EXPECT_VALID(exception_result);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 4e43f45..730d560 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3876,6 +3876,12 @@
       if (!interface.IsFinalized()) {
         // We may be checking bounds at finalization time and can encounter
         // a still unfinalized interface.
+        if (interface.IsBeingFinalized()) {
+          // Interface is part of a still unfinalized recursive type graph.
+          // Skip it. The caller will create a bounded type to be checked at
+          // runtime if this type test returns false at compile time.
+          continue;
+        }
         ClassFinalizer::FinalizeType(
             thsi, interface, ClassFinalizer::kCanonicalize);
         interfaces.SetAt(i, interface);
@@ -15513,8 +15519,8 @@
     } else if (bound.IsType()) {
       const Class& cls = Class::Handle(zone, Type::Cast(bound).type_class());
       bound_name = cls.Name();
+      pieces.Add(bound_name);
       if (Type::Cast(bound).arguments() != TypeArguments::null()) {
-        pieces.Add(bound_name);
         pieces.Add(Symbols::OptimizedOut());
       }
     } else {
@@ -15727,6 +15733,11 @@
     if (Equals(other)) {
       return true;
     }
+    // Redundant check if other type is equal to the upper bound of this type.
+    if (IsBoundedType() &&
+        AbstractType::Handle(BoundedType::Cast(*this).bound()).Equals(other)) {
+      return true;
+    }
     return false;  // TODO(regis): We should return "maybe after instantiation".
   }
   // Type parameters cannot be handled by Class::TypeTest().
@@ -16144,6 +16155,13 @@
     for (intptr_t i = 0; i < from_index; i++) {
       type_arg = type_args.TypeAt(i);
       other_type_arg = other_type_args.TypeAt(i);
+      // Ignore bounds of bounded types.
+      while (type_arg.IsBoundedType()) {
+        type_arg = BoundedType::Cast(type_arg).type();
+      }
+      while (other_type_arg.IsBoundedType()) {
+        other_type_arg = BoundedType::Cast(other_type_arg).type();
+      }
       ASSERT(type_arg.IsEquivalent(other_type_arg, trail));
     }
   }
@@ -16973,13 +16991,20 @@
       // Instantiated upper_bound may not be finalized. See comment above.
     }
     if (bound_error->IsNull()) {
-      if (!type_param.CheckBound(bounded_type, upper_bound, bound_error) &&
-          bound_error->IsNull()) {
+      if (bounded_type.IsBeingFinalized() ||
+          upper_bound.IsBeingFinalized() ||
+          (!type_param.CheckBound(bounded_type, upper_bound, bound_error) &&
+           bound_error->IsNull())) {
         // We cannot determine yet whether the bounded_type is below the
-        // upper_bound, because one or both of them is still uninstantiated.
-        ASSERT(!bounded_type.IsInstantiated() || !upper_bound.IsInstantiated());
-        // Postpone bound check by returning a new BoundedType with partially
-        // instantiated bounded_type and upper_bound, but keeping type_param.
+        // upper_bound, because one or both of them is still being finalized or
+        // uninstantiated.
+        ASSERT(bounded_type.IsBeingFinalized() ||
+               upper_bound.IsBeingFinalized() ||
+               !bounded_type.IsInstantiated() ||
+               !upper_bound.IsInstantiated());
+        // Postpone bound check by returning a new BoundedType with unfinalized
+        // or partially instantiated bounded_type and upper_bound, but keeping
+        // type_param.
         bounded_type = BoundedType::New(bounded_type, upper_bound, type_param);
       }
     }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 5d3c509..d67b06a 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5318,7 +5318,7 @@
   virtual bool IsRecursive() const;
   virtual RawAbstractType* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
-      Error* malformed_error,
+      Error* bound_error,
       TrailPtr trail = NULL,
       Heap::Space space = Heap::kNew) const;
   virtual RawAbstractType* CloneUnfinalized() const;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 981b84b..47cb001 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -12679,7 +12679,7 @@
         Array::New(element_list.length(), Heap::kOld));
     const_list.SetTypeArguments(
         TypeArguments::Handle(Z, list_type_arguments.Canonicalize()));
-    Error& malformed_error = Error::Handle(Z);
+    Error& bound_error = Error::Handle(Z);
     for (int i = 0; i < element_list.length(); i++) {
       AstNode* elem = element_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -12691,10 +12691,10 @@
            !elem->AsLiteralNode()->literal().IsInstanceOf(
                element_type,
                TypeArguments::Handle(Z),
-               &malformed_error))) {
-        // If the failure is due to a malformed type error, display it instead.
-        if (!malformed_error.IsNull()) {
-          ReportError(malformed_error);
+               &bound_error))) {
+        // If the failure is due to a bound error, display it instead.
+        if (!bound_error.IsNull()) {
+          ReportError(bound_error);
         } else {
           ReportError(elem->AsLiteralNode()->token_pos(),
                       "list literal element at index %d must be "
@@ -12905,7 +12905,7 @@
     Array& key_value_array =
         Array::ZoneHandle(Z, Array::New(kv_pairs_list.length(), Heap::kOld));
     AbstractType& arg_type = Type::Handle(Z);
-    Error& malformed_error = Error::Handle(Z);
+    Error& bound_error = Error::Handle(Z);
     for (int i = 0; i < kv_pairs_list.length(); i++) {
       AstNode* arg = kv_pairs_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -12924,10 +12924,10 @@
              !arg->AsLiteralNode()->literal().IsInstanceOf(
                  arg_type,
                  Object::null_type_arguments(),
-                 &malformed_error))) {
-          // If the failure is due to a malformed type error, display it.
-          if (!malformed_error.IsNull()) {
-            ReportError(malformed_error);
+                 &bound_error))) {
+          // If the failure is due to a bound error, display it.
+          if (!bound_error.IsNull()) {
+            ReportError(bound_error);
           } else {
             ReportError(arg->AsLiteralNode()->token_pos(),
                         "map literal %s at index %d must be "
@@ -13541,13 +13541,13 @@
     new_object = new(Z) LiteralNode(new_pos, const_instance);
     if (!type_bound.IsNull()) {
       ASSERT(!type_bound.IsMalformed());
-      Error& malformed_error = Error::Handle(Z);
+      Error& bound_error = Error::Handle(Z);
       ASSERT(!is_top_level_);  // We cannot check unresolved types.
       if (!const_instance.IsInstanceOf(type_bound,
                                        TypeArguments::Handle(Z),
-                                       &malformed_error)) {
+                                       &bound_error)) {
         type_bound = ClassFinalizer::NewFinalizedMalformedType(
-            malformed_error,
+            bound_error,
             script_,
             new_pos,
             "const factory result is not an instance of '%s'",
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 2e82f34..88d2b88 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -37865,6 +37865,7 @@
     'INPUT::align',
     'INPUT::alt',
     'INPUT::autocomplete',
+    'INPUT::autofocus',
     'INPUT::checked',
     'INPUT::disabled',
     'INPUT::inputmode',
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 6b85ade..3ef584b 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -45222,6 +45222,7 @@
     'INPUT::align',
     'INPUT::alt',
     'INPUT::autocomplete',
+    'INPUT::autofocus',
     'INPUT::checked',
     'INPUT::disabled',
     'INPUT::inputmode',
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index 7cd20a1..326597f 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -117,7 +117,7 @@
   /**
    * Returns true if the operating system is iOS.
    */
-  static final bool isiOS = (_operatingSystem == "ios");
+  static final bool isIOS = (_operatingSystem == "ios");
 
   /**
    * Get the environment for this process.
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index f4d7a24..d7e722f 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -46,20 +46,6 @@
   static String get operatingSystem => _operatingSystem();
   static Uri script;
 
-  // This script singleton is written to by the embedder if applicable.
-  static void set _nativeScript(String path) {
-    if (path.startsWith('http:') ||
-        path.startsWith('https:') ||
-        path.startsWith('package:') ||
-        path.startsWith('dart:') ||
-        path.startsWith('data:') ||
-        path.startsWith('file:')) {
-      script = Uri.parse(path);
-    } else {
-      script = Uri.base.resolveUri(new Uri.file(path));
-    }
-  }
-
   static String get localHostname {
     var result = _localHostname();
     if (result is OSError) {
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index edb5b6d..183714f 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -116,7 +116,14 @@
       info = "; client_max_window_bits=$size";
     } else {
       // Client request. Specify default
-      info = "; client_max_window_bits";
+      if (clientMaxWindowBits == null) {
+        info = "; client_max_window_bits";
+      } else {
+        info = "; client_max_window_bits=$clientMaxWindowBits";
+      }
+      if (serverMaxWindowBits != null) {
+        info += "; server_max_window_bits=$serverMaxWindowBits";
+      }
     }
 
     return info;
@@ -139,14 +146,14 @@
     info.headerValue = _WebSocketImpl.PER_MESSAGE_DEFLATE;
 
     if (clientNoContextTakeover &&
-        (requested != null &&
-            requested.parameters.containsKey(_clientNoContextTakeover))) {
+        (requested == null || (requested != null &&
+            requested.parameters.containsKey(_clientNoContextTakeover)))) {
       info.headerValue += "; client_no_context_takeover";
     }
 
     if (serverNoContextTakeover &&
-        (requested != null &&
-            requested.parameters.containsKey(_serverNoContextTakeover))) {
+        (requested == null || (requested != null &&
+            requested.parameters.containsKey(_serverNoContextTakeover)))) {
       info.headerValue += "; server_no_context_takeover";
     }
 
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 879d05e..2aa894c 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -133,13 +133,16 @@
             throw new WebSocketException("Protocol error");
           }
 
-          if ((byte & RSV1) != 0) {
-            _compressed = true;
-          } else {
-            _compressed = false;
-          }
           _opcode = (byte & OPCODE);
 
+          if (_opcode != _WebSocketOpcode.CONTINUATION) {
+            if ((byte & RSV1) != 0) {
+              _compressed = true;
+            } else {
+              _compressed = false;
+            }
+          }
+
           if (_opcode <= _WebSocketOpcode.BINARY) {
             if (_opcode == _WebSocketOpcode.CONTINUATION) {
               if (_currentMessageType == _WebSocketMessageType.NONE) {
@@ -478,9 +481,11 @@
 
       response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
       var serverNoContextTakeover =
-          hv.parameters.containsKey(_serverNoContextTakeover);
+          (hv.parameters.containsKey(_serverNoContextTakeover) &&
+            compression.serverNoContextTakeover);
       var clientNoContextTakeover =
-          hv.parameters.containsKey(_clientNoContextTakeover);
+          (hv.parameters.containsKey(_clientNoContextTakeover) &&
+            compression.clientNoContextTakeover);
       var deflate = new _WebSocketPerMessageDeflate(
           serverNoContextTakeover: serverNoContextTakeover,
           clientNoContextTakeover: clientNoContextTakeover,
@@ -567,28 +572,24 @@
     data.addAll(const [0x00, 0x00, 0xff, 0xff]);
 
     decoder.process(data, 0, data.length);
-    var reuse =
-        !(serverSide ? clientNoContextTakeover : serverNoContextTakeover);
     var result = [];
     var out;
 
-    while ((out = decoder.processed(flush: reuse)) != null) {
+    while ((out = decoder.processed()) != null) {
       result.addAll(out);
     }
 
-    decoder.processed(flush: reuse);
-
-    if (!reuse) {
+    if ((serverSide && clientNoContextTakeover) ||
+        (!serverSide && serverNoContextTakeover)) {
       decoder.end();
       decoder = null;
     }
+
     return new Uint8List.fromList(result);
   }
 
   List<int> processOutgoingMessage(List<int> msg) {
     _ensureEncoder();
-    var reuse =
-        !(serverSide ? serverNoContextTakeover : clientNoContextTakeover);
     var result = [];
     Uint8List buffer;
     var out;
@@ -607,11 +608,12 @@
 
     encoder.process(buffer, 0, buffer.length);
 
-    while ((out = encoder.processed(flush: reuse)) != null) {
+    while ((out = encoder.processed()) != null) {
       result.addAll(out);
     }
 
-    if (serverSide ? serverNoContextTakeover : clientNoContextTakeover) {
+    if ((!serverSide && clientNoContextTakeover) ||
+        (serverSide && serverNoContextTakeover)) {
       encoder.end();
       encoder = null;
     }
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index ad67b18..f97f79d 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -76,6 +76,7 @@
 Language/Expressions/Instance_Creation/Const/abstract_class_t01: Fail # Issue 22007
 Language/Expressions/Instance_Creation/Const/abstract_class_t03: Fail # Issue 22007
 Language/Expressions/Property_Extraction/Named_Constructor_Extraction/not_class_t01: RuntimeError # Please triage this failure.
+Language/Expressions/Spawning_an_Isolate/new_isolate_t01: RuntimeError, OK  # Uses Isolate.spawn.
 Language/Libraries_and_Scripts/Imports/namespace_changes_t10: RuntimeError # Please triage this failure.
 Language/Libraries_and_Scripts/Parts/compilation_t02: Skip # Please triage this failure.
 Language/Libraries_and_Scripts/Parts/syntax_t05: Skip # Times out flakily. Issue 20881
@@ -814,9 +815,72 @@
 LibTest/isolate/Isolate/spawnUri_A01_t05: RuntimeError # Dart issue 15974
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Dart issue 15974
 LibTest/isolate/Isolate/spawnUri_A02_t04: Skip # Dart issue 15974
-LibTest/isolate/Isolate/spawn_A01_t03: Skip # co19-roll r667: Please triage this failure
-LibTest/isolate/Isolate/spawn_A01_t04: Skip # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawn_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/Isolate/spawn_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/Isolate/spawn_A01_t05: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/Isolate/spawn_A01_t03: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/RawReceivePort/RawReceivePort_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/RawReceivePort/RawReceivePort_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/RawReceivePort/close_A01_t01: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
+LibTest/isolate/RawReceivePort/handler_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/RawReceivePort/sendPort_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/any_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/any_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t03: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t04: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/contains_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/distinct_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/distinct_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/drain_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/drain_A02_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/elementAt_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/elementAt_A03_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/every_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/expand_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/firstWhere_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/firstWhere_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/firstWhere_A03_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/first_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/first_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/first_A02_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/fold_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/fold_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/forEach_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/isEmpty_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/join_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/join_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/lastWhere_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/lastWhere_A04_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/last_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/last_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/length_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/listen_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/map_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/pipe_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/reduce_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/reduce_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/reduce_A01_t03: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/singleWhere_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/singleWhere_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/single_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/single_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/skipWhile_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/skip_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/takeWhile_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/take_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/take_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/take_A01_t03: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/toList_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/toSet_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/transform_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/transform_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/where_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/ReceivePort/where_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/ReceivePort/asBroadcastStream_A01_t02: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
 LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: RuntimeError # Issue 13921
 LibTest/isolate/ReceivePort/asBroadcastStream_A03_t01: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
@@ -825,7 +889,11 @@
 LibTest/isolate/ReceivePort/close_A01_t01: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
 LibTest/isolate/ReceivePort/close_A02_t01: Pass, RuntimeError # Issue 13921, co19 issue for false pass https://github.com/dart-lang/co19/issues/13
 LibTest/isolate/ReceivePort/sendPort_A01_t01: RuntimeError # Issue 13921
-LibTest/isolate/SendPort/send_A01_t04: RuntimeError # co19-roll r706.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t01: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/SendPort/send_A01_t02: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/SendPort/send_A01_t03: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/SendPort/send_A01_t04: RuntimeError, OK  # Uses Isolate.spawn.
+LibTest/isolate/SendPort/send_A02_t01: RuntimeError, OK  # Uses Isolate.spawn.
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t06: Fail # Issue 13921
diff --git a/tests/html/html.status b/tests/html/html.status
index cf4c69a..cf5e043 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -59,6 +59,8 @@
 # Dartium seems to lose the data from the dispatchEvent.
 keyboard_event_test: Fail # Issue 13902
 fileapi_test/getFile: Pass, Fail # Issue 20488
+async_test: RuntimeError, OK  # Uses Isolate.spawn.
+isolates_test: RuntimeError, OK  # Uses Isolate.spawn.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium ) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 5bfd88e..e11f91a 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -20,7 +20,7 @@
 
 message3_test/int32x4: Crash, Timeout # Issue 21818
 
-[ ($compiler == none || $compiler == precompiler) && $runtime == ContentShellOnAndroid ]
+[ ($compiler == none) && $runtime == ContentShellOnAndroid ]
 *: Skip # Isolate tests are timing out flakily on Android content_shell.  Issue 19795
 
 [ $compiler == dart2js && $runtime == safarimobilesim ]
@@ -81,26 +81,25 @@
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 unresolved_ports_test: Pass, Timeout # Issue 15610
 
-[ ($compiler == none || $compiler == precompiler) && $runtime == drt ]
+[ ($compiler == none) && $runtime == drt ]
 spawn_uri_nested_vm_test: Skip # Issue 14463
 
 [ $jscl ]
 spawn_uri_multi_test/none: RuntimeError # Issue 13544
 
-[ ($compiler == none || $compiler == precompiler) && $runtime == ContentShellOnAndroid ]
+[ ($compiler == none) && $runtime == ContentShellOnAndroid ]
 nested_spawn2_test: Skip # Issue 19127: This test is timing out.
 
-[ ($compiler == none || $compiler == precompiler) && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
+[ ($compiler == none) && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 spawn_uri_nested_vm_test: Skip # Issue 14479: This test is timing out.
 
-[ ($compiler == none || $compiler == precompiler) && $runtime == dartium && $arch == x64 ]
+[ ($compiler == none) && $runtime == dartium && $arch == x64 ]
 isolate/spawn_uri_multi_test/01: Skip # Times out. Issue 24795
 
-[ ($compiler == none || $compiler == precompiler) && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
+[ ($compiler == none) && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
 typed_message_test: Skip # Issue 13921, 14400
 isolate_stress_test: Skip # Issue 13921 Dom isolates don't support spawnFunction
 object_leak_test: Skip # Issue 13921 Dom isolates don't support spawnFunction
-simple_message_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 spawn_uri_missing_from_isolate_test: Skip # Issue 17649
 spawn_uri_missing_test: SkipSlow # Times out.
 kill3_test: Fail, OK  # 13921 Dom isolates don't support spawnFunction
@@ -115,6 +114,32 @@
 error_exit_at_spawnuri_test: SkipByDesign  # 13921 Dom isolates don't support spawnFunction
 error_at_spawnuri_test: SkipByDesign  # 13921 Dom isolates don't support spawnFunction
 exit_at_spawnuri_test: SkipByDesign  # 13921 Dom isolates don't support spawnFunction
+issue_21398_parent_isolate2_test/01: SkipByDesign  # Uses spawnFunction
+compile_time_error_test/none: RuntimeError, OK  # Uses Isolate.spawn.
+function_send_test: RuntimeError, OK  # Uses Isolate.spawn.
+handle_error2_test: RuntimeError, OK  # Uses Isolate.spawn.
+handle_error3_test: RuntimeError, OK  # Uses Isolate.spawn.
+handle_error_test: RuntimeError, OK  # Uses Isolate.spawn.
+isolate_current_test: RuntimeError, OK  # Uses Isolate.spawn.
+isolate_import_test/none: RuntimeError, OK  # Uses Isolate.spawn.
+issue_21398_parent_isolate1_test: RuntimeError, OK  # Uses Isolate.spawn.
+issue_21398_parent_isolate_test: RuntimeError, OK  # Uses Isolate.spawn.
+kill2_test: RuntimeError, OK  # Uses Isolate.spawn.
+kill_self_test: RuntimeError, OK  # Uses Isolate.spawn.
+kill_test: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/byteBuffer: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/constInstance: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/constList: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/constList_identical: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/constMap: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/fun: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/none: RuntimeError, OK  # Uses Isolate.spawn.
+message_enum_test: RuntimeError, OK  # Uses Isolate.spawn.
+ondone_test: RuntimeError, OK  # Uses Isolate.spawn.
+pause_test: RuntimeError, OK  # Uses Isolate.spawn.
+simple_message_test/none: RuntimeError, OK  # Uses Isolate.spawn.
+start_paused_test: RuntimeError, OK  # Uses Isolate.spawn.
+message3_test/int32x4: RuntimeError, OK  # Uses Isolate.spawn.
 
 
 [ $compiler == dart2analyzer ]
@@ -126,7 +151,7 @@
 package_config_test: SkipByDesign  # Uses Isolate.packageConfig
 package_resolve_test: SkipByDesign  # Uses Isolate.resolvePackageUri
 spawn_uri_fail_test: SkipByDesign  # Uses dart:io.
-scenarios/*: SkipByDesign  # Use automatic package resolution and .dart URIs.
+scenarios/*: SkipByDesign  # Use automatic package resolution, spawnFunction and .dart URIs.
 
 [ ($noopt || $compiler == precompiler) ]
 # Imports dart:mirrors
diff --git a/tests/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart b/tests/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
index 15eaa3e..889763c 100644
--- a/tests/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
+++ b/tests/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, 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.
 
diff --git a/tests/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart b/tests/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
index e34c5b3..67b4d1e 100644
--- a/tests/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
+++ b/tests/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, 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.
 
diff --git a/tests/isolate/scenarios/package_relative_root/package_relative_root_test.dart b/tests/isolate/scenarios/package_relative_root/package_relative_root_test.dart
new file mode 100644
index 0000000..a3a8533
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_root/package_relative_root_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2016, 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.
+
+// PackageRoot=none
+
+import 'dart:io';
+import 'dart:isolate';
+
+import "package:foo/foo.dart";
+import "package:bar/bar.dart";
+
+var CONFIG_URI = "package:bar/spawned_packages/";
+
+main([args, port]) async {
+  if (port != null) {
+    testCorrectBarPackage(port);
+    return;
+  }
+  var p = new RawReceivePort();
+  Isolate.spawnUri(Platform.script,
+                   [],
+                   p.sendPort,
+                   packageRoot: Uri.parse(CONFIG_URI));
+  p.handler = (msg) {
+    p.close();
+    if (msg is! List) {
+      print(msg.runtimeType);
+      throw "Failure return from spawned isolate:\n\n$msg";
+    }
+    if (msg[0] != "Foo") {
+      throw "Bad package config in child isolate: ${msg[0]}\n"
+            "Expected: 'Foo'";
+    }
+    if (msg[1] != "Bar2") {
+      throw "Package path not matching: ${msg[1]}\n"
+            "Expected: 'Bar2'";
+    }
+    print("SUCCESS");
+  };
+  if (Bar.value != "Bar1") {
+    throw "Spawning isolate package:bar invalid.";
+  }
+  print("Spawned isolate resolved $CONFIG_URI to: "
+        "${await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI))}");
+}
+
+testCorrectBarPackage(port) async {
+  try {
+    var packageRootStr = Platform.packageRoot;
+    var packageConfigStr = Platform.packageConfig;
+    var packageConfig = await Isolate.packageConfig;
+    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
+    print("Spawned isolate's package root flag: $packageRootStr");
+    print("Spawned isolate's package config flag: $packageConfigStr");
+    print("Spawned isolate's loaded package config: $packageConfig");
+    print("Spawned isolate's resolved package path: $resolvedPkg");
+    port.send([Foo.value, Bar.value]);
+  } catch (e, s) {
+    port.send("$e\n$s\n");
+  }
+}
diff --git a/tests/isolate/scenarios/package_relative_root/packages/bar/bar.dart b/tests/isolate/scenarios/package_relative_root/packages/bar/bar.dart
new file mode 100644
index 0000000..7fb99e2
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_root/packages/bar/bar.dart
@@ -0,0 +1,3 @@
+class Bar {
+  static var value = "Bar1";
+}
diff --git a/tests/isolate/scenarios/package_relative_root/packages/bar/spawned_packages/bar/bar.dart b/tests/isolate/scenarios/package_relative_root/packages/bar/spawned_packages/bar/bar.dart
new file mode 100644
index 0000000..cd6723a
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_root/packages/bar/spawned_packages/bar/bar.dart
@@ -0,0 +1,3 @@
+class Bar {
+  static var value = "Bar2";
+}
diff --git a/tests/isolate/scenarios/package_relative_root/packages/bar/spawned_packages/foo/foo.dart b/tests/isolate/scenarios/package_relative_root/packages/bar/spawned_packages/foo/foo.dart
new file mode 100644
index 0000000..ba907d1
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_root/packages/bar/spawned_packages/foo/foo.dart
@@ -0,0 +1,3 @@
+class Foo {
+  static var value = "Foo";
+}
diff --git a/tests/isolate/scenarios/package_relative_root/packages/foo/foo.dart b/tests/isolate/scenarios/package_relative_root/packages/foo/foo.dart
new file mode 100644
index 0000000..ba907d1
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_root/packages/foo/foo.dart
@@ -0,0 +1,3 @@
+class Foo {
+  static var value = "Foo";
+}
diff --git a/tests/isolate/scenarios/package_relative_spec/.packages b/tests/isolate/scenarios/package_relative_spec/.packages
new file mode 100644
index 0000000..d7a0d92
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_spec/.packages
@@ -0,0 +1,4 @@
+# This is the package spec for the spawning isolate.
+
+foo:foo_package/
+bar:bar1_package/
diff --git a/tests/isolate/scenarios/package_relative_spec/bar1_package/bar.dart b/tests/isolate/scenarios/package_relative_spec/bar1_package/bar.dart
new file mode 100644
index 0000000..7fb99e2
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_spec/bar1_package/bar.dart
@@ -0,0 +1,3 @@
+class Bar {
+  static var value = "Bar1";
+}
diff --git a/tests/isolate/scenarios/package_relative_spec/bar1_package/package.config b/tests/isolate/scenarios/package_relative_spec/bar1_package/package.config
new file mode 100644
index 0000000..b580fe3
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_spec/bar1_package/package.config
@@ -0,0 +1,4 @@
+# This is the package spec for the spawned isolate.
+
+foo:../foo_package/
+bar:../bar2_package/
diff --git a/tests/isolate/scenarios/package_relative_spec/bar2_package/bar.dart b/tests/isolate/scenarios/package_relative_spec/bar2_package/bar.dart
new file mode 100644
index 0000000..cd6723a
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_spec/bar2_package/bar.dart
@@ -0,0 +1,3 @@
+class Bar {
+  static var value = "Bar2";
+}
diff --git a/tests/isolate/scenarios/package_relative_spec/foo_package/foo.dart b/tests/isolate/scenarios/package_relative_spec/foo_package/foo.dart
new file mode 100644
index 0000000..ba907d1
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_spec/foo_package/foo.dart
@@ -0,0 +1,3 @@
+class Foo {
+  static var value = "Foo";
+}
diff --git a/tests/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart b/tests/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
new file mode 100644
index 0000000..e22d3ef
--- /dev/null
+++ b/tests/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2016, 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.
+
+// PackageRoot=none
+
+import 'dart:io';
+import 'dart:isolate';
+
+import "package:foo/foo.dart";
+import "package:bar/bar.dart";
+
+var CONFIG_URI = "package:bar/package.config";
+
+main([args, port]) async {
+  if (port != null) {
+    testCorrectBarPackage(port);
+    return;
+  }
+  var p = new RawReceivePort();
+  Isolate.spawnUri(Platform.script,
+                   [],
+                   p.sendPort,
+                   packageConfig: Uri.parse(CONFIG_URI));
+  p.handler = (msg) {
+    p.close();
+    if (msg is! List) {
+      print(msg.runtimeType);
+      throw "Failure return from spawned isolate:\n\n$msg";
+    }
+    if (msg[0] != "Foo") {
+      throw "Bad package config in child isolate: ${msg[0]}\n"
+            "Expected: 'Foo'";
+    }
+    if (msg[1] != "Bar2") {
+      throw "Package path not matching: ${msg[1]}\n"
+            "Expected: 'Bar2'";
+    }
+    print("SUCCESS");
+  };
+  if (Bar.value != "Bar1") {
+    throw "Spawning isolate package:bar invalid.";
+  }
+  print("Spawned isolate resolved $CONFIG_URI to: "
+        "${await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI))}");
+}
+
+testCorrectBarPackage(port) async {
+  try {
+    var packageRootStr = Platform.packageRoot;
+    var packageConfigStr = Platform.packageConfig;
+    var packageConfig = await Isolate.packageConfig;
+    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
+    print("Spawned isolate's package root flag: $packageRootStr");
+    print("Spawned isolate's package config flag: $packageConfigStr");
+    print("Spawned isolate's loaded package config: $packageConfig");
+    print("Spawned isolate's resolved package path: $resolvedPkg");
+    port.send([Foo.value, Bar.value]);
+  } catch (e, s) {
+    port.send("$e\n$s\n");
+  }
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index ec744b7..65a750e 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -71,6 +71,7 @@
 [ ($compiler == none || $compiler == precompiler) && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
 issue13474_test: Pass, Fail # Issue 14651.
 config_import_test: Fail # Issue 14651.
+vm/optimized_guarded_field_isolates_test: RuntimeError, OK  # Uses Isolate.spawn.
 main_test/01: Fail # Issue 20028
 main_test/02: Fail # Issue 20028
 main_test/04: Fail # Issue 20028
diff --git a/tests/language/regress_25389_part.dart b/tests/language/regress_25389_part.dart
new file mode 100644
index 0000000..c14d2b1
--- /dev/null
+++ b/tests/language/regress_25389_part.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2016, 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.
+
+part of regress_25389;
+
+abstract class ComponentState<S extends ComponentState> {}
+
+abstract class AbstractListEditorState<D,
+    S extends AbstractListEditorState<D, S>> extends ComponentState<S> {}
+
+class IssueListEditorState
+    extends AbstractListEditorState<String, IssueListEditorState>
+    implements ComponentState<IssueListEditorState> {}
+
diff --git a/tests/language/regress_25389_test.dart b/tests/language/regress_25389_test.dart
new file mode 100644
index 0000000..8bcd79a
--- /dev/null
+++ b/tests/language/regress_25389_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2016, 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.
+// VMOptions=--error-on-bad-type
+
+library regress_25389;
+
+part 'regress_25389_part.dart';
+
+main() {
+  new IssueListEditorState();
+}
+
+abstract class AbstractListEditor<D, S extends AbstractListEditorState<D, S>> {}
+
diff --git a/tests/standalone/io/web_socket_compression_test.dart b/tests/standalone/io/web_socket_compression_test.dart
index b1fd13f..912b855 100644
--- a/tests/standalone/io/web_socket_compression_test.dart
+++ b/tests/standalone/io/web_socket_compression_test.dart
@@ -171,13 +171,15 @@
     });
   }
 
-  void testReturnHeaders(String headerValue, String expected) {
+  void testReturnHeaders(String headerValue, String expected, {
+    CompressionOptions serverCompression: CompressionOptions.DEFAULT}) {
     asyncStart();
     createServer().then((server) {
       server.listen((request) {
         // Stuff
         Expect.isTrue(WebSocketTransformer.isUpgradeRequest(request));
-        WebSocketTransformer.upgrade(request).then((webSocket) {
+        WebSocketTransformer.upgrade(request, compression: serverCompression)
+          .then((webSocket) {
             webSocket.listen((message) {
               Expect.equals("Hello World", message);
 
@@ -216,6 +218,47 @@
     }); // End createServer
   }
 
+  void testClientRequestHeaders(CompressionOptions compression) {
+    asyncStart();
+    createServer().then((server) {
+      server.listen((request) {
+        var extensionHeader = request.headers.value('Sec-WebSocket-Extensions');
+        var hv = HeaderValue.parse(extensionHeader);
+        Expect.equals(compression.serverNoContextTakeover,
+            hv.parameters.containsKey('server_no_context_takeover'));
+        Expect.equals(compression.clientNoContextTakeover,
+            hv.parameters.containsKey('client_no_context_takeover'));
+        Expect.equals(compression.serverMaxWindowBits?.toString(),
+            hv.parameters['server_max_window_bits']);
+        Expect.equals(compression.clientMaxWindowBits?.toString(),
+            hv.parameters['client_max_window_bits']);
+
+        WebSocketTransformer.upgrade(request).then((webSocket) {
+            webSocket.listen((message) {
+              Expect.equals('Hello World', message);
+
+              webSocket.add(message);
+              webSocket.close();
+            });
+        });
+      });
+
+      var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
+
+      WebSocket.connect(url, compression: compression).then((websocket) {
+        var future = websocket.listen((message) {
+          Expect.equals('Hello World', message);
+          websocket.close();
+        }).asFuture();
+        websocket.add('Hello World');
+        return future;
+      }).then((_) {
+        server.close();
+        asyncEnd();
+      });
+    });
+  }
+
   void runTests() {
     // No compression or takeover
     testCompressionSupport();
@@ -237,9 +280,39 @@
                       "permessage-deflate; client_max_window_bits=15");
     // Ensure max_window_bits resize appropriately.
     testReturnHeaders('permessage-deflate; server_max_window_bits=10',
-                      "permessage-deflate;" 
+                      "permessage-deflate;"
                       " server_max_window_bits=10;"
                       " client_max_window_bits=10");
+    // Don't provider context takeover if requested but not enabled.
+    // Default is not enabled.
+    testReturnHeaders('permessage-deflate; client_max_window_bits;'
+                      'client_no_context_takeover',
+                      'permessage-deflate; client_max_window_bits=15');
+    // Enable context Takeover and provide if requested.
+    var compression = new CompressionOptions(clientNoContextTakeover: true,
+        serverNoContextTakeover: true);
+    testReturnHeaders('permessage-deflate; client_max_window_bits; '
+                      'client_no_context_takeover',
+                      'permessage-deflate; client_no_context_takeover; '
+                      'client_max_window_bits=15',
+                      serverCompression: compression);
+    // Enable context takeover and don't provide if not requested
+    compression = new CompressionOptions(clientNoContextTakeover: true,
+        serverNoContextTakeover: true);
+    testReturnHeaders('permessage-deflate; client_max_window_bits; ',
+                      'permessage-deflate; client_max_window_bits=15',
+                      serverCompression: compression);
+
+    compression = CompressionOptions.DEFAULT;
+    testClientRequestHeaders(compression);
+    compression = new CompressionOptions(clientNoContextTakeover: true,
+        serverNoContextTakeover: true);
+    testClientRequestHeaders(compression);
+    compression = new CompressionOptions(clientNoContextTakeover: true,
+        serverNoContextTakeover: true,
+        clientMaxWindowBits: 8,
+        serverMaxWindowBits: 8);
+    testClientRequestHeaders(compression);
   }
 }
 
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 19b2d431..590489e 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -47,6 +47,8 @@
 io/socket_many_connections_test: Skip
 
 [ ($compiler == none || $compiler == precompiler) && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
+typed_array_test: RuntimeError, OK  # Uses Isolate.spawn
+typed_array_int64_uint64_test: RuntimeError, OK  # Uses Isolate.spawn
 typed_data_isolate_test: SkipByDesign # This test uses dart:io
 io/*: SkipByDesign # Don't run tests using dart:io in the browser
 package/*: Skip # Do not run those in Dartium.
diff --git a/tools/VERSION b/tools/VERSION
index c28a186..3964b63 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 14
 PATCH 0
 PRERELEASE 7
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1
diff --git a/tools/dom/src/Html5NodeValidator.dart b/tools/dom/src/Html5NodeValidator.dart
index 2bbaf41..01ce4f8 100644
--- a/tools/dom/src/Html5NodeValidator.dart
+++ b/tools/dom/src/Html5NodeValidator.dart
@@ -239,6 +239,7 @@
     'INPUT::align',
     'INPUT::alt',
     'INPUT::autocomplete',
+    'INPUT::autofocus',
     'INPUT::checked',
     'INPUT::disabled',
     'INPUT::inputmode',