Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: tools/testing/dart/browser_controller.dart

Issue 1871883002: Make Safari tests more robust. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Status updates and fix a typo. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
Bill Hesse 2016/04/25 08:20:18 This is not rebased to the current version of brow
ahe 2016/05/24 08:44:42 Done.
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 library browser; 4 library browser;
5 5
6 import "dart:async"; 6 import "dart:async";
7 import "dart:convert" show LineSplitter, UTF8, JSON; 7 import "dart:convert" show LineSplitter, UTF8, JSON;
8 import "dart:core"; 8 import "dart:core";
9 import "dart:io"; 9 import "dart:io";
10 10
11 import 'android.dart'; 11 import 'android.dart';
12 import 'http_server.dart'; 12 import 'http_server.dart';
13 import 'path.dart'; 13 import 'path.dart';
14 import 'utils.dart'; 14 import 'utils.dart';
15 15
16 import 'reset_safari.dart' show
17 killAndResetSafari;
18
16 class BrowserOutput { 19 class BrowserOutput {
17 final StringBuffer stdout = new StringBuffer(); 20 final StringBuffer stdout = new StringBuffer();
18 final StringBuffer stderr = new StringBuffer(); 21 final StringBuffer stderr = new StringBuffer();
19 final StringBuffer eventLog = new StringBuffer(); 22 final StringBuffer eventLog = new StringBuffer();
20 } 23 }
21 24
22 /** Class describing the interface for communicating with browsers. */ 25 /** Class describing the interface for communicating with browsers. */
23 abstract class Browser { 26 abstract class Browser {
24 BrowserOutput _allBrowserOutput = new BrowserOutput(); 27 BrowserOutput _allBrowserOutput = new BrowserOutput();
25 BrowserOutput _testBrowserOutput = new BrowserOutput(); 28 BrowserOutput _testBrowserOutput = new BrowserOutput();
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 return browser; 92 return browser;
90 } 93 }
91 94
92 static const List<String> SUPPORTED_BROWSERS = 95 static const List<String> SUPPORTED_BROWSERS =
93 const ['safari', 'ff', 'firefox', 'chrome', 'ie9', 'ie10', 96 const ['safari', 'ff', 'firefox', 'chrome', 'ie9', 'ie10',
94 'ie11', 'dartium']; 97 'ie11', 'dartium'];
95 98
96 static const List<String> BROWSERS_WITH_WINDOW_SUPPORT = 99 static const List<String> BROWSERS_WITH_WINDOW_SUPPORT =
97 const ['ie11', 'ie10']; 100 const ['ie11', 'ie10'];
98 101
102 /// If [browserName] doesn't support Window.open, we use iframes instead.
103 static bool requiresIframe(String browserName) {
104 return !BROWSERS_WITH_WINDOW_SUPPORT.contains(browserName);
105 }
106
107 static bool requiresFocus(String browserName) {
108 return browserName == "safari";
109 }
110
99 // TODO(kustermann): add standard support for chrome on android 111 // TODO(kustermann): add standard support for chrome on android
100 static bool supportedBrowser(String name) { 112 static bool supportedBrowser(String name) {
101 return SUPPORTED_BROWSERS.contains(name); 113 return SUPPORTED_BROWSERS.contains(name);
102 } 114 }
103 115
104 void _logEvent(String event) { 116 void _logEvent(String event) {
105 String toLog = "$this ($id) - $event \n"; 117 String toLog = "$this ($id) - $event \n";
106 if (debugPrint) print("usageLog: $toLog"); 118 if (debugPrint) print("usageLog: $toLog");
107 if (logger != null) logger(toLog); 119 if (logger != null) logger(toLog);
108 120
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 Future<bool> start(String url); 274 Future<bool> start(String url);
263 } 275 }
264 276
265 class Safari extends Browser { 277 class Safari extends Browser {
266 /** 278 /**
267 * We get the safari version by parsing a version file 279 * We get the safari version by parsing a version file
268 */ 280 */
269 static const String versionFile = 281 static const String versionFile =
270 "/Applications/Safari.app/Contents/version.plist"; 282 "/Applications/Safari.app/Contents/version.plist";
271 283
272 /** 284 static const String safariBundleLocation = "/Applications/Safari.app/";
273 * Directories where safari stores state. We delete these if the deleteCache
274 * is set
275 */
276 static const List<String> CACHE_DIRECTORIES =
277 const ["Library/Caches/com.apple.Safari",
278 "Library/Safari",
279 "Library/Saved Application State/com.apple.Safari.savedState",
280 "Library/Caches/Metadata/Safari"];
281
282 285
283 Future<bool> allowPopUps() { 286 Future<bool> allowPopUps() {
284 var command = "defaults"; 287 // DO NOT SUBMIT.
Bill Hesse 2016/04/25 08:20:18 This comment says "do not submit". Should we remo
ahe 2016/05/24 08:44:42 Done.
285 var args = ["write", "com.apple.safari", 288 return new Future.value(true);
286 "com.apple.Safari.ContentPageGroupIdentifier."
287 "WebKit2JavaScriptCanOpenWindowsAutomatically",
288 "1"];
289 return Process.run(command, args).then((result) {
290 if (result.exitCode != 0) {
291 _logEvent("Could not disable pop-up blocking for safari");
292 return false;
293 }
294 return true;
295 });
296 }
297
298 Future<bool> deleteIfExists(Iterator<String> paths) {
299 if (!paths.moveNext()) return new Future.value(true);
300 Directory directory = new Directory(paths.current);
301 return directory.exists().then((exists) {
302 if (exists) {
303 _logEvent("Deleting ${paths.current}");
304 return directory.delete(recursive: true)
305 » .then((_) => deleteIfExists(paths))
306 » .catchError((error) {
307 » _logEvent("Failure trying to delete ${paths.current}: $error");
308 » return false;
309 » });
310 } else {
311 _logEvent("${paths.current} is not present");
312 return deleteIfExists(paths);
313 }
314 });
315 } 289 }
316 290
317 // Clears the cache if the static deleteCache flag is set. 291 // Clears the cache if the static deleteCache flag is set.
318 // Returns false if the command to actually clear the cache did not complete. 292 // Returns false if the command to actually clear the cache did not complete.
319 Future<bool> clearCache() { 293 Future<bool> clearCache() async {
320 if (!Browser.deleteCache) return new Future.value(true); 294 if (!Browser.deleteCache) return true;
321 var home = Platform.environment['HOME']; 295
322 Iterator iterator = CACHE_DIRECTORIES.map((s) => "$home/$s").iterator; 296 Completer completer = new Completer();
323 return deleteIfExists(iterator); 297 handleUncaughtError(error, StackTrace stackTrace) {
298 if (!completer.isCompleted) {
299 completer.completeError(error, stackTrace);
300 } else {
301 throw new AsyncError(error, stackTrace);
302 }
303 }
304 Zone parent = Zone.current;
Bill Hesse 2016/04/25 08:20:18 Add a comment for why we are using the zone - is i
ahe 2016/05/24 08:44:42 Done.
305 ZoneSpecification specification = new ZoneSpecification(
306 print: (Zone self, ZoneDelegate delegate, Zone zone, String line) {
307 delegate.run(parent, () {
308 _logEvent(line);
309 });
310 });
311 Future zoneWrapper() {
312 Uri safariUri = Uri.base.resolve(safariBundleLocation);
313 return new Future(() => killAndResetSafari(bundle: safariUri))
314 .then(completer.complete);
315 }
316
317 runZoned(
318 zoneWrapper, zoneSpecification: specification,
319 onError: handleUncaughtError);
320
321 try {
322 await completer.future;
323 return true;
324 } catch (error, st) {
325 _logEvent("Unable to reset Safari: $error$st");
326 return false;
327 }
324 } 328 }
325 329
326 Future<String> getVersion() { 330 Future<String> getVersion() {
327 /** 331 /**
328 * Example of the file: 332 * Example of the file:
329 * <?xml version="1.0" encoding="UTF-8"?> 333 * <?xml version="1.0" encoding="UTF-8"?>
330 * <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.co m/DTDs/PropertyList-1.0.dtd"> 334 * <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.co m/DTDs/PropertyList-1.0.dtd">
331 * <plist version="1.0"> 335 * <plist version="1.0">
332 * <dict> 336 * <dict>
333 * <key>BuildVersion</key> 337 * <key>BuildVersion</key>
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 if (!cleared) { 378 if (!cleared) {
375 _logEvent("Could not clear cache"); 379 _logEvent("Could not clear cache");
376 return false; 380 return false;
377 } 381 }
378 // Get the version and log that. 382 // Get the version and log that.
379 return getVersion().then((version) { 383 return getVersion().then((version) {
380 _logEvent("Got version: $version"); 384 _logEvent("Got version: $version");
381 return Directory.systemTemp.createTemp().then((userDir) { 385 return Directory.systemTemp.createTemp().then((userDir) {
382 _cleanup = () { userDir.deleteSync(recursive: true); }; 386 _cleanup = () { userDir.deleteSync(recursive: true); };
383 _createLaunchHTML(userDir.path, url); 387 _createLaunchHTML(userDir.path, url);
384 var args = ["${userDir.path}/launch.html"]; 388 var args = [
385 return startBrowser(_binary, args); 389 "-d", "-i", "-m", "-s", "-u", _binary,
390 "${userDir.path}/launch.html"];
391 return startBrowser("/usr/bin/caffeinate", args);
386 }); 392 });
387 }).catchError((error) { 393 }).catchError((error) {
388 _logEvent("Running $_binary --version failed with $error"); 394 _logEvent("Running $_binary --version failed with $error");
389 return false; 395 return false;
390 }); 396 });
391 }); 397 });
392 }); 398 });
393 } 399 }
394 400
395 String toString() => "Safari"; 401 String toString() => "Safari";
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 * whenever a test completes. 855 * whenever a test completes.
850 */ 856 */
851 class BrowserTestRunner { 857 class BrowserTestRunner {
852 static const int MAX_NEXT_TEST_TIMEOUTS = 10; 858 static const int MAX_NEXT_TEST_TIMEOUTS = 10;
853 static const Duration NEXT_TEST_TIMEOUT = const Duration(seconds: 60); 859 static const Duration NEXT_TEST_TIMEOUT = const Duration(seconds: 60);
854 static const Duration RESTART_BROWSER_INTERVAL = const Duration(seconds: 60); 860 static const Duration RESTART_BROWSER_INTERVAL = const Duration(seconds: 60);
855 861
856 final Map configuration; 862 final Map configuration;
857 863
858 final String localIp; 864 final String localIp;
859 String browserName; 865 final String browserName;
860 final int maxNumBrowsers; 866 final int maxNumBrowsers;
861 bool checkedMode; 867 bool checkedMode;
862 // Used to send back logs from the browser (start, stop etc) 868 // Used to send back logs from the browser (start, stop etc)
863 Function logger; 869 Function logger;
864 int browserIdCount = 0; 870 int browserIdCount = 0;
865 871
866 bool underTermination = false; 872 bool underTermination = false;
867 int numBrowserGetTestTimeouts = 0; 873 int numBrowserGetTestTimeouts = 0;
868 874
869 List<BrowserTest> testQueue = new List<BrowserTest>(); 875 List<BrowserTest> testQueue = new List<BrowserTest>();
870 Map<String, BrowserTestingStatus> browserStatus = 876 Map<String, BrowserTestingStatus> browserStatus =
871 new Map<String, BrowserTestingStatus>(); 877 new Map<String, BrowserTestingStatus>();
872 878
873 var adbDeviceMapping = new Map<String, AdbDevice>(); 879 var adbDeviceMapping = new Map<String, AdbDevice>();
874 // This cache is used to guarantee that we never see double reporting. 880 // This cache is used to guarantee that we never see double reporting.
875 // If we do we need to provide developers with this information. 881 // If we do we need to provide developers with this information.
876 // We don't add urls to the cache until we have run it. 882 // We don't add urls to the cache until we have run it.
877 Map<int, String> testCache = new Map<int, String>(); 883 Map<int, String> testCache = new Map<int, String>();
878 Map<int, String> doubleReportingOutputs = new Map<int, String>(); 884 Map<int, String> doubleReportingOutputs = new Map<int, String>();
879 885
880 BrowserTestingServer testingServer; 886 final BrowserTestingServer testingServer;
881 887
882 /** 888 /**
883 * The TestRunner takes the testingServer in as a constructor parameter in 889 * The TestRunner takes the testingServer in as a constructor parameter in
884 * case we wish to have a testing server with different behavior (such as the 890 * case we wish to have a testing server with different behavior (such as the
Bill Hesse 2016/04/25 08:20:18 If we are removing the testingServer argument, the
ahe 2016/05/24 08:44:42 Done.
885 * case for performance testing. 891 * case for performance testing.
886 */ 892 */
887 BrowserTestRunner(this.configuration, 893 BrowserTestRunner(
888 this.localIp, 894 Map configuration,
889 this.browserName, 895 String localIp,
890 this.maxNumBrowsers, 896 String browserName,
891 {BrowserTestingServer this.testingServer}) { 897 this.maxNumBrowsers)
892 checkedMode = configuration['checked']; 898 : configuration = configuration,
893 } 899 localIp = localIp,
900 browserName = browserName,
901 checkedMode = configuration['checked'],
902 testingServer = new BrowserTestingServer(
903 configuration, localIp,
904 Browser.requiresIframe(browserName),
905 Browser.requiresFocus(browserName));
894 906
895 Future<bool> start() { 907 Future<bool> start() {
896 // If [browserName] doesn't support opening new windows, we use new iframes
897 // instead.
898 bool useIframe =
899 !Browser.BROWSERS_WITH_WINDOW_SUPPORT.contains(browserName);
900 if (testingServer == null) {
901 testingServer = new BrowserTestingServer(
902 configuration, localIp, useIframe);
903 }
904 return testingServer.start().then((_) { 908 return testingServer.start().then((_) {
905 testingServer.testDoneCallBack = handleResults; 909 testingServer.testDoneCallBack = handleResults;
906 testingServer.testStatusUpdateCallBack = handleStatusUpdate; 910 testingServer.testStatusUpdateCallBack = handleStatusUpdate;
907 testingServer.testStartedCallBack = handleStarted; 911 testingServer.testStartedCallBack = handleStarted;
908 testingServer.nextTestCallBack = getNextTest; 912 testingServer.nextTestCallBack = getNextTest;
909 return getBrowsers().then((browsers) { 913 return getBrowsers().then((browsers) {
910 var futures = []; 914 var futures = [];
911 for (var browser in browsers) { 915 for (var browser in browsers) {
912 var url = testingServer.getDriverUrl(browser.id); 916 var url = testingServer.getDriverUrl(browser.id);
913 var future = browser.start(url).then((success) { 917 var future = browser.start(url).then((success) {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 /// and run tests ... 1300 /// and run tests ...
1297 /// GET /next_test/BROWSER_ID -- returns "WAIT" "TERMINATE" or "url#id" 1301 /// GET /next_test/BROWSER_ID -- returns "WAIT" "TERMINATE" or "url#id"
1298 /// where url is the test to run, and id is the id of the test. 1302 /// where url is the test to run, and id is the id of the test.
1299 /// If there are currently no available tests the waitSignal is send 1303 /// If there are currently no available tests the waitSignal is send
1300 /// back. If we are in the process of terminating the terminateSignal 1304 /// back. If we are in the process of terminating the terminateSignal
1301 /// is send back and the browser will stop requesting new tasks. 1305 /// is send back and the browser will stop requesting new tasks.
1302 /// POST /report/BROWSER_ID?id=NUM -- sends back the dom of the executed 1306 /// POST /report/BROWSER_ID?id=NUM -- sends back the dom of the executed
1303 /// test 1307 /// test
1304 1308
1305 final String localIp; 1309 final String localIp;
1310 final bool useIframe;
1311 final bool requiresFocus;
1306 1312
1307 static const String driverPath = "/driver"; 1313 static const String driverPath = "/driver";
1308 static const String nextTestPath = "/next_test"; 1314 static const String nextTestPath = "/next_test";
1309 static const String reportPath = "/report"; 1315 static const String reportPath = "/report";
1310 static const String statusUpdatePath = "/status_update"; 1316 static const String statusUpdatePath = "/status_update";
1311 static const String startedPath = "/started"; 1317 static const String startedPath = "/started";
1312 static const String waitSignal = "WAIT"; 1318 static const String waitSignal = "WAIT";
1313 static const String terminateSignal = "TERMINATE"; 1319 static const String terminateSignal = "TERMINATE";
1314 1320
1315 var testCount = 0; 1321 var testCount = 0;
1316 var errorReportingServer; 1322 var errorReportingServer;
1317 bool underTermination = false; 1323 bool underTermination = false;
1318 bool useIframe = false;
1319 1324
1320 Function testDoneCallBack; 1325 Function testDoneCallBack;
1321 Function testStatusUpdateCallBack; 1326 Function testStatusUpdateCallBack;
1322 Function testStartedCallBack; 1327 Function testStartedCallBack;
1323 Function nextTestCallBack; 1328 Function nextTestCallBack;
1324 1329
1325 BrowserTestingServer(this.configuration, this.localIp, this.useIframe); 1330 BrowserTestingServer(
1331 this.configuration, this.localIp, this.useIframe, this.requiresFocus);
1326 1332
1327 Future start() { 1333 Future start() {
1328 var test_driver_error_port = configuration['test_driver_error_port']; 1334 var test_driver_error_port = configuration['test_driver_error_port'];
1329 return HttpServer.bind(localIp, test_driver_error_port) 1335 return HttpServer.bind(localIp, test_driver_error_port)
1330 .then(setupErrorServer) 1336 .then(setupErrorServer)
1331 .then(setupDispatchingServer); 1337 .then(setupDispatchingServer);
1332 } 1338 }
1333 1339
1334 void setupErrorServer(HttpServer server) { 1340 void setupErrorServer(HttpServer server) {
1335 errorReportingServer = server; 1341 errorReportingServer = server;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 }); 1385 });
1380 server.addHandler(startedPath, (HttpRequest request) { 1386 server.addHandler(startedPath, (HttpRequest request) {
1381 noCache(request); 1387 noCache(request);
1382 handleStarted(request, browserId(request, startedPath), 1388 handleStarted(request, browserId(request, startedPath),
1383 testId(request)); 1389 testId(request));
1384 }); 1390 });
1385 1391
1386 makeSendPageHandler(String prefix) => (HttpRequest request) { 1392 makeSendPageHandler(String prefix) => (HttpRequest request) {
1387 noCache(request); 1393 noCache(request);
1388 var textResponse = ""; 1394 var textResponse = "";
1395 bool isStartup = false;
1389 if (prefix == driverPath) { 1396 if (prefix == driverPath) {
1397 isStartup = true;
1390 textResponse = getDriverPage(browserId(request, prefix)); 1398 textResponse = getDriverPage(browserId(request, prefix));
1391 request.response.headers.set('Content-Type', 'text/html'); 1399 request.response.headers.set('Content-Type', 'text/html');
1392 } 1400 }
1393 if (prefix == nextTestPath) { 1401 if (prefix == nextTestPath) {
1394 textResponse = getNextTest(browserId(request, prefix)); 1402 textResponse = getNextTest(browserId(request, prefix));
1395 request.response.headers.set('Content-Type', 'text/plain'); 1403 request.response.headers.set('Content-Type', 'text/plain');
1396 } 1404 }
1397 request.response.write(textResponse); 1405 request.response.write(textResponse);
1398 request.listen((_) {}, onDone: request.response.close); 1406 closeResponse(_) {
1407 // Ignoring the returned closure as it returns the 'done' future which
1408 // alread has catchError installed (see below).
1409 request.response.close();
1410 }
1411 request.listen((_) {}, onDone: () {
1412 if (isStartup && requiresFocus) {
Bill Hesse 2016/04/25 08:20:19 Could we put this into the BrowserController objec
ahe 2016/05/24 08:44:42 Done.
1413 Process.run(
1414 "/usr/bin/osascript",
1415 ['-e', 'tell application "Safari" to activate'])
1416 .then(closeResponse);
1417 } else {
1418 closeResponse(null);
1419 }
1420 });
1399 request.response.done.catchError((error) { 1421 request.response.done.catchError((error) {
1400 if (!underTermination) { 1422 if (!underTermination) {
1401 print("URI ${request.uri}"); 1423 print("URI ${request.uri}");
1402 print("Textresponse $textResponse"); 1424 print("Textresponse $textResponse");
1403 throw "Error returning content to browser: $error"; 1425 throw "Error returning content to browser: $error";
1404 } 1426 }
1405 }); 1427 });
1406 }; 1428 };
1407 server.addHandler(driverPath, makeSendPageHandler(driverPath)); 1429 server.addHandler(driverPath, makeSendPageHandler(driverPath));
1408 server.addHandler(nextTestPath, makeSendPageHandler(nextTestPath)); 1430 server.addHandler(nextTestPath, makeSendPageHandler(nextTestPath));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1455 "produce driver url"); 1477 "produce driver url");
1456 exit(1); 1478 exit(1);
1457 // This should never happen - exit immediately; 1479 // This should never happen - exit immediately;
1458 } 1480 }
1459 var port = configuration['_servers_'].port; 1481 var port = configuration['_servers_'].port;
1460 return "http://$localIp:$port/driver/$browserId"; 1482 return "http://$localIp:$port/driver/$browserId";
1461 } 1483 }
1462 1484
1463 1485
1464 String getDriverPage(String browserId) { 1486 String getDriverPage(String browserId) {
1487
Bill Hesse 2016/04/25 08:20:19 I think this blank line should go. Do we run this
ahe 2016/05/24 08:44:42 Done.
1465 var errorReportingUrl = 1488 var errorReportingUrl =
1466 "http://$localIp:${errorReportingServer.port}/$browserId"; 1489 "http://$localIp:${errorReportingServer.port}/$browserId";
1467 String driverContent = """ 1490 String driverContent = """
1468 <!DOCTYPE html><html> 1491 <!DOCTYPE html><html>
1469 <head> 1492 <head>
1493 <title>Driving page</title>
1470 <style> 1494 <style>
1471 body { 1495 .big-notice {
1472 margin: 0; 1496 background-color: red;
1473 } 1497 color: white;
1474 .box { 1498 font-weight: bold;
1475 overflow: hidden; 1499 font-size: xx-large;
1476 overflow-y: auto; 1500 text-align: center;
1477 position: absolute; 1501 }
1478 left: 0; 1502 .controller.box {
1479 right: 0; 1503 white-space: nowrap;
1480 } 1504 overflow: scroll;
1481 .controller.box { 1505 height: 6em;
1482 height: 75px; 1506 }
1483 top: 0; 1507 body {
1484 } 1508 font-family: sans-serif;
1485 .test.box { 1509 }
1486 top: 75px; 1510 body div {
1487 bottom: 0; 1511 padding-top: 10px;
1488 } 1512 }
1489 </style> 1513 </style>
1490 <title>Driving page</title>
1491 <script type='text/javascript'> 1514 <script type='text/javascript'>
1492 var STATUS_UPDATE_INTERVAL = 10000; 1515 var STATUS_UPDATE_INTERVAL = 10000;
1493 1516
1494 function startTesting() { 1517 function startTesting() {
1495 var number_of_tests = 0; 1518 var number_of_tests = 0;
1496 var current_id; 1519 var current_id;
1497 var next_id; 1520 var next_id;
1498 1521
1499 // Has the test in the current iframe reported that it is done? 1522 // Has the test in the current iframe reported that it is done?
1500 var test_completed = true; 1523 var test_completed = true;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1610 if (use_iframe) { 1633 if (use_iframe) {
1611 if (html_test) { 1634 if (html_test) {
1612 window.addEventListener('detect_errors', setChildHandlers, false); 1635 window.addEventListener('detect_errors', setChildHandlers, false);
1613 embedded_iframe.onload = checkChildHandlersInstalled; 1636 embedded_iframe.onload = checkChildHandlersInstalled;
1614 } else { 1637 } else {
1615 embedded_iframe.onload = null; 1638 embedded_iframe.onload = null;
1616 } 1639 }
1617 embedded_iframe_div.removeChild(embedded_iframe); 1640 embedded_iframe_div.removeChild(embedded_iframe);
1618 embedded_iframe = document.createElement('iframe'); 1641 embedded_iframe = document.createElement('iframe');
1619 embedded_iframe.id = "embedded_iframe"; 1642 embedded_iframe.id = "embedded_iframe";
1620 embedded_iframe.style="width:100%;height:100%"; 1643 embedded_iframe.width='800px';
1644 embedded_iframe.height='600px';
1621 embedded_iframe_div.appendChild(embedded_iframe); 1645 embedded_iframe_div.appendChild(embedded_iframe);
1622 embedded_iframe.src = url; 1646 embedded_iframe.src = url;
1623 } else { 1647 } else {
1624 if (typeof testing_window != 'undefined') { 1648 if (typeof testing_window != 'undefined') {
1625 testing_window.close(); 1649 testing_window.close();
1626 } 1650 }
1627 testing_window = window.open(url); 1651 testing_window = window.open(url);
1628 } 1652 }
1629 test_started = false; 1653 test_started = false;
1630 test_completed = false; 1654 test_completed = false;
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1782 1806
1783 if (!html_test) { 1807 if (!html_test) {
1784 window.addEventListener('message', messageHandler, false); 1808 window.addEventListener('message', messageHandler, false);
1785 waitForDone = false; 1809 waitForDone = false;
1786 } 1810 }
1787 getNextTask(); 1811 getNextTask();
1788 } 1812 }
1789 </script> 1813 </script>
1790 </head> 1814 </head>
1791 <body onload="startTesting()"> 1815 <body onload="startTesting()">
1816
1817 <div class='big-notice'>
1818 Please keep this window in focus at all times.
1819 </div>
1820
1821 <div>
1822 Some browsers, Safari, in particular, may pause JavaScript when not
1823 visible to conserve power consumption and CPU resources. In addition,
1824 some tests of focus events will not work correctly if this window doesn't
1825 have focus. It's also advisable to close any other programs that may open
1826 modal dialogs, for example, Chrome with Calendar open.
1827 </div>
1828
1792 <div class="controller box"> 1829 <div class="controller box">
1793 Dart test driver, number of tests: <span id="number"></span><br> 1830 Dart test driver, number of tests: <span id="number"></span><br>
1794 Currently executing: <span id="currently_executing"></span><br> 1831 Currently executing: <span id="currently_executing"></span><br>
1795 Unhandled error: <span id="unhandled_error"></span> 1832 Unhandled error: <span id="unhandled_error"></span>
1796 </div> 1833 </div>
1797 <div id="embedded_iframe_div" class="test box"> 1834 <div id="embedded_iframe_div" class="test box">
1798 <iframe style="width:100%;height:100%;" id="embedded_iframe"></iframe> 1835 <iframe id="embedded_iframe"></iframe>
1799 </div> 1836 </div>
1800 </body> 1837 </body>
1801 </html> 1838 </html>
1802 """; 1839 """;
1803 return driverContent; 1840 return driverContent;
1804 } 1841 }
1805 } 1842 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698