Identify the name of the prototype extended by out-of-app custom elements

BUG=
R=sigmund@google.com

Review URL: https://codereview.chromium.org//329723002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/web_components@37247 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/lib/dart_support.js b/lib/dart_support.js
index 4e1995a..77948eb 100644
--- a/lib/dart_support.js
+++ b/lib/dart_support.js
@@ -116,6 +116,33 @@
     upgraders[name] = upgrader;
   }
 
+
+  // Native custom elements outside the app in Chrome have constructor
+  // names like "x-tag", which need to be translated to the DOM
+  // element they extend.  When using the shadow dom polyfill this is
+  // take care of above.
+  var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
+  if (!ShadowDOMPolyfill) {
+    // dartNativeDispatchHooksTransformer is described on initHooks() in
+    // sdk/lib/_internal/lib/native_helper.dart.
+    if (typeof window.dartNativeDispatchHooksTransformer == 'undefined')
+    window.dartNativeDispatchHooksTransformer = [];
+
+    window.dartNativeDispatchHooksTransformer.push(function(hooks) {
+      var originalGetUnknownTag = hooks.getUnknownTag;
+      hooks.getUnknownTag = function(o, tag) {
+        if (/-/.test(tag)) {  // "x-tag"
+          var s = Object.prototype.toString.call(o);
+          var match = s.match(/^\[object ([A-Za-z]*Element)\]$/);
+          if (match) {
+            return match[1];
+	  }
+          return originalGetUnknownTag(o, tag);
+        }
+      };
+    });
+  }
+
   doc._registerDartTypeUpgrader = registerDartTypeUpgrader;
   doc.registerElement = registerElement;
 })(document);