Commit bd5bf8b3 authored by Jasper Chapman-Black's avatar Jasper Chapman-Black Committed by Commit Bot

SuperSize: Swap web worker to match uploaded filetype

The WebAssembly web worker parses .size and .sizediff files, the JS web
worker parses .ndjson files. Previously, the web worker would be set on
pageload according to the load_url parameter, so if you loaded a .size
file and then uploaded a .ndjson to view, the viewer would crash.

This CL refreshes the web worker on each file upload.

Change-Id: I182ac524bfd7049ed178bd2c6784bb0282f0ee8e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1946858Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Commit-Queue: Jasper Chapman-Black <jaspercb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#720656}
parent f4238605
...@@ -5,16 +5,6 @@ ...@@ -5,16 +5,6 @@
// @ts-check // @ts-check
'use strict'; 'use strict';
let _innerWorker = null;
const urlParams = new URLSearchParams(window.location.search);
const loadUrl = urlParams.get('load_url');
if (loadUrl.endsWith('.size') || loadUrl.endsWith('.sizediff')) {
console.log('Using WebAssembly web worker');
_innerWorker = new Worker('tree-worker-wasm.js');
} else {
_innerWorker = new Worker('tree-worker.js');
}
/** /**
* We use a worker to keep large tree creation logic off the UI thread. * We use a worker to keep large tree creation logic off the UI thread.
* This class is used to interact with the worker. * This class is used to interact with the worker.
...@@ -97,7 +87,26 @@ class TreeWorker { ...@@ -97,7 +87,26 @@ class TreeWorker {
} }
} }
const worker = new TreeWorker(_innerWorker); let _innerWorker = null;
let worker = null;
// .size files and .ndjson files require different web workers.
// Switch between the two dynamically.
function startWorkerForFileName(fileName) {
if (fileName &&
(fileName.endsWith('.size') || fileName.endsWith('.sizediff'))) {
console.log('Using WebAssembly web worker');
_innerWorker = new Worker('tree-worker-wasm.js');
} else {
console.log('Using JavaScript web worker');
_innerWorker = new Worker('tree-worker.js');
}
worker = new TreeWorker(_innerWorker);
}
const urlParams = new URLSearchParams(window.location.search);
startWorkerForFileName(urlParams.get('load_url'));
// Kick off the worker ASAP so it can start parsing data faster. // Kick off the worker ASAP so it can start parsing data faster.
// Subsequent calls will just use a worker locally. // Subsequent calls will just use a worker locally.
const treeReady = worker.loadTree('from-url://'); const treeReady = worker.loadTree('from-url://');
...@@ -448,6 +448,7 @@ const newTreeElement = (() => { ...@@ -448,6 +448,7 @@ const newTreeElement = (() => {
const input = /** @type {HTMLInputElement} */ (event.currentTarget); const input = /** @type {HTMLInputElement} */ (event.currentTarget);
const file = input.files.item(0); const file = input.files.item(0);
const fileUrl = URL.createObjectURL(file); const fileUrl = URL.createObjectURL(file);
startWorkerForFileName(file.name)
_dataUrlInput.value = ''; _dataUrlInput.value = '';
_dataUrlInput.dispatchEvent(new Event('change')); _dataUrlInput.dispatchEvent(new Event('change'));
......
...@@ -34,7 +34,7 @@ if ('serviceWorker' in navigator) { ...@@ -34,7 +34,7 @@ if ('serviceWorker' in navigator) {
<header class="appbar"> <header class="appbar">
<div class="appbar-inner"> <div class="appbar-inner">
<h1 class="headline">Super Size Tiger View</h1> <h1 class="headline">Super Size Tiger View</h1>
<input type="file" name="upload" id="upload" accept=".ndjson" > <input type="file" name="upload" id="upload" accept=".ndjson,.size,.sizediff" >
<label for="upload" class="text-button filled-button with-icon"> <label for="upload" class="text-button filled-button with-icon">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="#fff"> <svg class="icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="#fff">
<!-- <!--
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment