Merge from Chromium at DEPS revision r213371

This commit was generated by merge_to_master.py.

Change-Id: I03fae1c1dae6e5de12e56e0a6c3780252291bfae
diff --git a/Tools/TestResultServer/model/datastorefile.py b/Tools/TestResultServer/model/datastorefile.py
index 8dca34d..6161c37 100755
--- a/Tools/TestResultServer/model/datastorefile.py
+++ b/Tools/TestResultServer/model/datastorefile.py
@@ -32,7 +32,7 @@
 from google.appengine.ext import blobstore
 from google.appengine.ext import db
 
-MAX_DATA_ENTRY_PER_FILE = 20
+MAX_DATA_ENTRY_PER_FILE = 30
 MAX_ENTRY_LEN = 1000 * 1000
 
 
diff --git a/Tools/TestResultServer/model/jsonresults.py b/Tools/TestResultServer/model/jsonresults.py
index 35b56c9..9976b67 100755
--- a/Tools/TestResultServer/model/jsonresults.py
+++ b/Tools/TestResultServer/model/jsonresults.py
@@ -449,7 +449,7 @@
         aggregated_json[builder][FAILURE_MAP_KEY] = CHAR_TO_FAILURE
 
         is_debug_builder = re.search(r"(Debug|Dbg)", builder, re.I)
-        run_time_pruning_threshold = 2 * JSON_RESULTS_MIN_TIME if is_debug_builder else JSON_RESULTS_MIN_TIME
+        run_time_pruning_threshold = 3 * JSON_RESULTS_MIN_TIME if is_debug_builder else JSON_RESULTS_MIN_TIME
         cls._normalize_results(aggregated_json[builder][TESTS_KEY], num_runs, run_time_pruning_threshold)
         return cls._generate_file_data(aggregated_json, sort_keys), 200
 
diff --git a/Tools/TestResultServer/model/jsonresults_unittest.py b/Tools/TestResultServer/model/jsonresults_unittest.py
index def7004..cef590b 100755
--- a/Tools/TestResultServer/model/jsonresults_unittest.py
+++ b/Tools/TestResultServer/model/jsonresults_unittest.py
@@ -848,7 +848,7 @@
             {"builds": ["2", "1"],
              "tests": {"001.html": {
                            "results": [[200, PASS]],
-                           "times": [[200, 2 * jsonresults.JSON_RESULTS_MIN_TIME]]},
+                           "times": [[200, 3 * jsonresults.JSON_RESULTS_MIN_TIME]]},
                        "002.html": {
                            "results": [[10, TEXT]],
                            "times": [[10, 0]]}}},
@@ -867,7 +867,7 @@
             {"builds": ["3", "2", "1"],
              "tests": {"001.html": {
                            "results": [[201, PASS]],
-                           "times": [[1, 1], [200, 2 * jsonresults.JSON_RESULTS_MIN_TIME]]},
+                           "times": [[1, 1], [200, 3 * jsonresults.JSON_RESULTS_MIN_TIME]]},
                        "002.html": {
                            "results": [[1, PASS], [10, TEXT]],
                            "times": [[11, 0]]}}})
diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js
index c944b4c..b426032 100644
--- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js
+++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js
@@ -31,7 +31,6 @@
 //////////////////////////////////////////////////////////////////////////////
 var FORWARD = 'forward';
 var BACKWARD = 'backward';
-var GTEST_MODIFIERS = ['FLAKY', 'FAILS', 'MAYBE', 'DISABLED'];
 var TEST_URL_BASE_PATH_FOR_BROWSING = 'http://src.chromium.org/viewvc/blink/trunk/LayoutTests/';
 var TEST_URL_BASE_PATH_FOR_XHR = 'http://src.chromium.org/blink/trunk/LayoutTests/';
 var TEST_RESULTS_BASE_PATH = 'http://build.chromium.org/f/chromium/layout_test_results/';
@@ -110,7 +109,8 @@
             function() {
                 // Get all possible headers since the actual used set of headers
                 // depends on the values in historyInstance.dashboardSpecificState, which are currently being set.
-                var headers = tableHeaders(true);
+                var getAllTableHeaders = true;
+                var headers = tableHeaders(getAllTableHeaders);
                 for (var i = 0; i < headers.length; i++) {
                     if (value == sortColumnFromTableHeader(headers[i]))
                         return true;
@@ -315,29 +315,16 @@
     return individualTestsForSubstringList();
 }
 
-function substringList()
+function splitTestList()
 {
-    // Convert windows slashes to unix slashes.
-    var tests = g_history.dashboardSpecificState.tests.replace(/\\/g, '/');
-    var separator = string.contains(tests, ' ') ? ' ' : ',';
-    var testList = tests.split(separator);
-
-    if (g_history.isLayoutTestResults())
-        return testList;
-
-    var testListWithoutModifiers = [];
-    testList.forEach(function(path) {
-        GTEST_MODIFIERS.forEach(function(modifier) {
-            path = path.replace('.' + modifier + '_', '.');
-        });
-        testListWithoutModifiers.push(path);
-    });
-    return testListWithoutModifiers;
+    // Convert windows slashes to unix slashes and spaces/newlines to commas.
+    var tests = g_history.dashboardSpecificState.tests.replace(/\\/g, '/').replace('\n', ' ').replace(/\s+/g, ',');
+    return tests.split(',');
 }
 
 function individualTestsForSubstringList()
 {
-    var testList = substringList();
+    var testList = splitTestList();
     // If listing a lot of tests, assume you've passed in an explicit list of tests
     // instead of patterns to match against. The matching code below is super slow.
     //
@@ -662,19 +649,15 @@
     return html;
 }
 
-function htmlForSingleTestRow(test)
+function htmlForSingleTestRow(test, showBuilderNames)
 {
     var headers = tableHeaders();
     var html = '';
     for (var i = 0; i < headers.length; i++) {
         var header = headers[i];
         if (string.startsWith(header, 'test') || string.startsWith(header, 'builder')) {
-            // If isCrossBuilderView() is true, we're just viewing a single test
-            // with results for many builders, so the first column is builder names
-            // instead of test paths.
-            var testCellClassName = 'test-link' + (isCrossBuilderView() ? ' builder-name' : '');
-            var testCellHTML = isCrossBuilderView() ? test.builder : '<span class="link" onclick="g_history.setQueryParameter(\'tests\',\'' + test.test +'\');">' + test.test + '</span>';
-
+            var testCellClassName = 'test-link' + (showBuilderNames ? ' builder-name' : '');
+            var testCellHTML = showBuilderNames ? test.builder : '<span class="link" onclick="g_history.setQueryParameter(\'tests\',\'' + test.test +'\');">' + test.test + '</span>';
             html += '<tr><td class="' + testCellClassName + '">' + testCellHTML;
         } else if (string.startsWith(header, 'bugs'))
             // FIXME: linkify bugs.
@@ -812,7 +795,8 @@
     var shownBuilders = [];
     for (var j = 0; j < testResults.length; j++) {
         shownBuilders.push(testResults[j].builder);
-        html += htmlForSingleTestRow(testResults[j]);
+        var showBuilderNames = true;
+        html += htmlForSingleTestRow(testResults[j], showBuilderNames);
     }
 
     var skippedBuilders = []
@@ -1061,7 +1045,7 @@
     expectationsContainer.appendChild(container);
     for (var i = 0; i < failureIndexes.length; i++) {
         // FIXME: This doesn't seem to work anymore. Did the paths change?
-        // Once that's resolved, see if we need to try each GTEST_MODIFIERS prefix as well.
+        // Once that's resolved, see if we need to try each gtest modifier prefix as well.
         var buildNumber = g_resultsByBuilder[builder].buildNumbers[failureIndexes[i]];
         var pathToLog = builders.master(builder).logPath(builder, buildNumber) + pathToFailureLog(test);
         appendNonWebKitResults(container, pathToLog, 'non-webkit-results');
@@ -1276,8 +1260,9 @@
     var testsHTML = '';
     if (filteredResults.length) {
         var tableRowsHTML = '';
+        var showBuilderNames = false;
         for (var i = 0; i < filteredResults.length; i++)
-            tableRowsHTML += htmlForSingleTestRow(filteredResults[i])
+            tableRowsHTML += htmlForSingleTestRow(filteredResults[i], showBuilderNames)
         testsHTML = htmlForTestTable(tableRowsHTML);
     } else {
         if (g_history.isLayoutTestResults())
diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js b/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js
index a9c39c9..bcccd2f 100644
--- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js
+++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard_unittests.js
@@ -62,17 +62,12 @@
 var FAILURE_MAP = {"A": "AUDIO", "C": "CRASH", "F": "TEXT", "I": "IMAGE", "O": "MISSING",
     "N": "NO DATA", "P": "PASS", "T": "TIMEOUT", "Y": "NOTRUN", "X": "SKIP", "Z": "IMAGE+TEXT"}
 
-test('substringList', 2, function() {
+test('splitTestList', 1, function() {
     var historyInstance = new history.History(flakinessConfig);
     // FIXME(jparent): Remove this once global isn't used.
     g_history = historyInstance;
-    historyInstance.crossDashboardState.testType = 'gtest';
-    historyInstance.dashboardSpecificState.tests = 'test.FLAKY_foo test.FAILS_foo1 test.DISABLED_foo2 test.MAYBE_foo3 test.foo4';
-    equal(substringList().toString(), 'test.foo,test.foo1,test.foo2,test.foo3,test.foo4');
-
-    historyInstance.crossDashboardState.testType = 'layout-tests';
-    historyInstance.dashboardSpecificState.tests = 'foo/bar.FLAKY_foo.html';
-    equal(substringList().toString(), 'foo/bar.FLAKY_foo.html');
+    historyInstance.dashboardSpecificState.tests = 'test.foo test.foo1\ntest.foo2\ntest.foo3,foo\\bar\\baz.html';
+    equal(splitTestList().toString(), 'test.foo,test.foo1,test.foo2,test.foo3,foo/bar/baz.html');
 });
 
 test('headerForTestTableHtml', 1, function() {
@@ -147,7 +142,7 @@
                 '<th sortValue=flakiness colspan=10000><div class=table-header-content><span></span><span class=header-text>flakiness (numbers are runtimes in seconds)</span></div></th>' +
             '</tr></thead>' +
             '<tbody><tr>' +
-                '<td class="test-link"><span class="link" onclick="g_history.setQueryParameter(\'tests\',\'dummytest.html\');">dummytest.html</span>' +
+                '<td class="test-link builder-name">WebKit Linux' +
                 '<td class=options-container>' +
                     '<div><a href="http://crbug.com/1234">crbug.com/1234</a></div>' +
                     '<div><a href="http://webkit.org/5678">webkit.org/5678</a></div>' +