{% extends "skia_telemetry_base.html" %}

{% block content %}

<center>
{% if info_msg %}<font color="red"><b>{{ info_msg }}</b></font><br/><br/>{% endif %}

<h2>Test performance of Chromium/Blink/Skia patches on the top 10k webpages</h2>

<h3><a href="https://ct.skia.org/chromium_perf/">Submit new perf tasks here!</a></h3>
<br/>

Read <a href="https://docs.google.com/a/chromium.org/document/d/1GhqosQcwsy6F-eBAmFn_ITDF7_Iv_rY9FhCKwAnk9qQ/edit?pli=1#heading=h.lgvqzgu7bc4d">this</a> for an explanation of CT's accuracy of results.
<br/>
{{ pending_tasks_count }} tasks currently in the <a align="center" href='pending_tasks'>Queue</a>
<br/>
<a href="javascript:toggleDetails();">Show/hide run details</a>
<script type="text/javascript">
  function toggleDetails() {
    var details = ["benchmark_details", "variance_details", "outliers_details",
                   "browser_args_1_id", "browser_args_2_id"];
    for (var i=0; i<details.length; i++) {
      if (document.getElementById(details[i]).style.display == 'none') {
        document.getElementById(details[i]).style.display = '';
      } else {
        document.getElementById(details[i]).style.display = 'none';
      }
    }
  }
</script>
<br/>
<br/>

{% if not is_google_chromium_user %}
  Must have a google or chromium account to trigger benchmarks (contact rmistry@)<br/><br/>
{% else %}
  <form name="ChromiumTryForm" action="chromium_try" method="post">
  <table cellingpadding="5">
    <tr>
      <td>Benchmark to run</td>
      <td>
        <select id="benchmark_name" name="benchmark_name" onchange="populateThreshold(this)">
          {% for benchmark in supported_benchmarks %}
            <option value="{{ benchmark }}">{{ benchmark }}</option>
          {% endfor %}
        </select>
      </td>
    </tr>
    <tr id="benchmark_details" style="display:none">
      <td>Benchmark Arguments</td>
      <td>
        <input type="text" size="35" name="benchmark_arguments" value="--output-format=csv-pivot-table"/>
        The Benchmark must output in CSV to do meaningful comparisions.
      </td>
    </tr>
    <tr id="browser_args_1_id" style="display:none">
      <td>Browser Arguments (nopatch run)</td>
      <td>
        <input type="text" size="100" name="browser_args_1" value=""/>
      </td>
    </tr>
    <tr id="browser_args_2_id" style="display:none">
      <td>Browser Arguments (withpatch run)</td>
      <td>
        <input type="text" size="100" name="browser_args_2" value=""/>
      </td>
    </tr>
    <tr>
      <td>Target Platform</td>
      <td>
        <select id="target_platform" name="target_platform" onchange="setPlatformDefaults(this);">
          <option value="Android">Android (100 N5 devices)</option>
          <option value="Linux" selected>Linux (100 Ubuntu12.04 machines)</option>
        </select>
        <a id="target_platform_info"></a>
      </td>
    </tr>
    <tr>
      <td>Pagesets Type</td>
      <td>
        <select id="pageset_type" name="pageset_type">
          {% for pageset, desc in pagesets.items %}
            <option value="{{ pageset }}">{{ desc }}</option>
          {% endfor %}
        </select>
        <a id="pageset_type_info"></a>
      </td>
    </tr>
    <tr id="repeated_runs">
      <td>Repeat each page</td>
      <td>
        <select id="num_repeated_runs" name="num_repeated_runs">
          <option value="1">1</option>
          <option value="3" selected>3</option>
          <option value="5">5</option>
        </select>
        times
      </td>
    </tr>
    <tr id="variance_details" style="display:none">
      <td>Variance Threshold</td>
      <td>
        <input type="text" name="variance_threshold" size"5" value="5"/>
        <a id="variance_threshold_info"></a>
      </td>
    </tr>
    <tr id="outliers_details" style="display:none">
      <td>Discard Outliers</td>
      <td>
        <input type="text" name="discard_outliers" size"5" value="0"/>
      </td>
    </tr>
    <tr>
      <td>Description</td>
      <td><input type="text" name="description" size="35"></td>
    </tr>
    <tr>
      <td>Chromium Git patch (optional)<br/>Applied to Chromium ToT</td>
      <td>
        <textarea name="chromium_patch" cols="80" rows="15"></textarea>
      </td>
    </tr>
    <tr>
      <td>Blink Git patch (optional)<br/>Applied to Blink Rev in <a href='http://src.chromium.org/viewvc/chrome/trunk/src/DEPS'>DEPs</a></td>
      <td>
        <textarea name="blink_patch" cols="80" rows="15"></textarea>
      </td>
    </tr>
    <tr>
      <td>Skia Git patch (optional)<br/>Applied to Skia Rev in <a href='http://src.chromium.org/viewvc/chrome/trunk/src/DEPS'>DEPs</a></td>
      <td>
        <textarea name="skia_patch" cols="80" rows="15"></textarea>
      </td>
    </tr>
    <tr>
      <td colspan="2" align="center"><input type="submit" value="Queue Chromium Try Task" disabled></td>
    </tr>
  </table>
      <h3><a href="https://ct.skia.org/chromium_perf/">Submit new perf tasks here!</a></h3>

  <br/>
  <br/>

  </form>
  <script>
    function setPlatformDefaults(sel) {
      var form = sel.form,
          value = sel.options[sel.selectedIndex].value;
      switch(value) {
        case 'Android':
          form.pageset_type.value = 'Mobile10k';
          form.browser_args_1.value = '';
          form.browser_args_2.value = '';
          document.getElementById('target_platform_info').innerHTML = ''
          break;
        case 'Linux':
          form.pageset_type.value = '10k';
          default_browser_args = '--disable-setuid-sandbox '
                                 + '--enable-threaded-compositing '
                                 + '--enable-impl-side-painting';
          form.browser_args_1.value = default_browser_args;
          form.browser_args_2.value = default_browser_args;
          document.getElementById('target_platform_info').innerHTML = ''
          break;
      }
    }
    setPlatformDefaults(document.getElementById('target_platform'));

    function populateThreshold(sel) {
      var form = sel.form,
          value = sel.options[sel.selectedIndex].value;
      document.getElementById('pageset_type_info').innerHTML = '';
      switch(value) {
        case 'rasterize_and_record_micro':
          form.variance_threshold.value = '0';
          break;
        case 'repaint':
          form.variance_threshold.value = '0';
          break;
        case 'pixeldiffs':
          form.variance_threshold.value = '0';
          break;
        case 'smoothness':
          form.variance_threshold.value = '0';
          break;
        default:
          form.variance_threshold.value = '0';
      }

      // Update the variance threshold information message.
      info_msg = '% is the recommended variance threshold to use for '
      document.getElementById('variance_threshold_info').innerHTML = (
          form.variance_threshold.value + info_msg + value);
    }

    populateThreshold(document.getElementById('benchmark_name'));
  </script>
{% endif %}
<hr/>

  <h2>Your Try runs history</h2>
  <br/>

  {% if chromium_try_tasks %}
    {% include "chromium_try_tasks_table.html" %}
  {% else %}
    No Previous runs yet.
  {% endif %}
  <br/>
  <a href='all_tasks#chromium_try'>View runs of all users</a>
</center>

{% endblock %}
