chrome-devtools-frontend
Version:
Chrome DevTools UI
141 lines (118 loc) • 5.5 kB
text/typescript
// Copyright 2022 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 type * as Common from '../../core/common/common.js';
import * as SDK from '../../core/sdk/sdk.js';
import type * as Protocol from '../../generated/protocol.js';
import {renderElementIntoDOM} from '../../testing/DOMHelpers.js';
import {
createTarget,
stubNoopSettings,
} from '../../testing/EnvironmentHelpers.js';
import {describeWithMockConnection} from '../../testing/MockConnection.js';
import {SECURITY_ORIGIN} from '../../testing/ResourceTreeHelpers.js';
import {createViewFunctionStub} from '../../testing/ViewFunctionHelpers.js';
import * as RenderCoordinator from '../../ui/components/render_coordinator/render_coordinator.js';
import * as UI from '../../ui/legacy/legacy.js';
import * as Application from './application.js';
class SharedStorageItemsListener {
#dispatcher:
Common.ObjectWrapper.ObjectWrapper<Application.SharedStorageItemsView.SharedStorageItemsDispatcher.EventTypes>;
#refreshed = false;
constructor(dispatcher: Common.ObjectWrapper
.ObjectWrapper<Application.SharedStorageItemsView.SharedStorageItemsDispatcher.EventTypes>) {
this.#dispatcher = dispatcher;
this.#dispatcher.addEventListener(
Application.SharedStorageItemsView.SharedStorageItemsDispatcher.Events.ITEMS_REFRESHED, this.#itemsRefreshed,
this);
}
dispose(): void {
this.#dispatcher.removeEventListener(
Application.SharedStorageItemsView.SharedStorageItemsDispatcher.Events.ITEMS_REFRESHED, this.#itemsRefreshed,
this);
}
#itemsRefreshed(): void {
this.#refreshed = true;
}
async waitForItemsRefreshed(): Promise<void> {
if (!this.#refreshed) {
await this.#dispatcher.once(
Application.SharedStorageItemsView.SharedStorageItemsDispatcher.Events.ITEMS_REFRESHED);
}
this.#refreshed = false;
}
}
describeWithMockConnection('SharedStorageTreeElement', function() {
let target: SDK.Target.Target;
let sharedStorageModel: Application.SharedStorageModel.SharedStorageModel;
let sharedStorage: Application.SharedStorageModel.SharedStorageForOrigin;
const METADATA = {
creationTime: 100 as Protocol.Network.TimeSinceEpoch,
length: 3,
remainingBudget: 2.5,
bytesUsed: 30,
} as unknown as Protocol.Storage.SharedStorageMetadata;
const ENTRIES = [
{
key: 'key1',
value: 'a',
} as unknown as Protocol.Storage.SharedStorageEntry,
{
key: 'key2',
value: 'b',
} as unknown as Protocol.Storage.SharedStorageEntry,
{
key: 'key3',
value: 'c',
} as unknown as Protocol.Storage.SharedStorageEntry,
];
beforeEach(async () => {
stubNoopSettings();
SDK.ChildTargetManager.ChildTargetManager.install();
const tabTarget = createTarget({type: SDK.Target.Type.TAB});
createTarget({parentTarget: tabTarget, subtype: 'prerender'});
target = createTarget({parentTarget: tabTarget});
sharedStorageModel = target.model(Application.SharedStorageModel.SharedStorageModel) as
Application.SharedStorageModel.SharedStorageModel;
sharedStorage = new Application.SharedStorageModel.SharedStorageForOrigin(sharedStorageModel, SECURITY_ORIGIN);
assert.strictEqual(sharedStorage.securityOrigin, SECURITY_ORIGIN);
});
it('shows view on select', async () => {
sinon.stub(sharedStorageModel.storageAgent, 'invoke_setSharedStorageTracking').resolves({
getError: () => undefined,
});
const getMetadataSpy = sinon.stub(sharedStorageModel.storageAgent, 'invoke_getSharedStorageMetadata').resolves({
metadata: METADATA,
getError: () => undefined,
});
const getEntriesSpy = sinon.stub(sharedStorageModel.storageAgent, 'invoke_getSharedStorageEntries').resolves({
entries: ENTRIES,
getError: () => undefined,
});
const container = document.createElement('div');
renderElementIntoDOM(container);
const panel = Application.ResourcesPanel.ResourcesPanel.instance({forceNew: true});
panel.markAsRoot();
panel.show(container);
const toolbar = new Application.StorageItemsToolbar.StorageItemsToolbar();
const viewFunction = createViewFunctionStub(Application.SharedStorageItemsView.SharedStorageItemsView, {toolbar});
const treeElement = new Application.SharedStorageTreeElement.SharedStorageTreeElement(panel, sharedStorage);
treeElement.view =
await Application.SharedStorageItemsView.SharedStorageItemsView.createView(sharedStorage, viewFunction);
await RenderCoordinator.done({waitForWork: true});
sinon.assert.calledOnceWithExactly(getMetadataSpy, {ownerOrigin: SECURITY_ORIGIN});
const {view} = treeElement;
const itemsListener = new SharedStorageItemsListener(view.sharedStorageItemsDispatcher);
const refreshedPromise = itemsListener.waitForItemsRefreshed();
container.appendChild(treeElement.listItemNode);
treeElement.treeOutline = new UI.TreeOutline.TreeOutlineInShadow();
treeElement.selectable = true;
treeElement.select();
await refreshedPromise;
sinon.assert.calledTwice(getMetadataSpy);
sinon.assert.alwaysCalledWithExactly(getMetadataSpy, {ownerOrigin: SECURITY_ORIGIN});
sinon.assert.alwaysCalledWithExactly(getEntriesSpy, {ownerOrigin: SECURITY_ORIGIN});
assert.deepEqual(viewFunction.input.items, ENTRIES);
panel.detach();
});
});