Version 1.8.0-dev.4.5

svn merge -c 41876 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 41899 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 41916 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

Merge patch from:
https://codereview.chromium.org/753463002/

git-svn-id: http://dart.googlecode.com/svn/trunk@41923 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 893445ba..9864942 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -323,12 +323,6 @@
    */
   final Set<ClassElement> specialOperatorEqClasses = new Set<ClassElement>();
 
-  /**
-   * A set of members that are called from subclasses via super.
-   */
-  final Set<FunctionElement> aliasedSuperMembers =
-      new Setlet<FunctionElement>();
-
   List<CompilerTask> get tasks {
     return <CompilerTask>[builder, optimizer, generator, emitter];
   }
@@ -534,20 +528,6 @@
     return name;
   }
 
-  /**
-   * Record that [method] is called from a subclass via `super`.
-   */
-  void registerAliasedSuperMember(FunctionElement method) {
-    aliasedSuperMembers.add(method);
-  }
-
-  /**
-   * Returns `true` is [member] is called from a subclass via `super`.
-   */
-  bool isAliasedSuperMember(FunctionElement member) {
-    return aliasedSuperMembers.contains(member);
-  }
-
   bool isInterceptedMethod(Element element) {
     if (!element.isInstanceMember) return false;
     if (element.isGenerativeConstructorBody) {
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 5ff2a2d..a318279 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -18,7 +18,6 @@
 
   final String getterPrefix = 'g';
   final String setterPrefix = 's';
-  final String superPrefix = r's$';
   final String callPrefix = ''; // this will create function names $<n>
 
   static const ALPHABET_CHARACTERS = 52;  // a-zA-Z.
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 0fe858b..4eff34a 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -220,7 +220,6 @@
   final String currentIsolate = r'$';
   final String getterPrefix = r'get$';
   final String setterPrefix = r'set$';
-  final String superPrefix = r'super$';
   final String metadataField = '@';
   final String callPrefix = 'call';
   final String callCatchAllName = r'call$catchAll';
@@ -810,14 +809,6 @@
   // TODO(ahe): Remove this method. Use get getNameOfMember instead.
   String getNameOfInstanceMember(Element member) => getNameX(member);
 
-  String getNameOfAliasedSuperMember(Element member) {
-    ClassElement superClass = member.enclosingClass;
-    String className = getNameOfClass(superClass);
-    String memberName = getNameOfMember(member);
-    String proposal = "$superPrefix$className\$$memberName";
-    return getMappedInstanceName(proposal);
-  }
-
   String getNameOfMember(Element member) => getNameX(member);
 
   String getNameOfGlobalField(VariableElement field) => getNameX(field);
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
index 6fa8fa4..802887d 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
@@ -414,7 +414,7 @@
 
   void addMemberMethodFromInfo(MemberInfo info, ClassBuilder builder) {
     final FunctionElement member = info.member;
-    String name = info.name;
+    final String name = info.name;
     final FunctionSignature parameters = info.parameters;
     jsAst.Expression code = info.code;
     final bool needsStubs = info.needsStubs;
@@ -427,13 +427,6 @@
 
     emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
 
-    // If this member is called from a subclass via super, we have to add a
-    // renaming. This is encoded by using two names separated with a : as
-    // the property name.
-    if (backend.isAliasedSuperMember(member)) {
-      name = "$name:${namer.getNameOfAliasedSuperMember(member)}";
-    }
-
     if (!needStructuredInfo) {
       compiler.dumpInfoTask.registerElementAst(member,
           builder.addProperty(name, code));
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
index e206f95..b99843c 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
@@ -307,6 +307,7 @@
     return js(r'''
         var inheritFrom = function() {
           function tmp() {}
+          function tmp() {}
           var hasOwnProperty = Object.prototype.hasOwnProperty;
           return function (constructor, superConstructor) {
             tmp.prototype = superConstructor.prototype;
@@ -350,25 +351,6 @@
             finishedClassesAccess]);
   }
 
-  List buildSplitOffAliases() {
-    if (backend.aliasedSuperMembers.isEmpty) return [];
-    return [js(r'''
-        var splitOffAliases = function(constructor) {
-          var hasOwnProperty = Object.prototype.hasOwnProperty;
-          var properties = constructor.prototype;
-          for (var member in properties) {
-            if (hasOwnProperty.call(properties, member)) {
-              var s = member.split(':');
-              if (s.length > 1) {
-                properties[s[0]] = properties[s[1]] = properties[member];
-                delete properties[member];
-              }
-            }
-          }
-        }
-      ''')];
-  }
-
   jsAst.Fun get finishClassesFunction {
     // Class descriptions are collected in a JS object.
     // 'finishClasses' takes all collected descriptions and sets up
@@ -536,11 +518,6 @@
         finishedClasses[cls] = true;
 
         var superclass = pendingClasses[cls];
-        var constructor = allClasses[cls];
-
-        // Process aliased members due to super calls. We have to do this early
-        // to ensure that we also hit the object class.
-        if (#) splitOffAliases(constructor);
 
         // The superclass is only false (empty string) for the Dart Object
         // class.  The minifier together with noSuchMethod can put methods on
@@ -548,6 +525,7 @@
         // that we have a string.
         if (!superclass || typeof superclass != "string") return;
         finishClass(superclass);
+        var constructor = allClasses[cls];
         var superConstructor = allClasses[superclass];
 
         if (!superConstructor)
@@ -606,7 +584,6 @@
         }
       }
     }''', [finishedClassesAccess,
-           backend.aliasedSuperMembers.isNotEmpty,
            !nativeClasses.isEmpty,
            interceptorsByTagAccess,
            leafTagsAccess,
@@ -718,7 +695,6 @@
     if (!needsDefineClass) return [];
     return defineClassFunction
     ..add(buildInheritFrom())
-    ..addAll(buildSplitOffAliases())
     ..add(js('$finishClassesName = #', finishClassesFunction))
     ..add(initFinishClasses);
   }
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
index afd0cae..a1d3610 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
@@ -141,16 +141,11 @@
    * [array].
    */
   jsAst.Statement addStubs = js.statement('''
-  function addStubs(descriptor, array, nameTag, isStatic,
+  function addStubs(descriptor, array, name, isStatic,
                     originalDescriptor, functions) {
-    // The name could be an aliased method, which is only resolved later in
-    // finishClasses. We need to use the actual name for the generated stubs.
-    // Note that no getter for the alias is needed, as getter sends via super
-    // are handled via the prototype chain and not using the alias.
-    var name = nameTag.split(':')[0];
     var f, funcs =
-        [originalDescriptor[nameTag] =
-        descriptor[nameTag] = f = ${readFunction("array", "$FUNCTION_INDEX")}];
+        [originalDescriptor[name] =
+        descriptor[name] = f = ${readFunction("array", "$FUNCTION_INDEX")}];
     f.\$stubName = name;
     functions.push(name);
     for (var index = $FUNCTION_INDEX; index < array.length; index += 2) {
@@ -184,7 +179,7 @@
 
     if (getterStubName) {
       f = tearOff(funcs, array, isStatic, name, isIntercepted);
-      descriptor[nameTag].\$getter = f;
+      descriptor[name].\$getter = f;
       f.\$getterStub = true;
       // Used to create an isolate using spawnFunction.
       if (isStatic) #[name] = f;  // embedded globalFunctions.
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 2eaad68..3829edd 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1683,23 +1683,14 @@
         registry.registerDynamicGetter(selector);
         registry.registerGetterForSuperMethod(node.element);
         methodName = backend.namer.invocationName(selector);
-        push(
-          js.js('#.prototype.#.call(#)', [
-            backend.namer.elementAccess(superClass),
-            methodName, visitArguments(node.inputs, start: 0)]),
-          node);
       } else {
-        methodName =
-            backend.namer.getNameOfAliasedSuperMember(superMethod);
-        backend.registerAliasedSuperMember(superMethod);
-        use(node.inputs.first);
-        push(
-          js.js('#.#(#)', [
-            pop(), methodName,
-            visitArguments(node.inputs, start: 1)]),
-          node);
+        methodName = backend.namer.getNameOfInstanceMember(superMethod);
       }
-
+      push(
+          js.js('#.prototype.#.call(#)', [
+              backend.namer.elementAccess(superClass),
+              methodName, visitArguments(node.inputs, start: 0)]),
+          node);
     }
   }
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 97f3075..13f87c4 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -15,6 +15,9 @@
 scheduled_test/lib/*: Skip
 polymer/example/scoped_style/*: Skip
 
+[ $runtime == vm ]
+analysis_server/test/integration/asynchrony_test: Skip # Times out due to revert of 41436, see also issue 21564
+
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 scheduled_test/test/scheduled_stream/stream_matcher_test: Pass, Slow
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a6c7e2a..a2289fd 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -7485,6 +7485,16 @@
   // To suppress missing implicit constructor warnings.
   factory Document._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('Document.pointerlockchangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('pointerlockchange');
+
+  @DomName('Document.pointerlockerrorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('pointerlockerror');
+
   /**
    * Static factory designed to expose `readystatechange` events to event
    * handlers that are not necessarily instances of [Document].
@@ -8104,6 +8114,16 @@
   @Experimental() // untriaged
   Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
 
+  @DomName('Document.onpointerlockchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
+
+  @DomName('Document.onpointerlockerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPointerLockError => pointerLockErrorEvent.forTarget(this);
+
   @DomName('Document.onratechange')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 168a4c7..601400b 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -8439,6 +8439,16 @@
   // To suppress missing implicit constructor warnings.
   factory Document._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('Document.pointerlockchangeEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('pointerlockchange');
+
+  @DomName('Document.pointerlockerrorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('pointerlockerror');
+
   /**
    * Static factory designed to expose `readystatechange` events to event
    * handlers that are not necessarily instances of [Document].
@@ -9033,6 +9043,16 @@
   @Experimental() // untriaged
   Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
 
+  @DomName('Document.onpointerlockchange')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
+
+  @DomName('Document.onpointerlockerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onPointerLockError => pointerLockErrorEvent.forTarget(this);
+
   @DomName('Document.onratechange')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/tools/VERSION b/tools/VERSION
index 39d7666..5ec591b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 8
 PATCH 0
 PRERELEASE 4
-PRERELEASE_PATCH 4
+PRERELEASE_PATCH 5
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 66ffaec..372ecca 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -126,8 +126,8 @@
   'Document.readystatechange': ('readyStateChange', 'Event'),
   'Document.securitypolicyviolation': ('securityPolicyViolation', 'SecurityPolicyViolationEvent'),
   'Document.selectionchange': ('selectionChange', 'Event'),
-  'Document.webkitpointerlockchange': ('pointerLockChange', 'Event'),
-  'Document.webkitpointerlockerror': ('pointerLockError', 'Event'),
+  'Document.pointerlockchange': ('pointerLockChange', 'Event'),
+  'Document.pointerlockerror': ('pointerLockError', 'Event'),
   'EventSource.open': ('open', 'Event'),
   'FileReader.abort': ('abort', 'ProgressEvent'),
   'FileReader.load': ('load', 'ProgressEvent'),
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 1bc0077..60845a4 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -233,7 +233,6 @@
   'Document.webkitFullscreenEnabled',
   'Document.webkitHidden',
   'Document.webkitIsFullScreen',
-  'Document.webkitPointerLockElement',
   'Document.webkitVisibilityState',
 
   'Element.children',