| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| defineCustomElement('log-file-reader', (templateText) => |
| class LogFileReader extends HTMLElement { |
| constructor() { |
| super(); |
| const shadowRoot = this.attachShadow({mode: 'open'}); |
| shadowRoot.innerHTML = templateText; |
| this.addEventListener('click', e => this.handleClick(e)); |
| this.addEventListener('dragover', e => this.handleDragOver(e)); |
| this.addEventListener('drop', e => this.handleChange(e)); |
| this.$('#file').addEventListener('change', e => this.handleChange(e)); |
| this.$('#fileReader').addEventListener('keydown', e => this.handleKeyEvent(e)); |
| } |
| |
| $(id) { |
| return this.shadowRoot.querySelector(id); |
| } |
| |
| get section() { |
| return this.$('#fileReaderSection'); |
| } |
| |
| updateLabel(text) { |
| this.$('#label').innerText = text; |
| } |
| |
| handleKeyEvent(event) { |
| if (event.key == "Enter") this.handleClick(event); |
| } |
| |
| handleClick(event) { |
| this.$('#file').click(); |
| } |
| |
| handleChange(event) { |
| // Used for drop and file change. |
| event.preventDefault(); |
| var host = event.dataTransfer ? event.dataTransfer : event.target; |
| this.readFile(host.files[0]); |
| } |
| |
| handleDragOver(event) { |
| event.preventDefault(); |
| } |
| |
| connectedCallback() { |
| this.$('#fileReader').focus(); |
| } |
| |
| readFile(file) { |
| if (!file) { |
| this.updateLabel('Failed to load file.'); |
| return; |
| } |
| this.$('#fileReader').blur(); |
| this.section.className = 'loading'; |
| const reader = new FileReader(); |
| reader.onload = (e) => { |
| try { |
| let dataModel = Object.create(null); |
| dataModel.file = file; |
| dataModel.chunk = e.target.result; |
| this.updateLabel('Finished loading \'' + file.name + '\'.'); |
| this.dispatchEvent(new CustomEvent( |
| 'change', {bubbles: true, composed: true, detail: dataModel})); |
| this.section.className = 'success'; |
| this.$('#fileReader').classList.add('done'); |
| } catch (err) { |
| console.error(err); |
| this.section.className = 'failure'; |
| } |
| }; |
| // Delay the loading a bit to allow for CSS animations to happen. |
| setTimeout(() => reader.readAsText(file), 0); |
| } |
| }); |