Index: lib/src/runner/browser/server.dart |
diff --git a/lib/src/runner/browser/server.dart b/lib/src/runner/browser/server.dart |
index 007ebba54b306136585e3c792929106cbc86322e..fb0e55abddf6f16b6d0569b6715785ac54854bd8 100644 |
--- a/lib/src/runner/browser/server.dart |
+++ b/lib/src/runner/browser/server.dart |
@@ -151,8 +151,8 @@ class BrowserServer { |
cascade = cascade |
.add(_createPackagesHandler()) |
.add(_jsHandler.handler) |
- .add(_wrapperHandler) |
- .add(createStaticHandler(_root)); |
+ .add(createStaticHandler(_root)) |
+ .add(_wrapperHandler); |
} |
var pipeline = new shelf.Pipeline() |
@@ -188,14 +188,12 @@ class BrowserServer { |
/// A handler that serves wrapper files used to bootstrap tests. |
shelf.Response _wrapperHandler(shelf.Request request) { |
var path = p.fromUri(shelfUrl(request)); |
- var withoutExtensions = p.withoutExtension(p.withoutExtension(path)); |
- var base = p.basename(withoutExtensions); |
if (path.endsWith(".browser_test.dart")) { |
return new shelf.Response.ok(''' |
import "package:test/src/runner/browser/iframe_listener.dart"; |
-import "$base" as test; |
+import "${p.basename(p.withoutExtension(p.withoutExtension(path)))}" as test; |
void main() { |
IframeListener.start(() => test.main); |
@@ -203,17 +201,22 @@ void main() { |
''', headers: {'Content-Type': 'application/dart'}); |
} |
- if (path.endsWith(".browser_test.html")) { |
- // TODO(nweiz): support user-authored HTML files. |
+ if (path.endsWith(".html")) { |
+ var test = p.withoutExtension(path) + ".dart"; |
+ |
+ // Link to the Dart wrapper on Dartium and the compiled JS version |
+ // elsewhere. |
+ var script = request.headers['user-agent'].contains('(Dart)') |
+ ? 'type="application/dart" ' |
+ 'src="${HTML_ESCAPE.convert(test)}.browser_test.dart"' |
+ : 'src="${HTML_ESCAPE.convert(test)}.browser_test.dart.js"'; |
+ |
return new shelf.Response.ok(''' |
<!DOCTYPE html> |
<html> |
<head> |
- <title>${HTML_ESCAPE.convert(base)}.dart Test</title> |
- <script type="application/dart" |
- src="${HTML_ESCAPE.convert(base)}.browser_test.dart"> |
- </script> |
- <script src="packages/browser/dart.js"></script> |
+ <title>${HTML_ESCAPE.convert(test)} Test</title> |
+ <script $script></script> |
</head> |
</html> |
''', headers: {'Content-Type': 'text/html'}); |
@@ -232,20 +235,31 @@ void main() { |
throw new ArgumentError("$browser is not a browser."); |
} |
+ var htmlPath = p.withoutExtension(path) + '.html'; |
+ if (new File(htmlPath).existsSync() && |
+ !new File(htmlPath).readAsStringSync() |
+ .contains('packages/test/dart.js')) { |
+ throw new LoadException( |
+ path, |
+ '"${htmlPath}" must contain <script src="packages/test/dart.js">' |
+ '</script>.'); |
+ } |
+ |
return new Future.sync(() { |
if (_pubServeUrl != null) { |
- var suitePrefix = p.relative(path, from: p.join(_root, 'test')) + |
- '.browser_test'; |
- var jsUrl = _pubServeUrl.resolve('$suitePrefix.dart.js'); |
- return _pubServeSuite(path, jsUrl).then((_) => |
- _pubServeUrl.resolve('$suitePrefix.html')); |
+ var suitePrefix = p.withoutExtension( |
+ p.relative(path, from: p.join(_root, 'test'))); |
+ var jsUrl = _pubServeUrl.resolve( |
+ '$suitePrefix.dart.browser_test.dart.js'); |
+ return _pubServeSuite(path, jsUrl) |
+ .then((_) => _pubServeUrl.resolveUri(p.toUri('$suitePrefix.html'))); |
} |
return new Future.sync(() => browser.isJS ? _compileSuite(path) : null) |
.then((_) { |
if (_closed) return null; |
- return url.resolveUri( |
- p.toUri(p.relative(path, from: _root) + ".browser_test.html")); |
+ return url.resolveUri(p.toUri( |
+ p.withoutExtension(p.relative(path, from: _root)) + ".html")); |
}); |
}).then((suiteUrl) { |
if (_closed) return null; |