| Index: pkg/polymer/lib/testing/testing.js
 | 
| diff --git a/pkg/polymer/lib/testing/testing.js b/pkg/polymer/lib/testing/testing.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..de27047f288bd8051ae87c3d72d8ca7ea085845f
 | 
| --- /dev/null
 | 
| +++ b/pkg/polymer/lib/testing/testing.js
 | 
| @@ -0,0 +1,147 @@
 | 
| +// Copyright (c) 2012, 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.
 | 
| +
 | 
| +(function() {
 | 
| +  var undoReplaceScripts = [];
 | 
| +
 | 
| +  var flags = {};
 | 
| +  // populate flags from location
 | 
| +  location.search.slice(1).split('&').forEach(function(o) {
 | 
| +    o = o.split('=');
 | 
| +    o[0] && (flags[o[0]] = o[1] || true);
 | 
| +  });
 | 
| +
 | 
| +  // Webkit is migrating from layoutTestController to testRunner, we use
 | 
| +  // layoutTestController as a fallback until that settles in.
 | 
| +  var runner = window.testRunner || window.layoutTestController;
 | 
| +
 | 
| +  if (runner) {
 | 
| +    runner.dumpAsText();
 | 
| +    runner.waitUntilDone();
 | 
| +  }
 | 
| +
 | 
| +  function dumpDOM() {
 | 
| +    // Undo any scripts that were modified.
 | 
| +    undoReplaceScripts.forEach(function(undo) { undo(); });
 | 
| +
 | 
| +    function expandShadowRoot(node) {
 | 
| +      for (var n = node.firstChild; n; n = n.nextSibling) {
 | 
| +        expandShadowRoot(n);
 | 
| +      }
 | 
| +      var shadow = node.shadowRoot || node.webkitShadowRoot ||
 | 
| +          node.olderShadowRoot;
 | 
| +
 | 
| +      if (shadow) {
 | 
| +        expandShadowRoot(shadow);
 | 
| +
 | 
| +        var name = 'shadow-root';
 | 
| +        if (shadow == node.olderShadowRoot) name = 'older-' + name;
 | 
| +
 | 
| +        var fakeShadow = document.createElement(name);
 | 
| +        while (shadow.firstChild) fakeShadow.appendChild(shadow.firstChild);
 | 
| +        node.insertBefore(fakeShadow, node.firstChild);
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    // TODO(jmesserly): use querySelector to workaround unwrapped "document".
 | 
| +    expandShadowRoot(document.querySelector('body'));
 | 
| +
 | 
| +    // Clean up all of the junk added to the DOM by js-interop and shadow CSS
 | 
| +    // TODO(jmesserly): it seems like we're leaking lots of dart-port attributes
 | 
| +    // for the document elemenet
 | 
| +    function cleanTree(node) {
 | 
| +      for (var n = node.firstChild; n; n = n.nextSibling) {
 | 
| +        cleanTree(n);
 | 
| +      }
 | 
| +
 | 
| +      // Remove dart-port attributes
 | 
| +      if (node.attributes) {
 | 
| +        for (var i = 0; i < node.attributes.length; i++) {
 | 
| +          if (node.attributes[i].value.indexOf('dart-port') == 0) {
 | 
| +            node.removeAttribute(i);
 | 
| +          }
 | 
| +        }
 | 
| +      }
 | 
| +
 | 
| +      if (node.tagName == 'script' &&
 | 
| +          node.textContent.indexOf('_DART_TEMPORARY_ATTACHED') >= 0)  {
 | 
| +        node.parentNode.removeChild(node);
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    // TODO(jmesserly): use querySelector to workaround unwrapped "document".
 | 
| +    cleanTree(document.querySelector('html'));
 | 
| +
 | 
| +    var out = document.createElement('pre');
 | 
| +    out.textContent = document.documentElement.outerHTML;
 | 
| +    document.body.innerHTML = '';
 | 
| +    document.body.appendChild(out);
 | 
| +  }
 | 
| +
 | 
| +  function messageHandler(e) {
 | 
| +    if (e.data == 'done' && runner) {
 | 
| +      // On success, dump the DOM. Convert shadowRoot contents into
 | 
| +      // <shadow-root>
 | 
| +      dumpDOM();
 | 
| +      runner.notifyDone();
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  window.addEventListener('message', messageHandler, false);
 | 
| +
 | 
| +  function errorHandler(e) {
 | 
| +    if (runner) {
 | 
| +      window.setTimeout(function() { runner.notifyDone(); }, 0);
 | 
| +    }
 | 
| +    window.console.log('FAIL');
 | 
| +  }
 | 
| +
 | 
| +  window.addEventListener('error', errorHandler, false);
 | 
| +
 | 
| +  if (navigator.webkitStartDart && !flags.js) {
 | 
| +    // TODO(jmesserly): fix this so we don't need to copy from browser/dart.js
 | 
| +    if (!navigator.webkitStartDart()) {
 | 
| +      document.body.innerHTML = 'This build has expired.  Please download a new Dartium at http://www.dartlang.org/dartium/index.html';
 | 
| +    }
 | 
| +  } else {
 | 
| +    if (flags.shadowdomjs) {
 | 
| +      // Allow flags to force polyfill of ShadowDOM so we can test it.
 | 
| +      window.__forceShadowDomPolyfill = true;
 | 
| +    }
 | 
| +
 | 
| +    // TODO:
 | 
| +    // - Support in-browser compilation.
 | 
| +    // - Handle inline Dart scripts.
 | 
| +    window.addEventListener("DOMContentLoaded", function (e) {
 | 
| +      // Fall back to compiled JS. Run through all the scripts and
 | 
| +      // replace them if they have a type that indicate that they source
 | 
| +      // in Dart code.
 | 
| +      //
 | 
| +      //   <script type="application/dart" src="..."></script>
 | 
| +      //
 | 
| +      var scripts = document.getElementsByTagName("script");
 | 
| +      var length = scripts.length;
 | 
| +      for (var i = 0; i < length; ++i) {
 | 
| +        var script = scripts[i];
 | 
| +        if (script.type == "application/dart") {
 | 
| +          // Remap foo.dart to foo.dart.js.
 | 
| +          if (script.src && script.src != '') {
 | 
| +            var jsScript = document.createElement('script');
 | 
| +            jsScript.src = script.src.replace(/\.dart(?=\?|$)/, '.dart.js');
 | 
| +            var parent = script.parentNode;
 | 
| +            // TODO(vsm): Find a solution for issue 8455 that works with more
 | 
| +            // than one script.
 | 
| +            document.currentScript = jsScript;
 | 
| +
 | 
| +            undoReplaceScripts.push(function() {
 | 
| +              parent.replaceChild(script, jsScript);
 | 
| +            });
 | 
| +            parent.replaceChild(jsScript, script);
 | 
| +          }
 | 
| +        }
 | 
| +      }
 | 
| +    }, false);
 | 
| +  }
 | 
| +
 | 
| +})();
 | 
| 
 |