15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)importScript("EditFileSystemDialog.js");
32f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!function()} onHide
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.HelpScreen}
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SettingsScreen = function(onHide)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.HelpScreen.call(this);
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.id = "settings-screen";
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /** @type {function()} */
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._onHide = onHide;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._tabbedPane = new WebInspector.TabbedPane();
47a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._tabbedPane.element.classList.add("help-window-main");
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    var settingsLabelElement = document.createElement("div");
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    settingsLabelElement.className = "help-window-label";
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    settingsLabelElement.createTextChild(WebInspector.UIString("Settings"));
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._tabbedPane.element.insertBefore(settingsLabelElement, this._tabbedPane.element.firstChild);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._tabbedPane.element.appendChild(this._createCloseButton());
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.General, WebInspector.UIString("General"), new WebInspector.GenericSettingsTab());
54e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Workspace, WebInspector.UIString("Workspace"), new WebInspector.WorkspaceSettingsTab());
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebInspector.experimentsSettings.experimentsEnabled)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Experiments, WebInspector.UIString("Experiments"), new WebInspector.ExperimentsSettingsTab());
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Shortcuts, WebInspector.UIString("Shortcuts"), WebInspector.shortcutsScreen.createShortcutsTabView());
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._tabbedPane.shrinkableTabs = false;
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._tabbedPane.verticalTabLayout = true;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._lastSelectedTabSetting = WebInspector.settings.createSetting("lastSelectedSettingsTab", WebInspector.SettingsScreen.Tabs.General);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.selectTab(this._lastSelectedTabSetting.get());
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this.element.addEventListener("keydown", this._keyDown.bind(this), false);
65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._developerModeCounter = 0;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/**
698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * @param {number} min
708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * @param {number} max
718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * @param {string} text
728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * @return {?string}
738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) */
748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)WebInspector.SettingsScreen.integerValidator = function(min, max, text)
758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
76a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    var value = Number(text);
778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (isNaN(value))
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return WebInspector.UIString("Invalid number format");
798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (value < min || value > max)
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return WebInspector.UIString("Value is out of range [%d, %d]", min, max);
818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return null;
828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SettingsScreen.Tabs = {
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    General: "general",
86f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Overrides: "overrides",
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Workspace: "workspace",
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Experiments: "experiments",
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Shortcuts: "shortcuts"
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SettingsScreen.prototype = {
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} tabId
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectTab: function(tabId)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._tabbedPane.selectTab(tabId);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
102a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _tabSelected: function(event)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._lastSelectedTabSetting.set(this._tabbedPane.selectedTabId);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._tabbedPane.show(this.element);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.HelpScreen.prototype.wasShown.call(this);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isClosingKey: function(keyCode)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebInspector.KeyboardShortcut.Keys.Enter.code,
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebInspector.KeyboardShortcut.Keys.Esc.code,
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ].indexOf(keyCode) >= 0;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @override
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._onHide();
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.HelpScreen.prototype.willHide.call(this);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
140d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {?Event} event
141d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
142d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    _keyDown: function(event)
143d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
144d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var shiftKeyCode = 16;
145d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (event.keyCode === shiftKeyCode && ++this._developerModeCounter > 5)
146d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this.element.classList.add("settings-developer-mode");
147d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
148d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.HelpScreen.prototype
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string} name
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string=} id
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.SettingsTab = function(name, id)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this.element.classList.add("settings-tab-container");
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (id)
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.element.id = id;
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    var header = this.element.createChild("header");
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    header.createChild("h3").appendChild(document.createTextNode(name));
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.containerElement = this.element.createChild("div", "help-container-wrapper").createChild("div", "settings-tab help-content help-container");
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SettingsTab.prototype = {
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     *  @param {string=} name
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     *  @return {!Element}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _appendSection: function(name)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var block = this.containerElement.createChild("div", "help-block");
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (name)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            block.createChild("div", "help-section-title").textContent = name;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return block;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createSelectSetting: function(name, options, setting)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
184e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var p = document.createElement("p");
185e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var labelElement = p.createChild("label");
186e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        labelElement.textContent = name;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
188e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var select = p.createChild("select");
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var settingValue = setting.get();
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < options.length; ++i) {
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var option = options[i];
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            select.add(new Option(option[0], option[1]));
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (settingValue === option[1])
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                select.selectedIndex = i;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function changeListener(e)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
20006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            // Don't use e.target.value to avoid conversion of the value to string.
20106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            setting.set(options[select.selectedIndex][1]);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select.addEventListener("change", changeListener, false);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return p;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.SettingsTab}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.GenericSettingsTab = function()
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    WebInspector.SettingsTab.call(this, WebInspector.UIString("General"), "general-tab-content");
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
219aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    this._populateSectionsFromExtensions();
22009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
221aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    var restoreDefaults = this._appendSection().createChild("input", "settings-tab-text-button");
22209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    restoreDefaults.type = "button";
22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    restoreDefaults.value = WebInspector.UIString("Restore defaults and reload");
2245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    restoreDefaults.addEventListener("click", restoreAndReload, false);
22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
22609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    function restoreAndReload()
22709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
22809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (window.localStorage)
22909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            window.localStorage.clear();
23009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        WebInspector.reload();
23109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.GenericSettingsTab.prototype = {
235aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    _populateSectionsFromExtensions: function()
236aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    {
237aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        /** @const */
238aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var explicitSectionOrder = ["", "Appearance", "Elements", "Sources", "Profiler", "Console", "Extensions"];
239aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
240aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var allExtensions = WebInspector.moduleManager.extensions("ui-setting");
241aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
242aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        /** @type {!StringMultimap.<!WebInspector.ModuleManager.Extension>} */
243aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var extensionsBySectionId = new StringMultimap();
244aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        /** @type {!StringMultimap.<!WebInspector.ModuleManager.Extension>} */
245aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var childSettingExtensionsByParentName = new StringMultimap();
246aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
247aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        allExtensions.forEach(function(extension) {
248aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var descriptor = extension.descriptor();
249aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var sectionName = descriptor["section"] || "";
250aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (!sectionName && descriptor["parentSettingName"]) {
251aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                childSettingExtensionsByParentName.put(descriptor["parentSettingName"], extension);
252aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                return;
253aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            }
254aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            extensionsBySectionId.put(sectionName, extension);
255aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        });
256aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
257aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var sectionIds = extensionsBySectionId.keys();
258aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var explicitlyOrderedSections = {};
259aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        for (var i = 0; i < explicitSectionOrder.length; ++i) {
260aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            explicitlyOrderedSections[explicitSectionOrder[i]] = true;
261f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var extensions = extensionsBySectionId.get(explicitSectionOrder[i]);
262f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (!extensions.size())
263aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                continue;
264d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._addSectionWithExtensionProvidedSettings(explicitSectionOrder[i], extensions.values(), childSettingExtensionsByParentName);
265aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
266aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        for (var i = 0; i < sectionIds.length; ++i) {
267aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (explicitlyOrderedSections[sectionIds[i]])
268aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                continue;
269f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._addSectionWithExtensionProvidedSettings(sectionIds[i], extensionsBySectionId.get(sectionIds[i]).values(), childSettingExtensionsByParentName);
270aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
271aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    },
272aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
273aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    /**
274aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {string} sectionName
275aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {!Array.<!WebInspector.ModuleManager.Extension>} extensions
276aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {!StringMultimap.<!WebInspector.ModuleManager.Extension>} childSettingExtensionsByParentName
277aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     */
278aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    _addSectionWithExtensionProvidedSettings: function(sectionName, extensions, childSettingExtensionsByParentName)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
280aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var uiSectionName = sectionName && WebInspector.UIString(sectionName);
281aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var sectionElement = this._appendSection(uiSectionName);
282aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        extensions.forEach(processSetting.bind(this, null));
283aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
28409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
285aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @param {?Element} parentFieldset
286aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @param {!WebInspector.ModuleManager.Extension} extension
28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.GenericSettingsTab}
28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
289aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        function processSetting(parentFieldset, extension)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
291aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var descriptor = extension.descriptor();
292aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var experimentName = descriptor["experiment"];
293aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (experimentName && (!WebInspector.experimentsSettings[experimentName] || !WebInspector.experimentsSettings[experimentName].isEnabled()))
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
296aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var settingName = descriptor["settingName"];
297aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var setting = WebInspector.settings[settingName];
298aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var instance = extension.instance();
299aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var settingControl;
300aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (instance && descriptor["settingType"] === "custom") {
301aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                settingControl = instance.settingElement();
302aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                if (!settingControl)
303aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                    return;
304aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            }
305aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (!settingControl) {
306aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                var uiTitle = WebInspector.UIString(descriptor["title"]);
307aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                settingControl = createSettingControl.call(this, uiTitle, setting, descriptor, instance);
308aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            }
309aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            if (settingName) {
310f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var childSettings = childSettingExtensionsByParentName.get(settingName);
311f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                if (childSettings.size()) {
312aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                    var fieldSet = WebInspector.SettingsUI.createSettingFieldset(setting);
313aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                    settingControl.appendChild(fieldSet);
314d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                    childSettings.values().forEach(function(item) { processSetting.call(this, fieldSet, item); }, this);
315aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                }
316aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            }
317aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            var containerElement = parentFieldset || sectionElement;
318aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            containerElement.appendChild(settingControl);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
321aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        /**
322aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @param {string} uiTitle
323aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @param {!WebInspector.Setting} setting
324aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @param {!Object} descriptor
325aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @param {?Object} instance
326aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @return {!Element}
327aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         * @this {WebInspector.GenericSettingsTab}
328aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch         */
329aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        function createSettingControl(uiTitle, setting, descriptor, instance)
330aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        {
331aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            switch (descriptor["settingType"]) {
332aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            case "checkbox":
333aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                return WebInspector.SettingsUI.createSettingCheckbox(uiTitle, setting);
334aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            case "select":
335aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                var descriptorOptions = descriptor["options"]
336aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                var options = new Array(descriptorOptions.length);
337aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                for (var i = 0; i < options.length; ++i) {
338aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                    // The third array item flags that the option name is "raw" (non-i18n-izable).
339aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                    var optionName = descriptorOptions[i][2] ? descriptorOptions[i][0] : WebInspector.UIString(descriptorOptions[i][0]);
340aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                    options[i] = [WebInspector.UIString(descriptorOptions[i][0]), descriptorOptions[i][1]];
341aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                }
342aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                return this._createSelectSetting(uiTitle, options, setting);
343aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            default:
344aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                throw "Invalid setting type: " + descriptor["settingType"];
345aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            }
346aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
347f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
348f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
349a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /**
350a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?Element} p
351a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     */
352a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    _appendDrawerNote: function(p)
353a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
354a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var noteElement = p.createChild("div", "help-field-note");
355a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        noteElement.createTextChild("Hit ");
356a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        noteElement.createChild("span", "help-key").textContent = "Esc";
357a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        noteElement.createTextChild(WebInspector.UIString(" or click the"));
358a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        noteElement.appendChild(new WebInspector.StatusBarButton(WebInspector.UIString("Drawer"), "console-status-bar-item").element);
359a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        noteElement.createTextChild(WebInspector.UIString("toolbar item"));
360a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    },
361a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.SettingsTab.prototype
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.SettingsTab}
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.WorkspaceSettingsTab = function()
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.SettingsTab.call(this, WebInspector.UIString("Workspace"), "workspace-tab-content");
372521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    WebInspector.isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, this._fileSystemAdded, this);
373521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    WebInspector.isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, this._fileSystemRemoved, this);
374c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
375c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this._commonSection = this._appendSection(WebInspector.UIString("Common"));
376aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    var folderExcludePatternInput = WebInspector.SettingsUI.createSettingInputField(WebInspector.UIString("Folder exclude pattern"), WebInspector.settings.workspaceFolderExcludePattern, false, 0, "270px", WebInspector.SettingsUI.regexValidator);
377c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this._commonSection.appendChild(folderExcludePatternInput);
378521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
379521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._fileSystemsSection = this._appendSection(WebInspector.UIString("Folders"));
380521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._fileSystemsListContainer = this._fileSystemsSection.createChild("p", "settings-list-container");
381c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
382521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._addFileSystemRowElement = this._fileSystemsSection.createChild("div");
383f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    var addFileSystemButton = this._addFileSystemRowElement.createChild("input", "settings-tab-text-button");
384521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    addFileSystemButton.type = "button";
385c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    addFileSystemButton.value = WebInspector.UIString("Add folder\u2026");
3865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    addFileSystemButton.addEventListener("click", this._addFileSystemClicked.bind(this), false);
387521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
388f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    this._editFileSystemButton = this._addFileSystemRowElement.createChild("input", "settings-tab-text-button");
389c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this._editFileSystemButton.type = "button";
390c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this._editFileSystemButton.value = WebInspector.UIString("Edit\u2026");
3915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    this._editFileSystemButton.addEventListener("click", this._editFileSystemClicked.bind(this), false);
392c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this._updateEditFileSystemButtonState();
393c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._reset();
395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.WorkspaceSettingsTab.prototype = {
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    wasShown: function()
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.SettingsTab.prototype.wasShown.call(this);
401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._reset();
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _reset: function()
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
406521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._resetFileSystems();
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
409521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _resetFileSystems: function()
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
411521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._fileSystemsListContainer.removeChildren();
412521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var fileSystemPaths = WebInspector.isolatedFileSystemManager.mapping().fileSystemPaths();
413521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        delete this._fileSystemsList;
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!fileSystemPaths.length) {
416521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var noFileSystemsMessageElement = this._fileSystemsListContainer.createChild("div", "no-file-systems-message");
417521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            noFileSystemsMessageElement.textContent = WebInspector.UIString("You have no file systems added.");
418521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
419521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
421c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._fileSystemsList = new WebInspector.SettingsList(["path"], this._renderFileSystem.bind(this));
422a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        this._fileSystemsList.element.classList.add("file-systems-list");
423c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.Selected, this._fileSystemSelected.bind(this));
424c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.Removed, this._fileSystemRemovedfromList.bind(this));
425c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.DoubleClicked, this._fileSystemDoubleClicked.bind(this));
426521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._fileSystemsListContainer.appendChild(this._fileSystemsList.element);
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < fileSystemPaths.length; ++i)
428521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._fileSystemsList.addItem(fileSystemPaths[i]);
429c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._updateEditFileSystemButtonState();
430c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    },
431c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
432c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _updateEditFileSystemButtonState: function()
433c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {
434c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._editFileSystemButton.disabled = !this._selectedFileSystemPath();
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
438a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
440c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _fileSystemSelected: function(event)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
442c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._updateEditFileSystemButtonState();
443521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
444521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
445c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    /**
446a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
447c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     */
448c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _fileSystemDoubleClicked: function(event)
449521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
450c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var id = /** @type{?string} */ (event.data);
451c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._editFileSystem(id);
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    _editFileSystemClicked: function()
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
456c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._editFileSystem(this._selectedFileSystemPath());
457c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    },
458c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
459c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    /**
460c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     * @param {?string} id
461c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     */
462c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _editFileSystem: function(id)
463c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {
464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebInspector.EditFileSystemDialog.show(WebInspector.inspectorView.element, id);
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
468a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(?Event)} handler
469a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _createRemoveButton: function(handler)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var removeButton = document.createElement("button");
474a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        removeButton.classList.add("button");
475a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        removeButton.classList.add("remove-item-button");
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeButton.value = WebInspector.UIString("Remove");
477521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (handler)
478521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            removeButton.addEventListener("click", handler, false);
479521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        else
480521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            removeButton.disabled = true;
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return removeButton;
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
485a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} columnElement
486521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {string} column
487521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} id
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
489521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _renderFileSystem: function(columnElement, column, id)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
491c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!id)
492c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            return "";
493521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var fileSystemPath = id;
494521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var textElement = columnElement.createChild("span", "list-column-text");
495521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var pathElement = textElement.createChild("span", "file-system-path");
496521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        pathElement.title = fileSystemPath;
497521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
498c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        const maxTotalPathLength = 55;
499521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        const maxFolderNameLength = 30;
5003c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
5013c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        var lastIndexOfSlash = fileSystemPath.lastIndexOf(WebInspector.isWin() ? "\\" : "/");
502521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var folderName = fileSystemPath.substr(lastIndexOfSlash + 1);
5033c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        var folderPath = fileSystemPath.substr(0, lastIndexOfSlash + 1);
504521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        folderPath = folderPath.trimMiddle(maxTotalPathLength - Math.min(maxFolderNameLength, folderName.length));
505521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        folderName = folderName.trimMiddle(maxFolderNameLength);
506521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
507f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var folderPathElement = pathElement.createChild("span");
5083c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        folderPathElement.textContent = folderPath;
509f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
510521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var nameElement = pathElement.createChild("span", "file-system-path-name");
511521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        nameElement.textContent = folderName;
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
514926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
515a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
516926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
517c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _fileSystemRemovedfromList: function(event)
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
519c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var id = /** @type{?string} */ (event.data);
520521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!id)
521521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
522521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        WebInspector.isolatedFileSystemManager.removeFileSystem(id);
523521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _addFileSystemClicked: function()
526521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
527521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        WebInspector.isolatedFileSystemManager.addFileSystem();
528521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
530521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _fileSystemAdded: function(event)
531521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
532a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event.data);
533521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._fileSystemsList)
534521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._reset();
535521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        else
536521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._fileSystemsList.addItem(fileSystem.path());
537521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
53853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
539521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _fileSystemRemoved: function(event)
540521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
541a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event.data);
542521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var selectedFileSystemPath = this._selectedFileSystemPath();
543c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (this._fileSystemsList.itemForId(fileSystem.path()))
544c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            this._fileSystemsList.removeItem(fileSystem.path());
545521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._fileSystemsList.itemIds().length)
546521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._reset();
547c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this._updateEditFileSystemButtonState();
548521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
549521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
550521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _selectedFileSystemPath: function()
551521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
552521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._fileSystemsList ? this._fileSystemsList.selectedId() : null;
553521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
554521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.SettingsTab.prototype
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
55953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)/**
56053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @constructor
56153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @extends {WebInspector.SettingsTab}
56253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) */
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ExperimentsSettingsTab = function()
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.SettingsTab.call(this, WebInspector.UIString("Experiments"), "experiments-tab-content");
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var experiments = WebInspector.experimentsSettings.experiments;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (experiments.length) {
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var experimentsSection = this._appendSection();
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        experimentsSection.appendChild(this._createExperimentsWarningSubsection());
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < experiments.length; ++i)
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            experimentsSection.appendChild(this._createExperimentCheckbox(experiments[i]));
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ExperimentsSettingsTab.prototype = {
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
578a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element} element
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createExperimentsWarningSubsection: function()
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var subsection = document.createElement("div");
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var warning = subsection.createChild("span", "settings-experiments-warning-subsection-warning");
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        warning.textContent = WebInspector.UIString("WARNING:");
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        subsection.appendChild(document.createTextNode(" "));
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var message = subsection.createChild("span", "settings-experiments-warning-subsection-message");
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        message.textContent = WebInspector.UIString("These experiments could be dangerous and may require restart.");
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return subsection;
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createExperimentCheckbox: function(experiment)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var input = document.createElement("input");
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.type = "checkbox";
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.name = experiment.name;
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.checked = experiment.isEnabled();
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function listener()
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            experiment.setEnabled(input.checked);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.addEventListener("click", listener, false);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var p = document.createElement("p");
604d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        p.className = experiment.hidden && !experiment.isEnabled() ? "settings-experiment-hidden" : "";
605d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var label = p.createChild("label");
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        label.appendChild(input);
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        label.appendChild(document.createTextNode(WebInspector.UIString(experiment.title)));
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        p.appendChild(label);
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return p;
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.SettingsTab.prototype
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SettingsController = function()
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /** @type {?WebInspector.SettingsScreen} */
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._settingsScreen;
622f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
623f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    window.addEventListener("resize", this._resize.bind(this), true);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SettingsController.prototype =
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onHideSettingsScreen: function()
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete this._settingsScreenVisible;
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string=} tabId
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showSettingsScreen: function(tabId)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._settingsScreen)
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._settingsScreen = new WebInspector.SettingsScreen(this._onHideSettingsScreen.bind(this));
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (tabId)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._settingsScreen.selectTab(tabId);
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._settingsScreen.showModal();
645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._settingsScreenVisible = true;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
648f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _resize: function()
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._settingsScreen && this._settingsScreen.isShowing())
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._settingsScreen.doResize();
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
654521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
655521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)/**
656521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * @constructor
65707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * @implements {WebInspector.ActionDelegate}
65807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch */
65907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.SettingsController.SettingsScreenActionDelegate = function() { }
66007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
66107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.SettingsController.SettingsScreenActionDelegate.prototype = {
66207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    /**
66307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     * @return {boolean}
66407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch     */
66507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    handleAction: function()
66607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
667f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        WebInspector._settingsController.showSettingsScreen(WebInspector.SettingsScreen.Tabs.General);
66807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return true;
66907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
67007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
67107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
67207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch/**
67307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * @constructor
674c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * @extends {WebInspector.Object}
675f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @param {!Array.<string>} columns
676a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!Element, string, ?string)} itemRenderer
677521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) */
678c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)WebInspector.SettingsList = function(columns, itemRenderer)
679521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
680521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this.element = document.createElement("div");
681a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("settings-list");
682521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this.element.tabIndex = -1;
683521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._itemRenderer = itemRenderer;
684521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._listItems = {};
685521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._ids = [];
686521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._columns = columns;
687521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
688521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
689c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)WebInspector.SettingsList.Events = {
690c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    Selected:  "Selected",
691c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    Removed:  "Removed",
692c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    DoubleClicked:  "DoubleClicked",
693c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
694c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
695521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)WebInspector.SettingsList.prototype = {
696521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
697521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
698c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     * @param {?string=} beforeId
699a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
700521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
701521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    addItem: function(itemId, beforeId)
702521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
703521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var listItem = document.createElement("div");
704521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        listItem._id = itemId;
705a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        listItem.classList.add("settings-list-item");
706521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (typeof beforeId !== undefined)
707521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this.element.insertBefore(listItem, this._listItems[beforeId]);
708521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        else
709521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this.element.appendChild(listItem);
710521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
711521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var listItemContents = listItem.createChild("div", "settings-list-item-contents");
712521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var listItemColumnsElement = listItemContents.createChild("div", "settings-list-item-columns");
713521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
714521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        listItem.columnElements = {};
715521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        for (var i = 0; i < this._columns.length; ++i) {
716521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var columnElement = listItemColumnsElement.createChild("div", "list-column");
717521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var columnId = this._columns[i];
718521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            listItem.columnElements[columnId] = columnElement;
719521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._itemRenderer(columnElement, columnId, itemId);
720521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
721521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var removeItemButton = this._createRemoveButton(removeItemClicked.bind(this));
722521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        listItemContents.addEventListener("click", this.selectItem.bind(this, itemId), false);
723c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        listItemContents.addEventListener("dblclick", this._onDoubleClick.bind(this, itemId), false);
724521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        listItemContents.appendChild(removeItemButton);
725521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
726521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._listItems[itemId] = listItem;
727521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (typeof beforeId !== undefined)
728521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._ids.splice(this._ids.indexOf(beforeId), 0, itemId);
729521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        else
730521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._ids.push(itemId);
731521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
73209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
73309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {?Event} event
73409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.SettingsList}
73509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
736521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        function removeItemClicked(event)
737521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        {
738521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            removeItemButton.disabled = true;
739c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            this.removeItem(itemId);
740c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            this.dispatchEventToListeners(WebInspector.SettingsList.Events.Removed, itemId);
741521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            event.consume();
742521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
743521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
744521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return listItem;
745521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
746521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
747521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
748521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} id
749521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
750521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    removeItem: function(id)
751521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
752591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._listItems[id].remove();
753521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        delete this._listItems[id];
754521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._ids.remove(id);
755521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (id === this._selectedId) {
756521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            delete this._selectedId;
757521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (this._ids.length)
758521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                this.selectItem(this._ids[0]);
759521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
760521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
761521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
762521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
763a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Array.<?string>}
764521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
765521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    itemIds: function()
766521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
767521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._ids.slice();
768521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
769521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
770521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
771a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Array.<string>}
772521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
773521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    columns: function()
774521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
775521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._columns.slice();
776521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
777521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
778521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
779521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @return {?string}
780521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
781521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    selectedId: function()
782521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
783521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._selectedId;
784521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
785521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
786521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
787a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
788521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
789521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    selectedItem: function()
790521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
791521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._selectedId ? this._listItems[this._selectedId] : null;
792521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
793521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
794521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
795521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {string} itemId
796a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
797521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
798521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    itemForId: function(itemId)
799521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
800521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return this._listItems[itemId];
801521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
802521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
803521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
804c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     * @param {?string} id
8055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Event=} event
806521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
807c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _onDoubleClick: function(id, event)
808521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
809c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SettingsList.Events.DoubleClicked, id);
810521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
811521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
812521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
813521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} id
8145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Event=} event
815521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
816521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    selectItem: function(id, event)
817521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
818521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (typeof this._selectedId !== "undefined") {
819a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._listItems[this._selectedId].classList.remove("selected");
820521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
821521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
822521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._selectedId = id;
823521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (typeof this._selectedId !== "undefined") {
824a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._listItems[this._selectedId].classList.add("selected");
825521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
826c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SettingsList.Events.Selected, id);
827521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (event)
828521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            event.consume();
829521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
830521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
831521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
832a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(?Event)} handler
833a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
834521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
835521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _createRemoveButton: function(handler)
836521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
837521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var removeButton = document.createElement("button");
838a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        removeButton.classList.add("remove-item-button");
839521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        removeButton.value = WebInspector.UIString("Remove");
840521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        removeButton.addEventListener("click", handler, false);
841521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return removeButton;
842c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    },
843c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
844c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    __proto__: WebInspector.Object.prototype
845521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
846521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
847521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)/**
848521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * @constructor
849521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * @extends {WebInspector.SettingsList}
850f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @param {!Array.<string>} columns
851f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @param {function(string, string):string} valuesProvider
852a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(?string, !Object)} validateHandler
853a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(?string, !Object)} editHandler
854521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) */
855c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)WebInspector.EditableSettingsList = function(columns, valuesProvider, validateHandler, editHandler)
856521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
857c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    WebInspector.SettingsList.call(this, columns, this._renderColumn.bind(this));
858521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._validateHandler = validateHandler;
859521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._editHandler = editHandler;
860521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._valuesProvider = valuesProvider;
861a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {!Object.<string, !HTMLInputElement>} */
862521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._addInputElements = {};
863a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {!Object.<string, !Object.<string, !HTMLInputElement>>} */
864521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._editInputElements = {};
865a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {!Object.<string, !Object.<string, !HTMLSpanElement>>} */
866521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._textElements = {};
867521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
868521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    this._addMappingItem = this.addItem(null);
869a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._addMappingItem.classList.add("item-editing");
870a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._addMappingItem.classList.add("add-list-item");
871521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
872521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
873521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)WebInspector.EditableSettingsList.prototype = {
874521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
875521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
876c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     * @param {?string=} beforeId
877a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
878521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
879521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    addItem: function(itemId, beforeId)
880521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
881521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var listItem = WebInspector.SettingsList.prototype.addItem.call(this, itemId, beforeId);
882a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        listItem.classList.add("editable");
883521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return listItem;
884521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
885521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
886521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
887a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} columnElement
888521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {string} columnId
889521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
890521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
891521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _renderColumn: function(columnElement, columnId, itemId)
892521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
893a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        columnElement.classList.add("settings-list-column-" + columnId);
894521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var placeholder = (columnId === "url") ? WebInspector.UIString("URL prefix") : WebInspector.UIString("Folder path");
895521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (itemId === null) {
8965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            var inputElement = /** @type {!HTMLInputElement} */ (columnElement.createChild("input", "list-column-editor"));
897521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            inputElement.placeholder = placeholder;
8985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            inputElement.addEventListener("blur", this._onAddMappingInputBlur.bind(this), false);
8995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            inputElement.addEventListener("input", this._validateEdit.bind(this, itemId), false);
900521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._addInputElements[columnId] = inputElement;
901521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
902521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
90309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var validItemId = itemId;
904521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
905521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._editInputElements[itemId])
906521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._editInputElements[itemId] = {};
907521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._textElements[itemId])
908521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            this._textElements[itemId] = {};
909521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
910521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var value = this._valuesProvider(itemId, columnId);
911521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
9125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        var textElement = /** @type {!HTMLSpanElement} */ (columnElement.createChild("span", "list-column-text"));
913521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        textElement.textContent = value;
914521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        textElement.title = value;
915521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        columnElement.addEventListener("click", rowClicked.bind(this), false);
916521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._textElements[itemId][columnId] = textElement;
917521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
9185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        var inputElement = /** @type {!HTMLInputElement} */ (columnElement.createChild("input", "list-column-editor"));
919521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        inputElement.value = value;
9205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        inputElement.addEventListener("blur", this._editMappingBlur.bind(this, itemId), false);
9215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        inputElement.addEventListener("input", this._validateEdit.bind(this, itemId), false);
922521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        columnElement.inputElement = inputElement;
923521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._editInputElements[itemId][columnId] = inputElement;
924521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
92509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
92609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {?Event} event
92709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.EditableSettingsList}
92809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
929521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        function rowClicked(event)
930521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        {
931521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (itemId === this._editingId)
932521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                return;
933521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            event.consume();
934521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            console.assert(!this._editingId);
93509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            this._editingId = validItemId;
93609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            var listItem = this.itemForId(validItemId);
937a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            listItem.classList.add("item-editing");
93809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            var inputElement = event.target.inputElement || this._editInputElements[validItemId][this.columns()[0]];
939521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            inputElement.focus();
940521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            inputElement.select();
941521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
942521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
943521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
944521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
945521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
946a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Object}
947521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
948521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _data: function(itemId)
949521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
950521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var inputElements = this._inputElements(itemId);
951521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var data = {};
952521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var columns = this.columns();
953521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        for (var i = 0; i < columns.length; ++i)
954521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            data[columns[i]] = inputElements[columns[i]].value;
955521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return data;
956521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
957521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
958521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
959521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
960a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {?Object.<string, !HTMLInputElement>}
961521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
962521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _inputElements: function(itemId)
963521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
964521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!itemId)
965521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return this._addInputElements;
966a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return this._editInputElements[itemId] || null;
967521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
968521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
969521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
970521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
971521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @return {boolean}
972521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
973521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _validateEdit: function(itemId)
974521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
975521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var errorColumns = this._validateHandler(itemId, this._data(itemId));
976521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var hasChanges = this._hasChanges(itemId);
977521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var columns = this.columns();
978521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        for (var i = 0; i < columns.length; ++i) {
979521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var columnId = columns[i];
980521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var inputElement = this._inputElements(itemId)[columnId];
981521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (hasChanges && errorColumns.indexOf(columnId) !== -1)
982a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                inputElement.classList.add("editable-item-error");
983521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            else
984a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                inputElement.classList.remove("editable-item-error");
985521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
986521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return !errorColumns.length;
987521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
988521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
989521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
990521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {?string} itemId
991521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @return {boolean}
992521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
993521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _hasChanges: function(itemId)
994521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
995521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var hasChanges = false;
996521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var columns = this.columns();
997521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        for (var i = 0; i < columns.length; ++i) {
998521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var columnId = columns[i];
999521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var oldValue = itemId ? this._textElements[itemId][columnId].textContent : "";
1000521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var newValue = this._inputElements(itemId)[columnId].value;
1001521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (oldValue !== newValue) {
1002521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                hasChanges = true;
1003521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                break;
1004521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            }
1005521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
1006521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return hasChanges;
1007521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
1008521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1009521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    /**
1010521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     * @param {string} itemId
10115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Event} event
1012521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)     */
1013521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _editMappingBlur: function(itemId, event)
1014521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
1015521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var inputElements = Object.values(this._editInputElements[itemId]);
1016521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (inputElements.indexOf(event.relatedTarget) !== -1)
1017521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
1018521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1019521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var listItem = this.itemForId(itemId);
1020a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        listItem.classList.remove("item-editing");
1021521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        delete this._editingId;
1022521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1023521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._hasChanges(itemId))
1024521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
1025521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1026521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._validateEdit(itemId)) {
1027521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var columns = this.columns();
1028521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            for (var i = 0; i < columns.length; ++i) {
1029521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                var columnId = columns[i];
1030521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                var inputElement = this._editInputElements[itemId][columnId];
1031521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                inputElement.value = this._textElements[itemId][columnId].textContent;
1032a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                inputElement.classList.remove("editable-item-error");
1033521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            }
1034521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
1035521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
1036521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._editHandler(itemId, this._data(itemId));
1037521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
1038521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1039521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    _onAddMappingInputBlur: function(event)
1040521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    {
1041521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var inputElements = Object.values(this._addInputElements);
1042521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (inputElements.indexOf(event.relatedTarget) !== -1)
1043521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
1044521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1045521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._hasChanges(null))
1046521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
1047521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1048521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!this._validateEdit(null))
1049521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return;
1050521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1051521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        this._editHandler(null, this._data(null));
1052521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var columns = this.columns();
1053521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        for (var i = 0; i < columns.length; ++i) {
1054521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var columnId = columns[i];
1055521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            var inputElement = this._addInputElements[columnId];
1056521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            inputElement.value = "";
1057521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
1058521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    },
1059521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1060521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    __proto__: WebInspector.SettingsList.prototype
1061521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
106209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1063f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)WebInspector._settingsController = new WebInspector.SettingsController();
1064