1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// found in the LICENSE file.
4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI = {}
6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
7197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!Document} document
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!function(!function(string))=} titleProvider
10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @return {!Element}
11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
12197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI.createDeviceSelect = function(document, titleProvider)
13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
14197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var p = document.createElement("p");
15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var deviceSelectElement = p.createChild("select");
17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    deviceSelectElement.addEventListener("change", deviceSelected, false);
18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
19c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    var saveButton = p.createChild("button");
20197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    saveButton.textContent = WebInspector.UIString("Save as");
21197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    saveButton.addEventListener("click", saveClicked, false);
22197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    var removeButton = p.createChild("button");
24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    removeButton.textContent = WebInspector.UIString("Remove");
25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    removeButton.addEventListener("click", removeClicked, false);
26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // This has to be object, not boolean, otherwise its value doesn't update properly.
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var emulatedSettingChangedMuted = { muted: false };
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.emulateResolution.addChangeListener(emulatedSettingChanged);
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.deviceWidth.addChangeListener(emulatedSettingChanged);
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.deviceHeight.addChangeListener(emulatedSettingChanged);
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.deviceScaleFactor.addChangeListener(emulatedSettingChanged);
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.emulateMobile.addChangeListener(emulatedSettingChanged);
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.emulateTouch.addChangeListener(emulatedSettingChanged);
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.userAgent.addChangeListener(emulatedSettingChanged);
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.overridesSupport.settings.customDevicePresets.addChangeListener(customPresetsChanged);
38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    customPresetsChanged();
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function deviceSelected()
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        updateButtons();
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (deviceSelectElement.selectedIndex === 0)
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var option = deviceSelectElement.options[deviceSelectElement.selectedIndex];
48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        emulatedSettingChangedMuted.muted = true;
49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.overridesSupport.emulateDevice(option.device);
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        emulatedSettingChangedMuted.muted = false;
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function emulatedSettingChanged()
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (emulatedSettingChangedMuted.muted)
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var index = 0;
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 1; i < deviceSelectElement.options.length; ++i) {
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var option = deviceSelectElement.options[i];
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (WebInspector.overridesSupport.isEmulatingDevice(option.device)) {
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                index = i;
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                break;
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        deviceSelectElement.selectedIndex = index;
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        updateButtons();
68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function updateButtons()
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var index = deviceSelectElement.selectedIndex;
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var custom = deviceSelectElement.options[index].custom;
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        saveButton.disabled = !!index || !titleProvider;
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        removeButton.disabled = !custom;
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function customPresetsChanged()
79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        deviceSelectElement.removeChildren();
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var selectDeviceOption = new Option(WebInspector.UIString("<Select model>"), WebInspector.UIString("<Select model>"));
83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        selectDeviceOption.device = {title: WebInspector.UIString("<Select model>"), width: 0, height: 0, deviceScaleFactor: 0, userAgent: "", touch: false, mobile: false};
84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        selectDeviceOption.disabled = true;
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        deviceSelectElement.appendChild(selectDeviceOption);
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        addGroup(WebInspector.UIString("Custom"), WebInspector.overridesSupport.settings.customDevicePresets.get(), true);
88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        addGroup(WebInspector.UIString("Devices"), WebInspector.OverridesUI._phones.concat(WebInspector.OverridesUI._tablets));
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        addGroup(WebInspector.UIString("Notebooks"), WebInspector.OverridesUI._notebooks);
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {string} name
93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!Array.<!WebInspector.OverridesSupport.Device>} devices
94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {boolean=} custom
95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function addGroup(name, devices, custom)
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!devices.length)
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                return;
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            devices = devices.slice();
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            devices.sort(compareDevices);
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var groupElement = deviceSelectElement.createChild("optgroup");
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            groupElement.label = name;
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            for (var i = 0; i < devices.length; ++i) {
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                var option = new Option(devices[i].title, devices[i].title);
106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                option.device = devices[i];
107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                option.custom = custom;
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                groupElement.appendChild(option);
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!WebInspector.OverridesSupport.Device} device1
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!WebInspector.OverridesSupport.Device} device2
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @return {number}
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function compareDevices(device1, device2)
118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return device1.title < device2.title ? -1 : (device1.title > device2.title ? 1 : 0);
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        emulatedSettingChanged();
123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function saveClicked()
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        titleProvider(saveDevicePreset);
128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {string} title
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function saveDevicePreset(title)
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!title)
136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var device = WebInspector.overridesSupport.deviceFromCurrentSettings();
138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        device.title = title;
139197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var presets = WebInspector.overridesSupport.settings.customDevicePresets.get();
140197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        presets.push(device);
141197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.overridesSupport.settings.customDevicePresets.set(presets);
142197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
143197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function removeClicked()
145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var presets = WebInspector.overridesSupport.settings.customDevicePresets.get();
147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var option = deviceSelectElement.options[deviceSelectElement.selectedIndex];
148197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var device = option.device;
149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        presets.remove(device);
150197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.overridesSupport.settings.customDevicePresets.set(presets);
151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return p;
154197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
156197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!Document} document
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @return {!Element}
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
160197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI.createNetworkConditionsSelect = function(document)
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var networkConditionsSetting = WebInspector.overridesSupport.settings.networkConditions;
163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var conditionsSelectElement = document.createElement("select");
164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var presets = WebInspector.OverridesUI._networkConditionsPresets;
165197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (var i = 0; i < presets.length; ++i) {
166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var preset = presets[i];
167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var throughput = preset.throughput | 0;
168197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var latency = preset.latency | 0;
169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var isThrottling = (throughput > 0) || latency;
170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!isThrottling) {
171197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            conditionsSelectElement.add(new Option(preset.title, preset.id));
172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        } else {
173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var throughputText = (throughput < 1024) ? WebInspector.UIString("%d Kbps", throughput) : WebInspector.UIString("%d Mbps", (throughput / 1024) | 0);
174197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var title = WebInspector.UIString("%s (%s %dms RTT)", preset.title, throughputText, latency);
175197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var option = new Option(title, preset.id);
176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            option.title = WebInspector.UIString("Maximum download throughput: %s.\r\nMinimum round-trip time: %dms.", throughputText, latency);
177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            conditionsSelectElement.add(option);
178197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
181197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    settingChanged();
182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    networkConditionsSetting.addChangeListener(settingChanged);
183197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    conditionsSelectElement.addEventListener("change", presetSelected, false);
184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function presetSelected()
186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var selectedOption = conditionsSelectElement.options[conditionsSelectElement.selectedIndex];
188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        conditionsSelectElement.title = selectedOption.title;
189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var presetId = selectedOption.value;
190197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var preset = presets[presets.length - 1];
191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < presets.length; ++i) {
192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (presets[i].id === presetId) {
193197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                preset = presets[i];
194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                break;
195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var kbps = 1024 / 8;
198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        networkConditionsSetting.removeChangeListener(settingChanged);
199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        networkConditionsSetting.set({throughput: preset.throughput * kbps, latency: preset.latency});
200197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        networkConditionsSetting.addChangeListener(settingChanged);
201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    function settingChanged()
204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var conditions = networkConditionsSetting.get();
206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var presetIndex = presets.length - 1;
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var kbps = 1024 / 8;
208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < presets.length; ++i) {
2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (presets[i].throughput === conditions.throughput / kbps && presets[i].latency === conditions.latency) {
2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                presetIndex = i;
211197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                break;
212197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
213197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
214197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        conditionsSelectElement.selectedIndex = presetIndex;
215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        conditionsSelectElement.title = conditionsSelectElement.options[presetIndex].title;
216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
218197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return conditionsSelectElement;
219197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
221e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {!Document} document
223e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @return {{select: !Element, input: !Element}}
224e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
225e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.OverridesUI.createUserAgentSelectAndInput = function(document)
226e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
227e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var userAgentSetting = WebInspector.overridesSupport.settings.userAgent;
228e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const noOverride = {title: WebInspector.UIString("No override"), value: ""};
229e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const customOverride = {title: WebInspector.UIString("Other"), value: "Other"};
230e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var userAgents = [noOverride].concat(WebInspector.OverridesUI._userAgents).concat([customOverride]);
231e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
232e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var userAgentSelectElement = document.createElement("select");
233e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for (var i = 0; i < userAgents.length; ++i)
234e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        userAgentSelectElement.add(new Option(userAgents[i].title, userAgents[i].value));
235e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    userAgentSelectElement.selectedIndex = 0;
236e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
237e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var otherUserAgentElement = document.createElement("input");
238e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    otherUserAgentElement.type = "text";
239e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    otherUserAgentElement.value = userAgentSetting.get();
240e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    otherUserAgentElement.title = userAgentSetting.get();
241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
242e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    settingChanged();
243e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    userAgentSetting.addChangeListener(settingChanged);
244e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    userAgentSelectElement.addEventListener("change", userAgentSelected, false);
245e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
246e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    otherUserAgentElement.addEventListener("dblclick", textDoubleClicked, true);
247e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    otherUserAgentElement.addEventListener("blur", textChanged, false);
248e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    otherUserAgentElement.addEventListener("keydown", textKeyDown, false);
249e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
250e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    function userAgentSelected()
251e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
252e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var value = userAgentSelectElement.options[userAgentSelectElement.selectedIndex].value;
253e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (value !== customOverride.value) {
254e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            userAgentSetting.removeChangeListener(settingChanged);
255e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            userAgentSetting.set(value);
256e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            userAgentSetting.addChangeListener(settingChanged);
257e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.value = value;
258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.title = value;
259e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.readOnly = true;
260e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        } else {
261e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.readOnly = false;
262e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.focus();
263e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
265e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
266e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    function settingChanged()
267e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
268e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var value = userAgentSetting.get();
269e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var options = userAgentSelectElement.options;
270e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var selectionRestored = false;
271e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        for (var i = 0; i < options.length; ++i) {
272e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (options[i].value === value) {
273e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                userAgentSelectElement.selectedIndex = i;
274e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                selectionRestored = true;
275e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                break;
276e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            }
277e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
278e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
279e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        otherUserAgentElement.readOnly = selectionRestored;
280e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!selectionRestored)
281e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            userAgentSelectElement.selectedIndex = options.length - 1;
282e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
283e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (otherUserAgentElement.value !== value) {
284e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.value = value;
285e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            otherUserAgentElement.title = value;
286e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
287e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
288e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
289e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    function textKeyDown(event)
290e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
291e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (isEnterKey(event))
292e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            textChanged();
293e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
294e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
295e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    function textDoubleClicked()
296e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
297e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        userAgentSelectElement.selectedIndex = userAgents.length - 1;
298e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        userAgentSelected();
299e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
300e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
301e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    function textChanged()
302e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
303e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (userAgentSetting.get() !== otherUserAgentElement.value)
304e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            userAgentSetting.set(otherUserAgentElement.value);
305e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
306e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
307e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return { select: userAgentSelectElement, input: otherUserAgentElement };
308e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
309e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/** @type {!Array.<!WebInspector.OverridesSupport.Device>} */
311197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI._phones = [
312197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Apple iPhone 3GS", width: 320, height: 480, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", touch: true, mobile: true},
313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Apple iPhone 4", width: 320, height: 480, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", touch: true, mobile: true},
314197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Apple iPhone 5", width: 320, height: 568, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53", touch: true, mobile: true},
3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {title: "Apple iPhone 6", width: 375, height: 667, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4", touch: true, mobile: true},
3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {title: "Apple iPhone 6 Plus", width: 414, height: 736, deviceScaleFactor: 3, userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4", touch: true, mobile: true},
317197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "BlackBerry Z10", width: 384, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+", touch: true, mobile: true},
318197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "BlackBerry Z30", width: 360, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+", touch: true, mobile: true},
319197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Google Nexus 4", width: 384, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19", touch: true, mobile: true},
320197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Google Nexus 5", width: 360, height: 640, deviceScaleFactor: 3, userAgent: "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19", touch: true, mobile: true},
321197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Google Nexus S", width: 320, height: 533, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Nexus S Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
322197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "HTC Evo, Touch HD, Desire HD, Desire", width: 320, height: 533, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
323197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "HTC One X, EVO LTE", width: 360, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19", touch: true, mobile: true},
324197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "HTC Sensation, Evo 3D", width: 360, height: 640, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", touch: true, mobile: true},
325197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "LG Optimus 2X, Optimus 3D, Optimus Black", width: 320, height: 533, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; LG-P990/V08c Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2", touch: true, mobile: true},
326197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "LG Optimus G", width: 384, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; Android 4.0; LG-E975 Build/IMM76L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19", touch: true, mobile: true},
327197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "LG Optimus LTE, Optimus 4X HD", width: 424, height: 753, deviceScaleFactor: 1.7, userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; LG-P930 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
328197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "LG Optimus One", width: 213, height: 320, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; LG-MS690 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
329197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Motorola Defy, Droid, Droid X, Milestone", width: 320, height: 569, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", touch: true, mobile: true},
330197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2", width: 540, height: 960, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
331197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Motorola Droid Razr HD", width: 720, height: 1280, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
332197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Nokia C5, C6, C7, N97, N8, X7", width: 360, height: 640, deviceScaleFactor: 1, userAgent: "NokiaN97/21.1.107 (SymbianOS/9.4; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebkit/525 (KHTML, like Gecko) BrowserNG/7.1.4", touch: true, mobile: true},
333197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900", width: 320, height: 533, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 820)", touch: true, mobile: true},
334197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy Note 3", width: 360, height: 640, deviceScaleFactor: 3, userAgent: "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", touch: true, mobile: true},
335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy Note II", width: 360, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", touch: true, mobile: true},
336197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy Note", width: 400, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; SAMSUNG-SGH-I717 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
337197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy S III, Galaxy Nexus", width: 360, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", touch: true, mobile: true},
338197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy S, S II, W", width: 320, height: 533, deviceScaleFactor: 1.5, userAgent: "Mozilla/5.0 (Linux; U; Android 2.1; en-us; GT-I9000 Build/ECLAIR) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", touch: true, mobile: true},
339197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy S4", width: 360, height: 640, deviceScaleFactor: 3, userAgent: "Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36", touch: true, mobile: true},
340197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Sony Xperia S, Ion", width: 360, height: 640, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; U; Android 4.0; en-us; LT28at Build/6.1.C.1.111) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", touch: true, mobile: true},
341197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Sony Xperia Sola, U", width: 480, height: 854, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; SonyEricssonST25i Build/6.0.B.1.564) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
342197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Sony Xperia Z, Z1", width: 360, height: 640, deviceScaleFactor: 3, userAgent: "Mozilla/5.0 (Linux; U; Android 4.2; en-us; SonyC6903 Build/14.1.G.1.518) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", touch: true, mobile: true}
343197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch];
344197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
345197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/** @type {!Array.<!WebInspector.OverridesSupport.Device>} */
346197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI._tablets = [
347197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Amazon Kindle Fire HDX 7″", width: 1920, height: 1200, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true", touch: true, mobile: true},
348197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Amazon Kindle Fire HDX 8.9″", width: 2560, height: 1600, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true", touch: true, mobile: true},
349197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Amazon Kindle Fire (First Generation)", width: 1024, height: 600, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.0.141.16-Gen4_11004310) AppleWebkit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true", touch: true, mobile: true},
350197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Apple iPad 1 / 2 / iPad Mini", width: 1024, height: 768, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (iPad; CPU OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5", touch: true, mobile: true},
351197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Apple iPad 3 / 4", width: 1024, height: 768, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53", touch: true, mobile: true},
352197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "BlackBerry PlayBook", width: 1024, height: 600, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+", touch: true, mobile: true},
353197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Google Nexus 10", width: 1280, height: 800, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36", touch: true, mobile: true},
354197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Google Nexus 7 2", width: 960, height: 600, deviceScaleFactor: 2, userAgent: "Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36", touch: true, mobile: true},
355197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Google Nexus 7", width: 966, height: 604, deviceScaleFactor: 1.325, userAgent: "Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36", touch: true, mobile: true},
356197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Motorola Xoom, Xyboard", width: 1280, height: 800, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", touch: true, mobile: true},
357197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy Tab 7.7, 8.9, 10.1", width: 1280, height: 800, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true},
358197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Samsung Galaxy Tab", width: 1024, height: 600, deviceScaleFactor: 1, userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", touch: true, mobile: true}
359197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch];
360197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
361197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/** @type {!Array.<!WebInspector.OverridesSupport.Device>} */
362197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI._notebooks = [
363197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Notebook with touch", width: 1280, height: 950, deviceScaleFactor: 1, userAgent: "", touch: true, mobile: false},
364197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Notebook with HiDPI screen", width: 1440, height: 900, deviceScaleFactor: 2, userAgent: "", touch: false, mobile: false},
365197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {title: "Generic notebook", width: 1280, height: 800, deviceScaleFactor: 1, userAgent: "", touch: false, mobile: false}
366197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch];
367197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
368197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/** @type {!Array.<!WebInspector.OverridesSupport.NetworkConditionsPreset>} */
369197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.OverridesUI._networkConditionsPresets = [
370197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "offline", title: "Offline", throughput: 0, latency: 0},
371197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "gprs", title: "GPRS", throughput: 50, latency: 500},
372197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "edge", title: "EDGE", throughput: 250, latency: 300},
373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "3g", title: "3G", throughput: 750, latency: 100},
374197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "dsl", title: "DSL", throughput: 2 * 1024, latency: 5},
375197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "wifi", title: "WiFi", throughput: 30 * 1024, latency: 2},
376197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {id: "online", title: "No throttling", throughput: WebInspector.OverridesSupport.NetworkThroughputUnlimitedValue, latency: 0}
377197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch];
378e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
379e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/** @type {!Array.<{title: string, value: string}>} */
380e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.OverridesUI._userAgents = [
381e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Android 4.0.2 \u2014 Galaxy Nexus", value: "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"},
382e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Android 2.3 \u2014 Nexus S", value: "Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"},
383e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "BlackBerry \u2014 BB10", value: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+"},
384e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "BlackBerry \u2014 PlayBook 2.1", value: "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+"},
385e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "BlackBerry \u2014 9900", value: "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.187 Mobile Safari/534.11+"},
386e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Chrome 31 \u2014 Mac", value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"},
387e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Chrome 31 \u2014 Windows", value: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"},
388e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Chrome \u2014 Android Tablet", value: "Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"},
389e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Chrome \u2014 Android Mobile", value: "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"},
3909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    {title: "Chrome \u2014 iPad", value: "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25"},
3919e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    {title: "Chrome \u2014 iPhone", value: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A501 Safari/8536.25"},
392e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Firefox 14 \u2014 Android Mobile", value: "Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0"},
393e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Firefox 14 \u2014 Android Tablet", value: "Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0"},
394e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Firefox 4 \u2014 Mac", value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"},
395e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Firefox 4 \u2014 Windows", value: "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"},
396e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Firefox 7 \u2014 Mac", value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"},
397e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Firefox 7 \u2014 Windows", value: "Mozilla/5.0 (Windows NT 6.1; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"},
398e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Internet Explorer 10", value: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"},
399e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Internet Explorer 7", value: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"},
400e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Internet Explorer 8", value: "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"},
401e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Internet Explorer 9", value: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"},
4027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {title: "iPad \u2014 iOS 8", value: "Mozilla/5.0 (iPad; CPU OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"},
403e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "iPad \u2014 iOS 7", value: "Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53"},
404e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "iPad \u2014 iOS 6", value: "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"},
4057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {title: "iPhone \u2014 iOS 8", value: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"},
406e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "iPhone \u2014 iOS 7", value: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53"},
407e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "iPhone \u2014 iOS 6", value: "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"},
408e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "MeeGo \u2014 Nokia N9", value: "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13"},
409e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Opera 18 \u2014 Mac", value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"},
410e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Opera 18 \u2014 Windows", value: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"},
411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Opera 12 \u2014 Mac", value: "Opera/9.80 (Macintosh; Intel Mac OS X 10.9.1) Presto/2.12.388 Version/12.16"},
412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Opera 12 \u2014 Windows", value: "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16"},
413e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Silk \u2014 Kindle Fire (Desktop view)", value: "Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true"},
414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {title: "Silk \u2014 Kindle Fire (Mobile view)", value: "Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Mobile Safari/535.19 Silk-Accelerated=true"}
415e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)];