UNPKG

chrome-devtools-frontend

Version:
186 lines (146 loc) 7.01 kB
// Copyright 2024 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. import * as Common from '../../../core/common/common.js'; import * as SDK from '../../../core/sdk/sdk.js'; import {getCleanTextContentFromElements, renderElementIntoDOM} from '../../../testing/DOMHelpers.js'; import {describeWithEnvironment} from '../../../testing/EnvironmentHelpers.js'; import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js'; import * as MobileThrottling from '../../mobile_throttling/mobile_throttling.js'; import * as Components from './components.js'; describeWithEnvironment('NetworkThrottlingSelector', () => { let networkManager: SDK.NetworkManager.MultitargetNetworkManager; let customNetworkSetting: Common.Settings.Setting<SDK.NetworkManager.Conditions[]>; let mockReveal: sinon.SinonStub; beforeEach(() => { networkManager = SDK.NetworkManager.MultitargetNetworkManager.instance({forceNew: true}); customNetworkSetting = Common.Settings.Settings.instance().moduleSetting('custom-network-conditions'); mockReveal = sinon.stub(Common.Revealer.RevealerRegistry.instance(), 'reveal'); }); afterEach(() => { customNetworkSetting.set([]); mockReveal.restore(); }); it('should render all default presets', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); renderElementIntoDOM(view); await RenderCoordinator.done(); const groups = view.shadowRoot!.querySelectorAll('devtools-menu-group'); assert.lengthOf(groups, 3); assert.strictEqual(groups[0].name, 'Disabled'); const group1Items = groups[0].querySelectorAll('devtools-menu-item'); assert.lengthOf(group1Items, 1); assert.match(group1Items[0].innerText, /No throttling/); assert.isTrue(group1Items[0].selected); assert.strictEqual(groups[1].name, 'Presets'); const group2Items = groups[1].querySelectorAll('devtools-menu-item'); assert.lengthOf(group2Items, 4); assert.match(group2Items[0].innerText, /Fast 4G/); assert.isFalse(group2Items[0].selected); assert.match(group2Items[1].innerText, /Slow 4G/); assert.isFalse(group2Items[1].selected); assert.match(group2Items[2].innerText, /3G/); assert.isFalse(group2Items[2].selected); assert.match(group2Items[3].innerText, /Offline/); assert.isFalse(group2Items[3].selected); assert.strictEqual(groups[2].name, 'Custom'); const group3Items = groups[2].querySelectorAll('devtools-menu-item'); assert.lengthOf(group3Items, 1); assert.match(group3Items[0].innerText, /Add…/); assert.isFalse(group3Items[0].selected); }); it('updates network manager on change', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); renderElementIntoDOM(view); await RenderCoordinator.done(); const items = view.shadowRoot!.querySelectorAll('devtools-menu-item'); assert.isTrue(items[0].selected); assert.strictEqual(networkManager.networkConditions().i18nTitleKey, 'No throttling'); items[1].click(); await RenderCoordinator.done(); assert.isTrue(items[1].selected); assert.isFalse(items[0].selected); assert.strictEqual(networkManager.networkConditions().i18nTitleKey, 'Fast 4G'); }); it('correctly updates when a custom preset is selected', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); renderElementIntoDOM(view); await RenderCoordinator.done(); customNetworkSetting.set([ { title: 'Custom item one', download: 0, upload: 0, latency: 0, }, { title: 'Custom item two', download: 0, upload: 0, latency: 0, }, ]); await RenderCoordinator.done(); assert.isOk(view.shadowRoot); const items = view.shadowRoot.querySelectorAll('devtools-menu-item'); const itemsText = getCleanTextContentFromElements(view.shadowRoot, 'devtools-menu-item'); assert.deepEqual( itemsText, ['No throttling', 'Fast 4G', 'Slow 4G', '3G', 'Offline', 'Custom item one', 'Custom item two', 'Add…']); items[6].click(); await RenderCoordinator.done(); assert.deepEqual(Array.from(items).filter(i => i.selected), [items[6]]); assert.strictEqual(networkManager.networkConditions().title, 'Custom item two'); }); it('reacts to changes when it is unmounted and then remounted', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); // Change the conditions before the component is put into the DOM. networkManager.setNetworkConditions(MobileThrottling.ThrottlingPresets.ThrottlingPresets.networkPresets[1]); renderElementIntoDOM(view); await RenderCoordinator.done(); // Ensure that the component picks up the new changes and has selected the right throttling setting const items = view.shadowRoot!.querySelectorAll('devtools-menu-item'); assert.isTrue(items[2].innerText.includes('Slow 4G')); assert.isTrue(items[2].selected); }); it('reacts to network manager changes', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); renderElementIntoDOM(view); await RenderCoordinator.done(); const items = view.shadowRoot!.querySelectorAll('devtools-menu-item'); assert.isTrue(items[0].selected); networkManager.setNetworkConditions(MobileThrottling.ThrottlingPresets.ThrottlingPresets.networkPresets[1]); await RenderCoordinator.done(); assert.isTrue(items[2].selected); assert.isFalse(items[0].selected); }); it('reacts to custom setting changes', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); renderElementIntoDOM(view); await RenderCoordinator.done(); let items = view.shadowRoot!.querySelectorAll('devtools-menu-item') as NodeListOf<HTMLElement>; assert.lengthOf(items, 6); customNetworkSetting.set([{ title: 'Custom item', download: 0, upload: 0, latency: 0, }]); await RenderCoordinator.done(); items = view.shadowRoot!.querySelectorAll('devtools-menu-item') as NodeListOf<HTMLElement>; assert.lengthOf(items, 7); assert.match(items[5].innerText, /Custom item/); }); it('reveals custom throttling settings when "Add..." clicked', async () => { const view = new Components.NetworkThrottlingSelector.NetworkThrottlingSelector(); renderElementIntoDOM(view); await RenderCoordinator.done(); const items = view.shadowRoot!.querySelectorAll('devtools-menu-item'); const addItem = items[items.length - 1]; addItem.click(); assert.isFalse(addItem.selected); await RenderCoordinator.done(); sinon.assert.calledOnce(mockReveal); assert.isFalse(addItem.selected); }); });