| // Copyright 2019 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. |
| |
| Network.BinaryResourceView = class extends UI.VBox { |
| /** |
| * @param {string} base64content |
| * @param {string} contentUrl |
| * @param {!Common.ResourceType} resourceType |
| */ |
| constructor(base64content, contentUrl, resourceType) { |
| super(); |
| this.registerRequiredCSS('network/binaryResourceView.css'); |
| |
| /** @type {boolean} */ |
| this._empty = !base64content.length; |
| if (this._empty) { |
| new UI.EmptyWidget('No data present in selected item').show(this.element); |
| return; |
| } |
| |
| this._binaryResourceViewFactory = |
| new SourceFrame.BinaryResourceViewFactory(base64content, contentUrl, resourceType); |
| |
| this._toolbar = new UI.Toolbar('binary-view-toolbar', this.element); |
| |
| /** @type {!Array<!Network.BinaryResourceView.BinaryViewObject>} */ |
| this._binaryViewObjects = [ |
| new Network.BinaryResourceView.BinaryViewObject( |
| 'base64', ls`Base64`, ls`Copied as Base64`, |
| this._binaryResourceViewFactory.createBase64View.bind(this._binaryResourceViewFactory), |
| this._binaryResourceViewFactory.base64.bind(this._binaryResourceViewFactory)), |
| new Network.BinaryResourceView.BinaryViewObject( |
| 'hex', ls`Hex Viewer`, ls`Copied as Hex`, |
| this._binaryResourceViewFactory.createHexView.bind(this._binaryResourceViewFactory), |
| this._binaryResourceViewFactory.hex.bind(this._binaryResourceViewFactory)), |
| new Network.BinaryResourceView.BinaryViewObject( |
| 'utf8', ls`UTF-8`, ls`Copied as UTF-8`, |
| this._binaryResourceViewFactory.createUtf8View.bind(this._binaryResourceViewFactory), |
| this._binaryResourceViewFactory.utf8.bind(this._binaryResourceViewFactory)), |
| ]; |
| this._binaryViewTypeSetting = Common.settings.createSetting('binaryViewType', 'hex'); |
| this._binaryViewTypeCombobox = new UI.ToolbarComboBox(this._binaryViewTypeChanged.bind(this), ls`Binary view type`); |
| for (const viewObject of this._binaryViewObjects) { |
| this._binaryViewTypeCombobox.addOption( |
| this._binaryViewTypeCombobox.createOption(viewObject.label, viewObject.type)); |
| } |
| this._toolbar.appendToolbarItem(this._binaryViewTypeCombobox); |
| |
| const copyButton = new UI.ToolbarButton(ls`Copy to clipboard`, 'largeicon-copy'); |
| copyButton.addEventListener(UI.ToolbarButton.Events.Click, this._copySelectedViewToClipboard.bind(this), this); |
| this._toolbar.appendToolbarItem(copyButton); |
| |
| this._copiedText = new UI.ToolbarText(); |
| this._copiedText.element.classList.add('binary-view-copied-text'); |
| this._toolbar.element.appendChild(this._copiedText.element); |
| |
| /** @type {?number} */ |
| this._addFadeoutSettimeoutId = null; |
| |
| /** @type {?UI.Widget} */ |
| this._lastView = null; |
| this._updateView(); |
| } |
| |
| /** |
| * @return {?Network.BinaryResourceView.BinaryViewObject} |
| */ |
| _getCurrentViewObject() { |
| const filter = obj => obj.type === this._binaryViewTypeSetting.get(); |
| const binaryViewObject = this._binaryViewObjects.find(filter); |
| console.assert( |
| binaryViewObject, |
| `No binary view found for binary view type found in setting 'binaryViewType': ${ |
| this._binaryViewTypeSetting.get()}`); |
| return binaryViewObject || null; |
| } |
| |
| async _copySelectedViewToClipboard() { |
| const viewObject = this._getCurrentViewObject(); |
| Host.InspectorFrontendHost.copyText((await viewObject.content()).content); |
| this._copiedText.setText(viewObject.copiedMessage); |
| this._copiedText.element.classList.remove('fadeout'); |
| /** |
| * @this {!Network.BinaryResourceView} |
| */ |
| function addFadeoutClass() { |
| this._copiedText.element.classList.add('fadeout'); |
| } |
| if (this._addFadeoutSettimeoutId) { |
| clearTimeout(this._addFadeoutSettimeoutId); |
| this._addFadeoutSettimeoutId = null; |
| } |
| this._addFadeoutSettimeoutId = setTimeout(addFadeoutClass.bind(this), 2000); |
| } |
| |
| /** |
| * @override |
| */ |
| wasShown() { |
| if (!this._empty) { |
| this._updateView(); |
| } |
| } |
| |
| _updateView() { |
| const newViewObject = this._getCurrentViewObject(); |
| if (!newViewObject) { |
| return; |
| } |
| |
| const newView = newViewObject.getView(); |
| if (newView === this._lastView) { |
| return; |
| } |
| |
| if (this._lastView) { |
| this._lastView.detach(); |
| } |
| this._lastView = newView; |
| |
| newView.show(this.element, this._toolbar.element); |
| this._binaryViewTypeCombobox.selectElement().value = this._binaryViewTypeSetting.get(); |
| } |
| |
| _binaryViewTypeChanged() { |
| const newViewType = this._binaryViewTypeCombobox.selectedOption().value; |
| if (this._binaryViewTypeSetting.get() === newViewType) { |
| return; |
| } |
| this._binaryViewTypeSetting.set(newViewType); |
| this._updateView(); |
| } |
| |
| /** |
| * @param {!UI.ContextMenu} contextMenu |
| * @param {string} submenuItemText |
| */ |
| addCopyToContextMenu(contextMenu, submenuItemText) { |
| if (this._empty) { |
| return; |
| } |
| const copyMenu = contextMenu.clipboardSection().appendSubMenuItem(submenuItemText); |
| const footerSection = copyMenu.footerSection(); |
| |
| footerSection.appendItem(ls`Copy as Base64`, async () => { |
| const content = await this._binaryResourceViewFactory.base64(); |
| Host.InspectorFrontendHost.copyText(content.content); |
| }); |
| footerSection.appendItem(ls`Copy as Hex`, async () => { |
| const content = await this._binaryResourceViewFactory.hex(); |
| Host.InspectorFrontendHost.copyText(content.content); |
| }); |
| footerSection.appendItem(ls`Copy as UTF-8`, async () => { |
| const content = await this._binaryResourceViewFactory.utf8(); |
| Host.InspectorFrontendHost.copyText(content.content); |
| }); |
| } |
| }; |
| |
| Network.BinaryResourceView.BinaryViewObject = class { |
| /** |
| * @param {string} type |
| * @param {string} label |
| * @param {string} copiedMessage |
| * @param {function():!UI.Widget} createViewFn |
| * @param {function():Promise<!Common.DeferredContent>} deferredContent |
| */ |
| constructor(type, label, copiedMessage, createViewFn, deferredContent) { |
| this.type = type; |
| this.label = label; |
| this.copiedMessage = copiedMessage; |
| this.content = deferredContent; |
| this._createViewFn = createViewFn; |
| |
| /** @type {?UI.Widget} */ |
| this._view = null; |
| } |
| |
| /** |
| * @return {!UI.Widget} |
| */ |
| getView() { |
| if (!this._view) { |
| this._view = this._createViewFn(); |
| } |
| return this._view; |
| } |
| }; |