blob: b69190f4463b900f13d285d433b6645ca1c8f75f [file] [log] [blame]
// Copyright 2017 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.
cr.define('downloadInternals', function() {
'use strict';
/** @type {!downloadInternals.DownloadInternalsBrowserProxy} */
const browserProxy =
downloadInternals.DownloadInternalsBrowserProxyImpl.getInstance();
/** @type {!Array<ServiceEntry>} */
const ongoingServiceEntries = [];
/** @type {!Array<ServiceEntry>} */
const finishedServiceEntries = [];
/** @type {!Array<ServiceRequest>} */
const serviceRequests = [];
/**
* @param {!Array<ServiceEntry>} list A list to remove the entry from.
* @param {string} guid The guid to remove from the list.
*/
function removeGuidFromList(list, guid) {
const index = list.findIndex(entry => entry.guid == guid);
if (index != -1) {
list.splice(index, 1);
}
}
/**
* Replaces the ServiceEntry specified by guid in the list or, if it's not
* found, adds a new entry.
* @param {!Array<ServiceEntry>} list A list to update.
* @param {!ServiceEntry} newEntry The new entry.
*/
function addOrUpdateEntryByGuid(list, newEntry) {
const index = list.findIndex(entry => entry.guid == newEntry.guid);
if (index != -1) {
list[index] = newEntry;
} else {
list.unshift(newEntry);
}
}
function updateEntryTables() {
const ongoingInput = new JsEvalContext({entries: ongoingServiceEntries});
jstProcess(ongoingInput, $('download-service-ongoing-entries-info'));
const finishedInput = new JsEvalContext({entries: finishedServiceEntries});
jstProcess(finishedInput, $('download-service-finished-entries-info'));
}
/**
* @param {!ServiceStatus} state The current status of the download service.
*/
function onServiceStatusChanged(state) {
$('service-state').textContent = state.serviceState;
$('service-status-model').textContent = state.modelStatus;
$('service-status-driver').textContent = state.driverStatus;
$('service-status-file').textContent = state.fileMonitorStatus;
}
/**
* @param {!Array<!ServiceEntry>} entries A list entries currently tracked by
* the download service.
*/
function onServiceDownloadsAvailable(entries) {
for (let i = 0; i < entries.length; i++) {
const entry = entries[i];
if (entry.state == ServiceEntryState.COMPLETE) {
finishedServiceEntries.unshift(entry);
} else {
ongoingServiceEntries.unshift(entry);
}
}
updateEntryTables();
}
/**
* @param {!ServiceEntry} entry The new state for a particular download
* service entry.
*/
function onServiceDownloadChanged(entry) {
if (entry.state == ServiceEntryState.COMPLETE) {
removeGuidFromList(ongoingServiceEntries, entry.guid);
addOrUpdateEntryByGuid(finishedServiceEntries, entry);
} else {
addOrUpdateEntryByGuid(ongoingServiceEntries, entry);
}
updateEntryTables();
}
/**
* @param {!ServiceEntry} entry The new state for a failed download service
* entry.
*/
function onServiceDownloadFailed(entry) {
removeGuidFromList(ongoingServiceEntries, entry.guid);
addOrUpdateEntryByGuid(finishedServiceEntries, entry);
updateEntryTables();
}
/**
* @param {!ServiceRequest} request The state for a newly issued download
* service request.
*/
function onServiceRequestMade(request) {
serviceRequests.unshift(request);
const input = new JsEvalContext({requests: serviceRequests});
jstProcess(input, $('download-service-request-info'));
}
function initialize() {
// Register all event listeners.
cr.addWebUIListener('service-status-changed', onServiceStatusChanged);
cr.addWebUIListener(
'service-downloads-available', onServiceDownloadsAvailable);
cr.addWebUIListener('service-download-changed', onServiceDownloadChanged);
cr.addWebUIListener('service-download-failed', onServiceDownloadFailed);
cr.addWebUIListener('service-request-made', onServiceRequestMade);
$('start-download').onclick = function() {
browserProxy.startDownload($('download-url').value);
};
// Kick off requests for the current system state.
browserProxy.getServiceStatus().then(onServiceStatusChanged);
browserProxy.getServiceDownloads().then(onServiceDownloadsAvailable);
}
return {
initialize: initialize,
};
});
document.addEventListener('DOMContentLoaded', downloadInternals.initialize);