<!DOCTYPE HTML> <html i18n-values="dir:textdirection;"> <head> <meta charset="utf-8"> <style> body { margin: 10px; min-width: 47em; } a { color: blue; font-size: 103%; } div#header { margin-bottom: 1.05em; /* 67px is the height of the header's background image. */ min-height: 67px; overflow: hidden; padding-bottom: 20px; padding-left: 0; padding-top: 20px; position: relative; box-sizing: border-box; } html[dir=rtl] #header { padding-right: 0; } #header h1 { background: url('../../app/theme/flags_section.png') 0px 20px no-repeat; display: inline; margin: 0; padding-bottom: 43px; padding-left: 75px; padding-top: 40px; } html[dir=rtl] #header h1 { background: url('../../app/theme/flags_section.png') right no-repeat; padding-right: 95px; padding-left: 0; } h1 { font-size: 156%; font-weight: bold; padding: 0; margin: 0; } #blurb-container { padding-bottom: 1.5em; font-size: 120%; } #blurb-warning { color: red; font-weight: bold; } div.content { font-size: 88%; margin-top: 5px; } .section-header { background: #ebeff9; border-top: 1px solid #b5c7de; font-size: 99%; padding-bottom: 2px; padding-left: 5px; padding-top: 3px; width: 100%; } html[dir=rtl] .section-header { padding-right: 5px; padding-left: 0; } .section-header > table tr td:first-child { width: 100%; } .section-header > table { width: 100%; } .section-header-title { font-weight: bold; } .vbox-container { display: -webkit-box; -webkit-box-orient: vertical; } .wbox { display: -webkit-box; -webkit-box-align: stretch; -webkit-box-flex: 1; } #top { padding-right: 5px; } html[dir=rtl] #top { padding-left: 5px; padding-right: 0; } /* Disabled experiments display grey text on a grey background. The title, however, should remain completely legible. */ .experiment-disabled > td { background: #F0F0F0; color: #A0A0A0; } .experiment-disabled .experiment-name { color: #000; } .experiment { border-bottom: 1px solid #cdcdcd; } .experiment td { padding-bottom: 4px; padding-top: 5px; } /* Indent the text related to each experiment. */ .experiment-text { padding-left: 5px; } html[dir=rtl] .experiment-text { padding-right: 5px; padding-left: 0; } .experiment-name { font-weight: bold; } .no-experiments { margin: 6em 0 0; text-align: center; font-size: 1.2em; } /* Match the indentation of .experiment-text. */ .experiment-actions { padding-left: 5px; margin-top: 0.2em; margin-bottom: 0.2em; } html[dir=rtl] .experiment-actions { padding-right: 5px; padding-left: 0; } div.needs-restart { padding-top: 10px; padding-left: 5px; } button { font-size: 104%; } </style> <script> /** * This variable structure is here to document the structure that the template * expects to correctly populate the page. */ var flagsExperimentsDataFormat = { 'flagsExperiments': [ { 'internal_name': 'Experiment ID string', 'name': 'Experiment Name', 'description': 'description', /* enabled is only set if the experiment is single valued */ 'enabled': true, /* choices is only set if the experiment has multiple values */ 'choices': [ { 'internal_name': 'Experiment ID string', 'description': 'description', 'selected': true } ] } ], 'needsRestart': false }; /** * Takes the |flagsExperimentsData| input argument which represents data about * the currently available experiments and populates the html jstemplate * with that data. It expects an object structure like the above. * @param {Object} flagsExperimentsData Information about available experiments */ function renderTemplate(flagsExperimentsData) { // This is the javascript code that processes the template: var input = new JsEvalContext(flagsExperimentsData); var output = document.getElementById('flagsExperimentTemplate'); jstProcess(input, output); } /** * Asks the C++ FlagsDOMHandler to get details about the available experiments * and return detailed data about the configuration. The FlagsDOMHandler * should reply to returnFlagsExperiments() (below). */ function requestFlagsExperimentsData() { chrome.send('requestFlagsExperiments', []); } /** * Asks the C++ FlagsDOMHandler to restart the browser (restoring tabs). */ function restartBrowser() { chrome.send('restartBrowser', []); } /** * Called by the WebUI to re-populate the page with data representing the * current state of installed experiments. */ function returnFlagsExperiments(flagsExperimentsData){ var bodyContainer = document.getElementById('body-container'); renderTemplate(flagsExperimentsData); bodyContainer.style.visibility = 'visible'; } /** * Handles a 'enable' or 'disable' button getting clicked. */ function handleEnableExperiment(node, enable) { // Tell the C++ FlagsDOMHandler to enable/disable the experiment. chrome.send('enableFlagsExperiment', [String(node.internal_name), String(enable)]); requestFlagsExperimentsData(); } /** * Invoked when the selection of a multi-value choice is changed to the * specified index. */ function handleSelectChoiceExperiment(node, index) { // Tell the C++ FlagsDOMHandler to enable the selected choice. chrome.send('enableFlagsExperiment', [String(node.internal_name) + "@" + index, "true"]); requestFlagsExperimentsData(); } // Get data and have it displayed upon loading. document.addEventListener('DOMContentLoaded', requestFlagsExperimentsData); </script> </head> <body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize"> <div id="body-container" style="visibility:hidden"> <div id="header"><h1 i18n-content="flagsLongTitle">TITLE</h1></div> <div id="blurb-container"> <span id="blurb-warning" i18n-content="flagsWarningHeader">WARNING</span> <span i18n-content="flagsBlurb">WARNING TEXT</span> </div> <div id="flagsExperimentTemplate"> <div id="container" class="vbox-container"> <div id="top" class="wbox"> <div class="section-header"> <table cellpadding="0" cellspacing="0"><tr valign="center"> <td> <span class="section-header-title" i18n-content="flagsTableTitle" >TITLE</span> </td> </tr></table> </div> </div> </div> <div class="content"> <div class="experiment-name no-experiments" jsdisplay="flagsExperiments.length === 0"> <div i18n-content="flagsNoExperimentsAvailable" >NO_EXPERIMENTS_ARE_AVAILABLE</div> </div> <div jsdisplay="flagsExperiments.length > 0"> <div class="experiment" jsselect="flagsExperiments"> <table width="100%" cellpadding="2" cellspacing="0"> <!-- TODO(mkwst): This doesn't work exactly as expected for multivalue experiments. See http://crbug.com/73730 --> <tr jsvalues="class:enabled ? 'experiment-enabled' : 'experiment-disabled'"> <td valign="top"> <div class="experiment-text"> <div> <span class="experiment-name" dir="ltr" jscontent="name">NAME</span> <div> <span dir="ltr" jsvalues=".innerHTML:description"> </div> <div jsdisplay="choices && choices.length > 0"> <select jsvalues=".internal_name:internal_name;.disabled:!enabled" onchange="handleSelectChoiceExperiment(this, this.selectedIndex)"> <option jsvalues=".selected:selected" jsselect="choices" jscontent="description">NAME </option> </select> </div> </div> </div> <div class="experiment-actions"> <!-- If enabled isn't set (i.e. in multi_type options), then both jsdisplay tests fail, and we get no rendering from this section. --> <span> <a jsvalues=".internal_name:internal_name" jsdisplay="enabled" onclick="handleEnableExperiment(this, false)" href="javascript:void(0);" i18n-content="disable" >DISABLE</a> <a jsvalues=".internal_name:internal_name" jsdisplay="!enabled" onclick="handleEnableExperiment(this, true)" href="javascript:void(0);" i18n-content="enable" >ENABLE</a> </span> </div> </td> </tr> </table> </div> </div> <div class="needs-restart" jsdisplay="needsRestart"> <div i18n-content="flagsRestartNotice">NEEDS_RESTART</div> <button type="button" onclick="restartBrowser();" i18n-content="flagsRestartButton">RESTART</button> </div> </div> </div> </div> </body> </html>