Commit 57c04cd6 authored by Alex Danilo's avatar Alex Danilo Committed by Chromium LUCI CQ

[progress center] Remove progress center groups

Progress center groups are not used, remove the code.

Move ProgressCenterItem array to progress_center_panel.js to replace
the equivalent from progress_center_item_group.js

Bug: 1027012
Change-Id: I7e9584aa8992ca0ece616bc7a046fb2da50f69a2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2568919
Commit-Queue: Alex Danilo <adanilo@chromium.org>
Reviewed-by: default avatarLuciano Pacheco <lucmult@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832712}
parent 6a563da4
...@@ -221,10 +221,6 @@ IN_PROC_BROWSER_TEST_F(FileManagerJsTest, NavigationListModelTest) { ...@@ -221,10 +221,6 @@ IN_PROC_BROWSER_TEST_F(FileManagerJsTest, NavigationListModelTest) {
RunTestURL("foreground/js/navigation_list_model_unittest_gen.html"); RunTestURL("foreground/js/navigation_list_model_unittest_gen.html");
} }
IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ProgressCenterItemGroupTest) {
RunTestURL("foreground/js/progress_center_item_group_unittest_gen.html");
}
IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ProvidersModel) { IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ProvidersModel) {
RunTestURL("foreground/js/providers_model_unittest_gen.html"); RunTestURL("foreground/js/providers_model_unittest_gen.html");
} }
......
...@@ -71,7 +71,6 @@ js_type_check("closure_compile_module") { ...@@ -71,7 +71,6 @@ js_type_check("closure_compile_module") {
":navigation_list_model", ":navigation_list_model",
":navigation_uma", ":navigation_uma",
":path_component", ":path_component",
":progress_center_item_group",
":providers_model", ":providers_model",
":quick_view_controller", ":quick_view_controller",
":quick_view_model", ":quick_view_model",
...@@ -700,20 +699,6 @@ js_library("path_component") { ...@@ -700,20 +699,6 @@ js_library("path_component") {
deps = [ "//ui/file_manager/base/js:volume_manager_types" ] deps = [ "//ui/file_manager/base/js:volume_manager_types" ]
} }
js_library("progress_center_item_group") {
deps = [
"//ui/file_manager/file_manager/common/js:progress_center_common",
"//ui/file_manager/file_manager/common/js:util",
]
}
js_unittest("progress_center_item_group_unittest") {
deps = [
":progress_center_item_group",
"//ui/file_manager/base/js:test_error_reporting",
]
}
js_library("providers_model") { js_library("providers_model") {
deps = [ "//ui/webui/resources/js:assert" ] deps = [ "//ui/webui/resources/js:assert" ]
} }
...@@ -914,7 +899,6 @@ js_test_gen_html("js_test_gen_html") { ...@@ -914,7 +899,6 @@ js_test_gen_html("js_test_gen_html") {
":import_controller_unittest", ":import_controller_unittest",
":list_thumbnail_loader_unittest", ":list_thumbnail_loader_unittest",
":navigation_list_model_unittest", ":navigation_list_model_unittest",
":progress_center_item_group_unittest",
":providers_model_unittest", ":providers_model_unittest",
":spinner_controller_unittest", ":spinner_controller_unittest",
":task_controller_unittest", ":task_controller_unittest",
......
...@@ -147,7 +147,6 @@ ...@@ -147,7 +147,6 @@
// <include src="navigation_list_model.js"> // <include src="navigation_list_model.js">
// <include src="navigation_uma.js"> // <include src="navigation_uma.js">
// <include src="path_component.js"> // <include src="path_component.js">
// <include src="progress_center_item_group.js">
// <include src="quick_view_controller.js"> // <include src="quick_view_controller.js">
// <include src="quick_view_model.js"> // <include src="quick_view_model.js">
// <include src="quick_view_uma.js"> // <include src="quick_view_uma.js">
......
// Copyright 2014 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.
/**
* Group of progress item in the progress center panels.
*
* This is responsible for generating the summarized item and managing lifetime
* of error items.
*/
class ProgressCenterItemGroup {
/**
* @param {string} name Name of the group.
* @param {boolean} quiet Whether the group is for quiet items or not.
*/
constructor(name, quiet) {
/**
* Name of the group.
* @private @const {string}
*/
this.name_ = name;
/**
* Whether the group is for quiet items or not.
* @private @const {boolean}
*/
this.quiet_ = quiet;
/**
* State of the group.
* @private {!ProgressCenterItemGroup.State}
*/
this.state_ = ProgressCenterItemGroup.State.EMPTY;
/**
* Items that are progressing, or completed but still animated.
* Key is item ID.
* @private {!Object<ProgressCenterItem>}
*/
this.items_ = {};
/**
* Set of animated state of items. Key is item ID and value is whether the
* item is animated or not.
* @private {!Object<boolean>}
*/
this.animated_ = {};
/**
* Last summarized item.
* @private {?ProgressCenterItem}
*/
this.summarizedItem_ = null;
/**
* Whether the summarized item is animated or not.
* @private {boolean}
*/
this.summarizedItemAnimated_ = false;
/**
* Total maximum progress value of items already completed and removed from
* this.items_.
* @private {number}
*/
this.totalProgressMax_ = 0;
/**
* Total progress value of items already completed and removed from
* this.items_.
* @private {number}
*/
this.totalProgressValue_ = 0;
}
/**
* @return {ProgressCenterItemGroup.State} State of the group.
*/
get state() {
return this.state_;
}
/**
* Obtains the progressing (or completed but animated) item.
*
* @param {string} id Item ID.
* @return {ProgressCenterItem} Item having the ID.
*/
getItem(id) {
return this.items_[id] || null;
}
/**
* Obtains whether the item should be animated or not.
* @param {string} id Item ID.
* @return {boolean} Whether the item should be animated or not.
*/
isAnimated(id) {
return !!this.animated_[id];
}
/**
* Dismisses an error item.
* @param {string} id Item id.
*/
dismissErrorItem(id) {
const errorItem = this.items_[id];
if (!errorItem || errorItem.state !== ProgressItemState.ERROR) {
return;
}
delete this.items_[id];
this.tryToGoToNextState_();
}
/**
* Starts item update.
* Marks the given item as updating.
* @param {ProgressCenterItem} item Item containing updated information.
*/
update(item) {
// Compares the current state and the new state to check if the update is
// valid or not.
const previousItem = this.items_[item.id];
switch (item.state) {
case ProgressItemState.ERROR:
if (previousItem &&
previousItem.state !== ProgressItemState.PROGRESSING) {
return;
}
if (this.state_ === ProgressCenterItemGroup.State.EMPTY) {
this.state_ = ProgressCenterItemGroup.State.INACTIVE;
}
this.items_[item.id] = item.clone();
this.animated_[item.id] = false;
this.summarizedItem_ = null;
break;
case ProgressItemState.PROGRESSING:
case ProgressItemState.COMPLETED:
if ((!previousItem && item.state === ProgressItemState.COMPLETED) ||
(previousItem &&
previousItem.state !== ProgressItemState.PROGRESSING)) {
return;
}
if (this.state_ === ProgressCenterItemGroup.State.EMPTY ||
this.state_ === ProgressCenterItemGroup.State.INACTIVE) {
this.state_ = ProgressCenterItemGroup.State.ACTIVE;
}
this.items_[item.id] = item.clone();
this.animated_[item.id] = ProgressCenterItemGroup.shouldAnimate_(
!!this.animated_[item.id], previousItem, item,
/* summarized */ false);
if (!this.animated_[item.id]) {
this.completeItemAnimation(item.id);
}
break;
case ProgressItemState.CANCELED:
if (!previousItem ||
previousItem.state !== ProgressItemState.PROGRESSING) {
return;
}
delete this.items_[item.id];
this.animated_[item.id] = false;
this.summarizedItem_ = null;
}
// Update the internal summarized item cache.
const previousSummarizedItem = this.summarizedItem_;
this.summarizedItem_ = this.getSummarizedItem(0);
this.summarizedItemAnimated_ = ProgressCenterItemGroup.shouldAnimate_(
!!this.summarizedItemAnimated_, previousSummarizedItem,
this.summarizedItem_,
/* summarized */ true);
if (!this.summarizedItemAnimated_) {
this.completeSummarizedItemAnimation();
}
}
/**
* Notifies the end of the item's animation to the group.
* If all the items except error items completes, the group enter the inactive
* state.
* @param {string} id Item ID.
*/
completeItemAnimation(id) {
this.animated_[id] = false;
if (this.items_[id].state === ProgressItemState.COMPLETED) {
this.totalProgressValue_ += (this.items_[id].progressValue || 0.0);
this.totalProgressMax_ += (this.items_[id].progressMax || 0.0);
delete this.items_[id];
this.tryToGoToNextState_();
}
}
/**
* Notifies the end of the summarized item's animation.
* This may update summarized view. (1 progressing + 1 error -> 1 error)
*/
completeSummarizedItemAnimation() {
this.summarizedItemAnimated_ = false;
this.tryToGoToNextState_();
}
/**
* Obtains the summary of the set.
* @param {number} numOtherErrors Number of errors contained by other groups.
* @return {ProgressCenterItem} Item.
*/
getSummarizedItem(numOtherErrors) {
if (this.state_ === ProgressCenterItemGroup.State.EMPTY ||
this.state_ === ProgressCenterItemGroup.State.INACTIVE) {
return null;
}
const summarizedItem = new ProgressCenterItem();
summarizedItem.quiet = this.quiet_;
summarizedItem.progressMax += this.totalProgressMax_;
summarizedItem.progressValue += this.totalProgressValue_;
const progressingItems = [];
const errorItems = [];
let numItems = 0;
for (const id in this.items_) {
const item = this.items_[id];
numItems++;
// Count states.
switch (item.state) {
case ProgressItemState.PROGRESSING:
case ProgressItemState.COMPLETED:
progressingItems.push(item);
break;
case ProgressItemState.ERROR:
errorItems.push(item);
continue;
}
// If all of the progressing items have the same type, then use
// it. Otherwise use TRANSFER, since it is the most generic.
if (summarizedItem.type === null) {
summarizedItem.type = item.type;
} else if (summarizedItem.type !== item.type) {
summarizedItem.type = ProgressItemType.TRANSFER;
}
// Sum up the progress values.
summarizedItem.progressMax += item.progressMax;
summarizedItem.progressValue += item.progressValue;
}
// Returns 1 item.
if (progressingItems.length === 1 &&
errorItems.length + numOtherErrors === 0) {
summarizedItem.id = progressingItems[0].id;
summarizedItem.cancelCallback = progressingItems[0].cancelCallback;
summarizedItem.message = progressingItems[0].message;
summarizedItem.state = progressingItems[0].state;
return summarizedItem;
}
// Returns integrated items.
if (progressingItems.length > 0) {
const numErrors = errorItems.length + numOtherErrors;
const messages = [];
switch (summarizedItem.type) {
case ProgressItemType.COPY:
messages.push(str('COPY_PROGRESS_SUMMARY'));
break;
case ProgressItemType.MOVE:
messages.push(str('MOVE_PROGRESS_SUMMARY'));
break;
case ProgressItemType.DELETE:
messages.push(str('DELETE_PROGRESS_SUMMARY'));
break;
case ProgressItemType.ZIP:
messages.push(str('ZIP_PROGRESS_SUMMARY'));
break;
case ProgressItemType.SYNC:
messages.push(str('SYNC_PROGRESS_SUMMARY'));
break;
case ProgressItemType.TRANSFER:
messages.push(str('TRANSFER_PROGRESS_SUMMARY'));
break;
}
if (numErrors === 1) {
messages.push(str('ERROR_PROGRESS_SUMMARY'));
} else if (numErrors > 1) {
messages.push(strf('ERROR_PROGRESS_SUMMARY_PLURAL', numErrors));
}
summarizedItem.single = false;
summarizedItem.message = messages.join(' ');
summarizedItem.state = ProgressItemState.PROGRESSING;
return summarizedItem;
}
// Returns complete items.
summarizedItem.state = ProgressItemState.COMPLETED;
return summarizedItem;
}
/**
* Tries to go to next state.
* @private
*/
tryToGoToNextState_() {
if (this.summarizedItemAnimated_) {
return;
}
// If there is no item except for error items, go to INACTIVE state.
let hasError = false;
for (const id in this.items_) {
// If there is non-error item (progressing, or completed but still
// animated), we should stay the active state.
if (this.items_[id].state !== ProgressItemState.ERROR) {
return;
}
hasError = true;
}
this.totalProgressValue_ = 0.0;
this.totalProgressMax_ = 0.0;
this.state_ = ProgressCenterItemGroup.State.INACTIVE;
// If there is no item, go to EMPTY state.
if (hasError) {
return;
}
this.items_ = {};
this.animated_ = {};
this.summarizedItem_ = null;
this.summarizedItemAnimated_ = false;
this.state_ = ProgressCenterItemGroup.State.EMPTY;
}
/**
* Obtains whether the item should be animated or not.
* @param {boolean} previousAnimated Whether the item is previously animated
* or not.
* @param {ProgressCenterItem} previousItem Item before updating.
* @param {ProgressCenterItem} item New item.
* @param {boolean} summarized If the item is summarized one or not.
* @return {boolean} Whether the item should be animated or not.
* @private
*/
static shouldAnimate_(previousAnimated, previousItem, item, summarized) {
// Check visibility of previous and current progress bar.
const previousShow = previousItem && (!summarized || !previousItem.quiet);
const currentShow = item && (!summarized || !item.quiet);
// If previous or current item does not show progress bar, we should not
// animate.
if (!previousShow || !currentShow) {
return false;
}
if (previousItem.progressRateInPercent < item.progressRateInPercent) {
return true;
}
if (previousAnimated &&
previousItem.progressRateInPercent === item.progressRateInPercent) {
return true;
}
return false;
}
}
/**
* State of ProgressCenterItemGroup.
* @enum {string}
* @const
*/
ProgressCenterItemGroup.State = {
// Group has no items.
EMPTY: 'empty',
// Group has at least 1 progressing item.
ACTIVE: 'active',
// Group has no progressing items but still shows error items.
INACTIVE: 'inactive'
};
// Copyright 2014 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.
/**
* @fileoverview
*
* @suppress {visibility} To allow test code to reach to private attributes.
*/
'use strict';
// Mock LoadTimeData strings.
window.loadTimeData.data = {
COPY_PROGRESS_SUMMARY: 'Copying...',
ERROR_PROGRESS_SUMMARY: '1 Error.',
ERROR_PROGRESS_SUMMARY_PLURAL: '$1 Errors.'
};
window.loadTimeData.getString = id => {
return window.loadTimeData.data_[id] || id;
};
function testSimpleProgress() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
const item = new ProgressCenterItem();
item.id = 'test-item-1';
item.message = 'TestItemMessage1';
item.state = ProgressItemState.PROGRESSING;
item.progressMax = 1.0;
// Add an item.
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item.id).message);
assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Start an animation of the item.
item.progressValue = 0.5;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals(0.5, group.getItem(item.id).progressValue);
assertEquals(0.5, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item is completed, but the animation is still on going.
item.progressValue = 1.0;
item.state = ProgressItemState.COMPLETED;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals(100, group.getItem(item.id).progressRateInPercent);
assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the item is completed.
group.completeItemAnimation(item.id);
assertFalse(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals(null, group.getItem(item.id));
assertTrue(!!group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the summarized item is completed.
group.completeSummarizedItemAnimation();
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
function testCompleteAnimationDuringProgress() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item = new ProgressCenterItem();
item.id = 'test-item-1';
item.message = 'TestItemMessage1';
item.state = ProgressItemState.PROGRESSING;
item.progressMax = 1.0;
// Add an item.
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item.id).message);
assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Start an animation of the item.
item.progressValue = 0.5;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals(0.5, group.getItem(item.id).progressValue);
assertEquals(0.5, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the item to 50% progress is completed.
group.completeItemAnimation(item.id);
assertFalse(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertTrue(!!group.getItem(item.id));
assertTrue(!!group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the summarized item to 50% progress is completed.
group.completeSummarizedItemAnimation();
assertFalse(group.summarizedItemAnimated_);
assertTrue(!!group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The item is completed. The animation to 100% progress starts.
item.progressValue = 1.0;
item.state = ProgressItemState.COMPLETED;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals(100, group.getItem(item.id).progressRateInPercent);
assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the summarized item to 100% progress is completed.
group.completeSummarizedItemAnimation();
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the item to 100% progress is completed.
group.completeItemAnimation(item.id);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertFalse(!!group.getItem(item.id));
assertFalse(!!group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
function testAddMaxProgressItem() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item = new ProgressCenterItem();
item.id = 'test-item-1';
item.message = 'TestItemMessage1';
item.state = ProgressItemState.PROGRESSING;
item.progressMax = 1.0;
item.progressValue = 1.0;
// Add an item with 100% progress.
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item.id).message);
assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Complete the item without animation.
item.state = ProgressItemState.COMPLETED;
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(null, group.getItem(item.id));
assertEquals(null, group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
function testCompleteDuringAnimation() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item = new ProgressCenterItem();
item.id = 'test-item-1';
item.message = 'TestItemMessage1';
item.state = ProgressItemState.PROGRESSING;
item.progressMax = 1.0;
item.progressValue = 0.0;
// Add an item.
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item.id).message);
assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Update the progress of the item to 100%. The animation starts.
item.progressValue = 1.0;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item.id).message);
assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Complete the item. The animation is still on going.
item.state = ProgressItemState.COMPLETED;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertTrue(group.summarizedItemAnimated_);
assertTrue(!!group.getItem(item.id));
assertTrue(!!group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
}
function testTwoItems() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item1 = new ProgressCenterItem();
item1.id = 'test-item-1';
item1.message = 'TestItemMessage1';
item1.state = ProgressItemState.PROGRESSING;
item1.progressMax = 1.0;
item1.progressValue = 0.0;
item1.type = ProgressItemType.COPY;
const item2 = new ProgressCenterItem();
item2.id = 'test-item-2';
item2.message = 'TestItemMessage2';
item2.state = ProgressItemState.PROGRESSING;
item2.progressMax = 2.0;
item2.progressValue = 1.0;
item2.type = ProgressItemType.COPY;
// Item 1 is added.
group.update(item1);
assertFalse(group.isAnimated(item1.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item1.id).message);
assertEquals('TestItemMessage1', group.getSummarizedItem(0).message);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item 2 is added.
group.update(item2);
assertFalse(group.isAnimated(item1.id));
assertFalse(group.isAnimated(item2.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals('TestItemMessage1', group.getItem(item1.id).message);
assertEquals('TestItemMessage2', group.getItem(item2.id).message);
assertEquals('Copying...', group.getSummarizedItem(0).message);
assertEquals('Copying... 1 Error.', group.getSummarizedItem(1).message);
assertEquals('Copying... 2 Errors.', group.getSummarizedItem(2).message);
assertEquals(3.0, group.getSummarizedItem(0).progressMax);
assertEquals(1.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item 1 is completed.
item1.state = ProgressItemState.COMPLETED;
item1.progressValue = 1.0;
group.update(item1);
assertTrue(group.isAnimated(item1.id));
assertFalse(group.isAnimated(item2.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals('Copying...', group.getSummarizedItem(0).message);
assertEquals(3.0, group.getSummarizedItem(0).progressMax);
assertEquals(2.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item 1's animation is completed.
group.completeItemAnimation(item1.id);
assertFalse(group.isAnimated(item1.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
assertEquals(3.0, group.getSummarizedItem(0).progressMax);
assertEquals(2.0, group.getSummarizedItem(0).progressValue);
assertFalse(!!group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
// Item 2 is completed.
item2.state = ProgressItemState.COMPLETED;
item2.progressValue = 2.0;
group.update(item2);
assertTrue(group.summarizedItemAnimated_);
assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
assertEquals(ProgressItemState.COMPLETED, group.getSummarizedItem(0).state);
assertEquals(3.0, group.getSummarizedItem(0).progressMax);
assertEquals(3.0, group.getSummarizedItem(0).progressValue);
assertTrue(!!group.getItem(item2.id));
// Item 2's animation is completed.
group.completeItemAnimation(item2.id);
assertFalse(group.isAnimated(item2.id));
assertFalse(!!group.getItem(item2.id));
console.error('item2 state: ' + item2.state);
assertEquals(3.0, group.getSummarizedItem(0).progressMax);
assertEquals(3.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressItemState.COMPLETED, group.getSummarizedItem(0).state);
assertTrue(group.summarizedItemAnimated_);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Summarized item's animation is completed.
group.completeSummarizedItemAnimation();
assertFalse(!!group.getSummarizedItem(0));
assertFalse(group.summarizedItemAnimated_);
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
function testOneError() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item1 = new ProgressCenterItem();
item1.id = 'test-item-1';
item1.message = 'TestItemMessage1';
item1.state = ProgressItemState.PROGRESSING;
item1.progressMax = 2.0;
item1.progressValue = 1.0;
item1.type = ProgressItemType.COPY;
// Item 1 is added.
group.update(item1);
// Item 1 becomes error.
item1.message = 'Error.';
item1.state = ProgressItemState.ERROR;
group.update(item1);
assertTrue(!!group.getItem(item1.id));
assertFalse(group.isAnimated(item1.id));
assertEquals(null, group.getSummarizedItem(0));
assertFalse(group.summarizedItemAnimated_);
assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
// Add another item without dismissing the error item.
const item2 = new ProgressCenterItem();
item2.id = 'test-item-2';
item2.message = 'TestItemMessage2';
item2.state = ProgressItemState.PROGRESSING;
item2.progressMax = 4.0;
item2.progressValue = 1.0;
item2.type = ProgressItemType.COPY;
// Item 2 is added.
group.update(item2);
assertTrue(!!group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
assertEquals(4.0, group.getSummarizedItem(0).progressMax);
assertEquals(1.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Dismiss the error item.
group.dismissErrorItem(item1.id);
assertFalse(!!group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
assertEquals('TestItemMessage2', group.getSummarizedItem(0).message);
assertEquals(4.0, group.getSummarizedItem(0).progressMax);
assertEquals(1.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
}
function testOneItemWithError() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item1 = new ProgressCenterItem();
item1.id = 'test-item-1';
item1.message = 'TestItemMessage1';
item1.state = ProgressItemState.PROGRESSING;
item1.progressMax = 1.0;
item1.progressValue = 0.0;
item1.type = ProgressItemType.COPY;
const item2 = new ProgressCenterItem();
item2.id = 'test-item-2';
item2.message = 'TestItemMessage2';
item2.state = ProgressItemState.PROGRESSING;
item2.progressMax = 2.0;
item2.progressValue = 1.0;
item2.type = ProgressItemType.COPY;
// Item 1 is added.
group.update(item1);
// Item 2 is added.
group.update(item2);
// Item 2 becomes error.
item2.state = ProgressItemState.ERROR;
item2.message = 'Error message.';
group.update(item2);
assertFalse(group.isAnimated(item1.id));
assertFalse(group.isAnimated(item2.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
assertEquals('Copying... 2 Errors.', group.getSummarizedItem(1).message);
assertEquals(1.0, group.getSummarizedItem(0).progressMax);
assertEquals(0.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item 1 is completed.
item1.state = ProgressItemState.COMPLETED;
item1.progressValue = 1.0;
group.update(item1);
assertTrue(group.isAnimated(item1.id));
assertFalse(group.isAnimated(item2.id));
assertTrue(group.summarizedItemAnimated_);
assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
assertEquals(1.0, group.getSummarizedItem(0).progressMax);
assertEquals(1.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item 1's animation is completed.
group.completeItemAnimation(item1.id);
// Summarized item's animation is completed.
group.completeSummarizedItemAnimation();
assertFalse(group.isAnimated(item1.id));
assertFalse(group.summarizedItemAnimated_);
assertFalse(!!group.getSummarizedItem(0));
assertFalse(!!group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
// Dismiss error item.
group.dismissErrorItem(item2.id);
assertFalse(!!group.getItem(item2.id));
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
function testOneItemWithErrorDuringAnimation() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item1 = new ProgressCenterItem();
item1.id = 'test-item-1';
item1.message = 'TestItemMessage1';
item1.state = ProgressItemState.PROGRESSING;
item1.progressMax = 1.0;
item1.progressValue = 0.0;
item1.type = ProgressItemType.COPY;
const item2 = new ProgressCenterItem();
item2.id = 'test-item-2';
item2.message = 'TestItemMessage2';
item2.state = ProgressItemState.PROGRESSING;
item2.progressMax = 2.0;
item2.progressValue = 1.0;
item2.type = ProgressItemType.COPY;
// Item 1 is added.
group.update(item1);
// Item 2 is added.
group.update(item2);
// Item 2 starts an animation.
item2.progressValue = 1.5;
group.update(item2);
assertTrue(group.isAnimated(item2.id));
assertTrue(group.summarizedItemAnimated_);
// Item 2 enters the error state.
item2.state = ProgressItemState.ERROR;
item2.message = 'Error message.';
group.update(item2);
assertFalse(group.isAnimated(item2.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals('Copying... 1 Error.', group.getSummarizedItem(0).message);
assertEquals('Copying... 2 Errors.', group.getSummarizedItem(1).message);
assertEquals(1.0, group.getSummarizedItem(0).progressMax);
assertEquals(0.0, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
}
function testTwoErrors() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item1 = new ProgressCenterItem();
item1.id = 'test-item-1';
item1.message = 'Error message 1';
item1.state = ProgressItemState.ERROR;
item1.type = ProgressItemType.COPY;
const item2 = new ProgressCenterItem();
item2.id = 'test-item-2';
item2.message = 'Error message 2';
item2.state = ProgressItemState.ERROR;
item2.type = ProgressItemType.COPY;
// Add an error item.
group.update(item1);
assertFalse(group.isAnimated(item1.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
// Add another error item.
group.update(item2);
assertTrue(!!group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
assertFalse(group.isAnimated(item2.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
// Dismiss Error message 1.
group.dismissErrorItem(item1.id);
assertFalse(!!group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
}
function testCancel() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item = new ProgressCenterItem();
item.id = 'test-item-1';
item.message = 'TestItemMessage1';
item.state = ProgressItemState.PROGRESSING;
item.progressMax = 1.0;
item.progressValue = 0.0;
item.type = ProgressItemType.COPY;
// Add an item.
group.update(item);
// Start an animation of the item.
item.progressValue = 0.5;
group.update(item);
// Cancel the item.
item.state = ProgressItemState.CANCELED;
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(null, group.getItem(item.id));
assertEquals(null, group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
function testCancelWithError() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ false);
const item1 = new ProgressCenterItem();
item1.id = 'test-item-1';
item1.message = 'TestItemMessage1';
item1.state = ProgressItemState.PROGRESSING;
item1.progressMax = 1.0;
item1.progressValue = 0.0;
item1.type = ProgressItemType.COPY;
const item2 = new ProgressCenterItem();
item2.id = 'test-item-2';
item2.message = 'Error message 2';
item2.state = ProgressItemState.ERROR;
item2.type = ProgressItemType.COPY;
// Add an item.
group.update(item1);
// Start an animation of the item.
item1.progressValue = 0.5;
group.update(item1);
// Add an error item.
group.update(item2);
// Cancel the item.
item1.state = ProgressItemState.CANCELED;
group.update(item1);
assertFalse(group.isAnimated(item1.id));
assertFalse(group.isAnimated(item2.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(null, group.getItem(item1.id));
assertTrue(!!group.getItem(item2.id));
assertEquals(null, group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.INACTIVE, group.state);
}
function testQuietItem() {
const group =
new ProgressCenterItemGroup(/* name */ 'test', /* quiet */ true);
const item = new ProgressCenterItem();
item.id = 'test-item-1';
item.message = 'TestItemMessage1';
item.state = ProgressItemState.PROGRESSING;
item.progressMax = 1.0;
item.quiet = true;
// Add an item.
group.update(item);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Start an animation of the item.
item.progressValue = 0.5;
group.update(item);
assertTrue(group.isAnimated(item.id));
// Summarized item should not animated because the panel does not show
// progress bar for quiet and summarized item.
assertFalse(group.summarizedItemAnimated_);
assertEquals(0.5, group.getItem(item.id).progressValue);
assertEquals(0.5, group.getSummarizedItem(0).progressValue);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// Item is completed, but the animation is still on going.
item.progressValue = 1.0;
item.state = ProgressItemState.COMPLETED;
group.update(item);
assertTrue(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(100, group.getItem(item.id).progressRateInPercent);
assertEquals(100, group.getSummarizedItem(0).progressRateInPercent);
assertEquals(ProgressCenterItemGroup.State.ACTIVE, group.state);
// The animation of the item is completed.
group.completeItemAnimation(item.id);
assertFalse(group.isAnimated(item.id));
assertFalse(group.summarizedItemAnimated_);
assertEquals(null, group.getItem(item.id));
assertFalse(!!group.getSummarizedItem(0));
assertEquals(ProgressCenterItemGroup.State.EMPTY, group.state);
}
...@@ -476,10 +476,7 @@ js_library("progress_center_panel") { ...@@ -476,10 +476,7 @@ js_library("progress_center_panel") {
# The progress_center on the background page maintains a list of panels. # The progress_center on the background page maintains a list of panels.
visibility += [ "//ui/file_manager/file_manager/background/*" ] visibility += [ "//ui/file_manager/file_manager/background/*" ]
deps = [ deps = [ "//ui/file_manager/file_manager/common/js:progress_center_common" ]
"//ui/file_manager/file_manager/common/js:progress_center_common",
"//ui/file_manager/file_manager/foreground/js:progress_center_item_group",
]
externs_list = [ "//ui/file_manager/externs/progress_center_panel.js" ] externs_list = [ "//ui/file_manager/externs/progress_center_panel.js" ]
} }
......
...@@ -15,18 +15,11 @@ class ProgressCenterPanel { ...@@ -15,18 +15,11 @@ class ProgressCenterPanel {
this.feedbackHost_ = document.querySelector('#progress-panel'); this.feedbackHost_ = document.querySelector('#progress-panel');
/** /**
* Item group for normal priority items. * Items that are progressing, or completed.
* @type {ProgressCenterItemGroup} * Key is item ID.
* @private * @private {!Object<ProgressCenterItem>}
*/ */
this.normalItemGroup_ = new ProgressCenterItemGroup('normal', false); this.items_ = {};
/**
* Item group for low priority items.
* @type {ProgressCenterItemGroup}
* @private
*/
this.quietItemGroup_ = new ProgressCenterItemGroup('quiet', true);
/** /**
* Callback to be called with the ID of the progress item when the cancel * Callback to be called with the ID of the progress item when the cancel
...@@ -325,6 +318,7 @@ class ProgressCenterPanel { ...@@ -325,6 +318,7 @@ class ProgressCenterPanel {
if (item.type === 'copy' || item.type === 'move' || if (item.type === 'copy' || item.type === 'move' ||
item.type === 'format') { item.type === 'format') {
const donePanelItem = this.feedbackHost_.addPanelItem(item.id); const donePanelItem = this.feedbackHost_.addPanelItem(item.id);
donePanelItem.id = item.id;
donePanelItem.panelType = donePanelItem.panelTypeDone; donePanelItem.panelType = donePanelItem.panelTypeDone;
donePanelItem.primaryText = primaryText; donePanelItem.primaryText = primaryText;
if (util.isTransferDetailsEnabled()) { if (util.isTransferDetailsEnabled()) {
...@@ -336,12 +330,14 @@ class ProgressCenterPanel { ...@@ -336,12 +330,14 @@ class ProgressCenterPanel {
donePanelItem.signalCallback = (signal) => { donePanelItem.signalCallback = (signal) => {
if (signal === 'dismiss') { if (signal === 'dismiss') {
this.feedbackHost_.removePanelItem(donePanelItem); this.feedbackHost_.removePanelItem(donePanelItem);
delete this.items_[donePanelItem.id];
} }
}; };
// Delete after 4 seconds, doesn't matter if it's manually deleted // Delete after 4 seconds, doesn't matter if it's manually deleted
// before the timer fires, as removePanelItem handles that case. // before the timer fires, as removePanelItem handles that case.
setTimeout(() => { setTimeout(() => {
this.feedbackHost_.removePanelItem(donePanelItem); this.feedbackHost_.removePanelItem(donePanelItem);
delete this.items_[donePanelItem.id];
}, 4000); }, 4000);
} }
// Drop through to remove the progress panel. // Drop through to remove the progress panel.
...@@ -362,38 +358,59 @@ class ProgressCenterPanel { ...@@ -362,38 +358,59 @@ class ProgressCenterPanel {
} }
} }
/**
* Starts the item update and checks state changes.
* @param {!ProgressCenterItem} item Item containing updated information.
*/
updateItemState_(item) {
// Compares the current state and the new state to check if the update is
// valid or not.
const previousItem = this.items_[item.id];
switch (item.state) {
case ProgressItemState.ERROR:
if (previousItem &&
previousItem.state !== ProgressItemState.PROGRESSING) {
return;
}
this.items_[item.id] = item.clone();
break;
case ProgressItemState.PROGRESSING:
case ProgressItemState.COMPLETED:
if ((!previousItem && item.state === ProgressItemState.COMPLETED) ||
(previousItem &&
previousItem.state !== ProgressItemState.PROGRESSING)) {
return;
}
this.items_[item.id] = item.clone();
break;
case ProgressItemState.CANCELED:
if (!previousItem ||
previousItem.state !== ProgressItemState.PROGRESSING) {
return;
}
delete this.items_[item.id];
}
}
/** /**
* Updates an item to the progress center panel. * Updates an item to the progress center panel.
* @param {!ProgressCenterItem} item Item including new contents. * @param {!ProgressCenterItem} item Item including new contents.
*/ */
updateItem(item) { updateItem(item) {
const targetGroup = this.getGroupForItem_(item); this.updateItemState_(item);
// Update the item.
targetGroup.update(item);
// Update an open view item. // Update an open view item.
const newItem = targetGroup.getItem(item.id); const newItem = this.items_[item.id] || null;
this.updateFeedbackPanelItem(item, newItem); this.updateFeedbackPanelItem(item, newItem);
} }
/** /**
* Requests all item groups to dismiss an error item. * Called by background page when an error dialog is dismissed.
* @param {string} id Item id. * @param {string} id Item id.
*/ */
dismissErrorItem(id) { dismissErrorItem(id) {
this.normalItemGroup_.dismissErrorItem(id); delete this.items_[id];
this.quietItemGroup_.dismissErrorItem(id);
}
/**
* Obtains the group for the item.
* @param {ProgressCenterItem} item Progress item.
* @return {ProgressCenterItemGroup} Item group that should contain the item.
* @private
*/
getGroupForItem_(item) {
return item.quiet ? this.quietItemGroup_ : this.normalItemGroup_;
} }
} }
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