|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | export class NetworkThrottlingSelector { | 
|  | /** | 
|  | * @param {function(!Array<!MobileThrottling.NetworkThrottlingConditionsGroup>):!Array<?SDK.NetworkManager.Conditions>} populateCallback | 
|  | * @param {function(number)} selectCallback | 
|  | * @param {!Common.Setting<!Array<!SDK.NetworkManager.Conditions>>} customNetworkConditionsSetting | 
|  | */ | 
|  | constructor(populateCallback, selectCallback, customNetworkConditionsSetting) { | 
|  | this._populateCallback = populateCallback; | 
|  | this._selectCallback = selectCallback; | 
|  | this._customNetworkConditionsSetting = customNetworkConditionsSetting; | 
|  | this._customNetworkConditionsSetting.addChangeListener(this._populateOptions, this); | 
|  | SDK.multitargetNetworkManager.addEventListener( | 
|  | SDK.MultitargetNetworkManager.Events.ConditionsChanged, this._networkConditionsChanged, this); | 
|  | /** @type {!Array<?SDK.NetworkManager.Conditions>} */ | 
|  | this._options; | 
|  | this._populateOptions(); | 
|  | } | 
|  |  | 
|  | revealAndUpdate() { | 
|  | Common.Revealer.reveal(this._customNetworkConditionsSetting); | 
|  | this._networkConditionsChanged(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @param {!SDK.NetworkManager.Conditions} conditions | 
|  | */ | 
|  | optionSelected(conditions) { | 
|  | SDK.multitargetNetworkManager.setNetworkConditions(conditions); | 
|  | } | 
|  |  | 
|  | _populateOptions() { | 
|  | const disabledGroup = {title: Common.UIString('Disabled'), items: [SDK.NetworkManager.NoThrottlingConditions]}; | 
|  | const presetsGroup = {title: Common.UIString('Presets'), items: MobileThrottling.networkPresets}; | 
|  | const customGroup = {title: Common.UIString('Custom'), items: this._customNetworkConditionsSetting.get()}; | 
|  | this._options = this._populateCallback([disabledGroup, presetsGroup, customGroup]); | 
|  | if (!this._networkConditionsChanged()) { | 
|  | for (let i = this._options.length - 1; i >= 0; i--) { | 
|  | if (this._options[i]) { | 
|  | this.optionSelected(/** @type {!SDK.NetworkManager.Conditions} */ (this._options[i])); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @return {boolean} returns false if selected condition no longer exists | 
|  | */ | 
|  | _networkConditionsChanged() { | 
|  | const value = SDK.multitargetNetworkManager.networkConditions(); | 
|  | for (let index = 0; index < this._options.length; ++index) { | 
|  | const option = this._options[index]; | 
|  | if (option && option.download === value.download && option.upload === value.upload && | 
|  | option.latency === value.latency && option.title === value.title) { | 
|  | this._selectCallback(index); | 
|  | return true; | 
|  | } | 
|  | } | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Legacy exported object */ | 
|  | self.MobileThrottling = self.MobileThrottling || {}; | 
|  |  | 
|  | /* Legacy exported object */ | 
|  | MobileThrottling = MobileThrottling || {}; | 
|  |  | 
|  | /** @constructor */ | 
|  | MobileThrottling.NetworkThrottlingSelector = NetworkThrottlingSelector; |