diff --git a/CHANGELOG.md b/CHANGELOG.md
index cc9005b..04d6eea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.12.4+8
+
+* Don't compile tests to JavaScript when running via `pub serve` on Dartium or
+  content shell.
+
 ## 0.12.4+7
 
 * Support `http_parser` 1.0.0.
diff --git a/lib/src/runner/browser/server.dart b/lib/src/runner/browser/server.dart
index 658236b..b0505d7 100644
--- a/lib/src/runner/browser/server.dart
+++ b/lib/src/runner/browser/server.dart
@@ -230,21 +230,21 @@
       var suitePrefix = p.withoutExtension(
           p.relative(path, from: p.join(_root, 'test')));
 
-      var jsUrl;
+      var dartUrl;
       // Polymer generates a bootstrap entrypoint that wraps the entrypoint we
       // see on disk, and modifies the HTML file to point to the bootstrap
       // instead. To make sure we get the right source maps and wait for the
       // right file to compile, we have some Polymer-specific logic here to load
       // the boostrap instead of the unwrapped file.
       if (isPolymerEntrypoint(path)) {
-        jsUrl = _config.pubServeUrl.resolve(
-            "$suitePrefix.html.polymer.bootstrap.dart.browser_test.dart.js");
+        dartUrl = _config.pubServeUrl.resolve(
+            "$suitePrefix.html.polymer.bootstrap.dart.browser_test.dart");
       } else {
-        jsUrl = _config.pubServeUrl.resolve(
-          '$suitePrefix.dart.browser_test.dart.js');
+        dartUrl = _config.pubServeUrl.resolve(
+          '$suitePrefix.dart.browser_test.dart');
       }
 
-      await _pubServeSuite(path, jsUrl);
+      await _pubServeSuite(path, dartUrl, browser);
       suiteUrl = _config.pubServeUrl.resolveUri(p.toUri('$suitePrefix.html'));
     } else {
       if (browser.isJS) await _compileSuite(path);
@@ -265,23 +265,29 @@
     return suite;
   }
 
-  /// Loads a test suite at [path] from the `pub serve` URL [jsUrl].
+  /// Loads a test suite at [path] from the `pub serve` URL [dartUrl].
   ///
   /// This ensures that only one suite is loaded at a time, and that any errors
   /// are exposed as [LoadException]s.
-  Future _pubServeSuite(String path, Uri jsUrl) {
+  Future _pubServeSuite(String path, Uri dartUrl, TestPlatform browser) {
     return _pubServePool.withResource(() async {
       var timer = new Timer(new Duration(seconds: 1), () {
         print('"pub serve" is compiling $path...');
       });
 
-      var mapUrl = jsUrl.replace(path: jsUrl.path + '.map');
+      // For browsers that run Dart compiled to JavaScript, get the source map
+      // instead of the Dart code for two reasons. We want to verify that the
+      // server's dart2js compiler is running on the Dart code, and also load
+      // the StackTraceMapper.
+      var getSourceMap = browser.isJS;
+
+      var url = getSourceMap
+          ? dartUrl.replace(path: dartUrl.path + '.js.map')
+          : dartUrl;
+
       var response;
       try {
-        // Get the source map here for two reasons. We want to verify that the
-        // server's dart2js compiler is running on the Dart code, and also load
-        // the StackTraceMapper.
-        var request = await _http.getUrl(mapUrl);
+        var request = await _http.getUrl(url);
         response = await request.close();
 
         if (response.statusCode != 200) {
@@ -290,22 +296,22 @@
           response.listen((_) {});
 
           throw new LoadException(path,
-              "Error getting $mapUrl: ${response.statusCode} "
+              "Error getting $url: ${response.statusCode} "
                   "${response.reasonPhrase}\n"
               'Make sure "pub serve" is serving the test/ directory.');
         }
 
-        if (_config.jsTrace) {
-          // Drain the response stream.
-          response.listen((_) {});
+        if (getSourceMap && !_config.jsTrace) {
+          _mappers[path] = new StackTraceMapper(
+              await UTF8.decodeStream(response),
+              mapUrl: url,
+              packageRoot: _config.pubServeUrl.resolve('packages'),
+              sdkRoot: _config.pubServeUrl.resolve('packages/\$sdk'));
           return;
         }
 
-        _mappers[path] = new StackTraceMapper(
-            await UTF8.decodeStream(response),
-            mapUrl: mapUrl,
-            packageRoot: _config.pubServeUrl.resolve('packages'),
-            sdkRoot: _config.pubServeUrl.resolve('packages/\$sdk'));
+        // Drain the response stream.
+        response.listen((_) {});
       } on IOException catch (error) {
         var message = getErrorMessage(error);
         if (error is SocketException) {
@@ -314,7 +320,7 @@
         }
 
         throw new LoadException(path,
-            "Error getting $mapUrl: $message\n"
+            "Error getting $url: $message\n"
             'Make sure "pub serve" is running.');
       } finally {
         timer.cancel();
diff --git a/pubspec.yaml b/pubspec.yaml
index b917983..bedb824 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test
-version: 0.12.4+7
+version: 0.12.4+8
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://github.com/dart-lang/test
diff --git a/test/runner/pub_serve_test.dart b/test/runner/pub_serve_test.dart
index 505c04b..b2e6ad9 100644
--- a/test/runner/pub_serve_test.dart
+++ b/test/runner/pub_serve_test.dart
@@ -121,21 +121,39 @@
       pub.kill();
     });
 
-    test("gracefully handles pub serve running on the wrong directory for "
+    group("gracefully handles pub serve running on the wrong directory for "
         "browser tests", () {
-      d.dir("web").create();
+      test("when run on Chrome", () {
+        d.dir("web").create();
 
-      var pub = runPubServe(args: ['web']);
-      var test = runTest([_pubServeArg, '-p', 'chrome']);
-      test.stdout.expect(containsInOrder([
-        '-1: compiling ${p.join("test", "my_test.dart")}',
-        'Failed to load "${p.join("test", "my_test.dart")}":',
-        '404 Not Found',
-        'Make sure "pub serve" is serving the test/ directory.'
-      ]));
-      test.shouldExit(1);
+        var pub = runPubServe(args: ['web']);
+        var test = runTest([_pubServeArg, '-p', 'chrome']);
+        test.stdout.expect(containsInOrder([
+          '-1: compiling ${p.join("test", "my_test.dart")}',
+          'Failed to load "${p.join("test", "my_test.dart")}":',
+          '404 Not Found',
+          'Make sure "pub serve" is serving the test/ directory.'
+        ]));
+        test.shouldExit(1);
 
-      pub.kill();
+        pub.kill();
+      });
+
+      test("when run on content shell", () {
+        d.dir("web").create();
+
+        var pub = runPubServe(args: ['web']);
+        var test = runTest([_pubServeArg, '-p', 'content-shell']);
+        test.stdout.expect(containsInOrder([
+          '-1: loading ${p.join("test", "my_test.dart")}',
+          'Failed to load "${p.join("test", "my_test.dart")}":',
+          '404 Not Found',
+          'Make sure "pub serve" is serving the test/ directory.'
+        ]));
+        test.shouldExit(1);
+
+        pub.kill();
+      });
     });
 
     test("gracefully handles unconfigured transformers", () {
