Commit 6f148d5c authored by Tatsuhisa Yamaguchi's avatar Tatsuhisa Yamaguchi Committed by Commit Bot

Open task picker when there are multiple apps but default is not set.

Bug: 761154
Test: gtest_filter=FileManagerJsTest.FileTasks:GenericTask/FileManagerBrowserTest.*
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: I43b04bac3a5d5683d3a8c5afba71f19ce77c8231
Reviewed-on: https://chromium-review.googlesource.com/725959Reviewed-by: default avatarNaoki Fukino <fukino@chromium.org>
Commit-Queue: Tatsuhisa Yamaguchi <yamaguchi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#513069}
parent 10fd0910
...@@ -482,6 +482,16 @@ FileTasks.prototype.executeDefaultInternal_ = function(opt_callback) { ...@@ -482,6 +482,16 @@ FileTasks.prototype.executeDefaultInternal_ = function(opt_callback) {
var callback = opt_callback || function(arg1, arg2) {}; var callback = opt_callback || function(arg1, arg2) {};
if (this.defaultTask_ !== null) { if (this.defaultTask_ !== null) {
var nonGenericTasks = this.tasks_.filter(t => !t.isGenericFileHandler);
if (!this.defaultTask_.isDefault && nonGenericTasks.length >= 2 &&
!this.taskHistory_.getLastExecutedTime(this.defaultTask_.taskId)) {
this.showTaskPicker(
this.ui_.defaultTaskPicker, str('OPEN_WITH_BUTTON_LABEL'),
'', function(task) {
this.execute(task.taskId);
}.bind(this), FileTasks.TaskPickerType.OpenWith);
return;
}
this.executeInternal_(this.defaultTask_.taskId); this.executeInternal_(this.defaultTask_.taskId);
callback(true, this.entries_); callback(true, this.entries_);
return; return;
......
...@@ -2,42 +2,53 @@ ...@@ -2,42 +2,53 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
window.chrome = {
commandLinePrivate: {
hasSwitch: function(name, callback) {
callback(false);
}
},
fileManagerPrivate: {
getFileTasks: function(entries, callback) {
setTimeout(callback.bind(null, [
{
taskId: 'handler-extension-id|app|any',
isDefault: false,
isGenericFileHandler: true
}
]), 0);
},
executeTask: function(taskId, entries, onViewFiles) {
onViewFiles('failed');
}
},
runtime: {id: 'test-extension-id'}
};
window.metrics = { window.metrics = {
recordEnum: function() {} recordEnum: function() {}
}; };
var mockTaskHistory = {
getLastExecutedTime: function(id) {
return 0;
}
};
loadTimeData.data = { loadTimeData.data = {
NO_TASK_FOR_EXECUTABLE: 'NO_TASK_FOR_EXECUTABLE', NO_TASK_FOR_EXECUTABLE: 'NO_TASK_FOR_EXECUTABLE',
NO_TASK_FOR_FILE_URL: 'NO_TASK_FOR_FILE_URL', NO_TASK_FOR_FILE_URL: 'NO_TASK_FOR_FILE_URL',
NO_TASK_FOR_FILE: 'NO_TASK_FOR_FILE', NO_TASK_FOR_FILE: 'NO_TASK_FOR_FILE',
NO_TASK_FOR_DMG: 'NO_TASK_FOR_DMG', NO_TASK_FOR_DMG: 'NO_TASK_FOR_DMG',
NO_TASK_FOR_CRX: 'NO_TASK_FOR_CRX', NO_TASK_FOR_CRX: 'NO_TASK_FOR_CRX',
NO_TASK_FOR_CRX_TITLE: 'NO_TASK_FOR_CRX_TITLE' NO_TASK_FOR_CRX_TITLE: 'NO_TASK_FOR_CRX_TITLE',
OPEN_WITH_BUTTON_LABEL: 'OPEN_WITH_BUTTON_LABEL',
TASK_OPEN: 'TASK_OPEN',
MORE_ACTIONS_BUTTON_LABEL: 'MORE_ACTIONS_BUTTON_LABEL'
}; };
function setUp() {
window.chrome = {
commandLinePrivate: {
hasSwitch: function(name, callback) {
callback(false);
}
},
fileManagerPrivate: {
getFileTasks: function(entries, callback) {
setTimeout(
callback.bind(null, [{
taskId: 'handler-extension-id|app|any',
isDefault: false,
isGenericFileHandler: true
}]),
0);
},
executeTask: function(taskId, entries, onViewFiles) {
onViewFiles('failed');
}
},
runtime: {id: 'test-extension-id'}
};
}
/** /**
* Returns a mock file manager. * Returns a mock file manager.
* @return {!FileManager} * @return {!FileManager}
...@@ -83,12 +94,14 @@ function showHtmlOfAlertDialogIsCalled(entries, expectedTitle, expectedText) { ...@@ -83,12 +94,14 @@ function showHtmlOfAlertDialogIsCalled(entries, expectedTitle, expectedText) {
resolve(); resolve();
}; };
FileTasks.create( FileTasks
fileManager.volumeManager, fileManager.metadataModel, .create(
fileManager.directoryModel, fileManager.ui, entries, [null]). fileManager.volumeManager, fileManager.metadataModel,
then(function(tasks) { fileManager.directoryModel, fileManager.ui, entries, [null],
tasks.executeDefault(); mockTaskHistory)
}); .then(function(tasks) {
tasks.executeDefault();
});
}); });
} }
...@@ -108,9 +121,39 @@ function openSuggestAppsDialogIsCalled(entries, mimeTypes) { ...@@ -108,9 +121,39 @@ function openSuggestAppsDialogIsCalled(entries, mimeTypes) {
} }
}; };
FileTasks.create( FileTasks
fileManager.volumeManager, fileManager.metadataModel, .create(
fileManager.directoryModel, fileManager.ui, entries, mimeTypes) fileManager.volumeManager, fileManager.metadataModel,
fileManager.directoryModel, fileManager.ui, entries, mimeTypes,
mockTaskHistory)
.then(function(tasks) {
tasks.executeDefault();
});
});
}
/**
* Returns a promise which is resolved when task picker is shown.
*
* @param {!Array<!Entry>} entries Entries.
* @param {!Array<?string>} mimeTypes Mime types.
* @return {!Promise}
*/
function showDefaultTaskDialogCalled(entries, mimeTypes) {
return new Promise(function(resolve, reject) {
var fileManager = getMockFileManager();
fileManager.ui.defaultTaskPicker = {
showDefaultTaskDialog: function(
title, message, items, defaultIdx, onSuccess) {
resolve();
}
};
FileTasks
.create(
fileManager.volumeManager, fileManager.metadataModel,
fileManager.directoryModel, fileManager.ui, entries, mimeTypes,
mockTaskHistory)
.then(function(tasks) { .then(function(tasks) {
tasks.executeDefault(); tasks.executeDefault();
}); });
...@@ -200,25 +243,129 @@ function testOpenSuggestAppsDialogFailure(callback) { ...@@ -200,25 +243,129 @@ function testOpenSuggestAppsDialogFailure(callback) {
var fileSystem = new MockFileSystem('volumeId'); var fileSystem = new MockFileSystem('volumeId');
var entry = new MockFileEntry(fileSystem, '/test'); var entry = new MockFileEntry(fileSystem, '/test');
FileTasks.create( FileTasks
{ .create(
getDriveConnectionState: function() { {
return VolumeManagerCommon.DriveConnectionType.ONLINE; getDriveConnectionState: function() {
} return VolumeManagerCommon.DriveConnectionType.ONLINE;
}, }
{}, },
{}, {}, {}, {
{ taskMenuButton: document.createElement('button'),
taskMenuButton: document.createElement('button'), fileContextMenu:
fileContextMenu: { {defaultActionMenuItem: document.createElement('div')}
defaultActionMenuItem: document.createElement('div') },
} [entry], [null], mockTaskHistory)
}, .then(function(tasks) {
[entry],
[null]).then(function(tasks) {
tasks.openSuggestAppsDialog(function() {}, function() {}, resolve); tasks.openSuggestAppsDialog(function() {}, function() {}, resolve);
}); });
}); });
reportPromise(onFailureIsCalled, callback); reportPromise(onFailureIsCalled, callback);
} }
/**
* Test case for opening task picker with an entry which doesn't have default
* app but multiple apps that can open it.
*/
function testOpenTaskPicker(callback) {
window.chrome.fileManagerPrivate.getFileTasks = function(entries, callback) {
setTimeout(
callback.bind(
null,
[
{
taskId: 'handler-extension-id1|app|any',
isDefault: false,
isGenericFileHandler: false,
title: 'app 1',
},
{
taskId: 'handler-extension-id2|app|any',
isDefault: false,
isGenericFileHandler: false,
title: 'app 2',
}
]),
0);
};
var mockFileSystem = new MockFileSystem('volumeId');
var mockEntry = new MockFileEntry(mockFileSystem, '/test.tiff');
reportPromise(
showDefaultTaskDialogCalled([mockEntry], ['image/tiff']), callback);
}
function testOpenWithMostRecentlyExecuted(callback) {
const latestTaskId = 'handler-extension-most-recently-executed|app|any';
const oldTaskId = 'handler-extension-executed-before|app|any'
window.chrome.fileManagerPrivate.getFileTasks = function(entries, callback) {
setTimeout(
callback.bind(
null,
// File tasks is sorted by last executed time, latest first.
[
{
taskId: latestTaskId,
isDefault: false,
isGenericFileHandler: false,
title: 'app 1',
},
{
taskId: oldTaskId,
isDefault: false,
isGenericFileHandler: false,
title: 'app 2',
},
{
taskId: 'handler-extension-never-executed|app|any',
isDefault: false,
isGenericFileHandler: false,
title: 'app 3',
},
]),
0);
};
var taskHistory = {
getLastExecutedTime: function(id) {
if (id == oldTaskId)
return 10000;
else if (id == latestTaskId)
return 20000;
return 0;
},
recordTaskExecuted: function(taskId) {}
};
var executedTask = null;
window.chrome.fileManagerPrivate.executeTask = function(
taskId, entries, onViewFiles) {
executedTask = taskId;
onViewFiles('success');
};
var mockFileSystem = new MockFileSystem('volumeId');
var mockEntry = new MockFileEntry(mockFileSystem, '/test.tiff');
var entries = [mockEntry];
var promise = new Promise(function(resolve, reject) {
var fileManager = getMockFileManager();
fileManager.ui.defaultTaskPicker = {
showDefaultTaskDialog: function(
title, message, items, defaultIdx, onSuccess) {
failWithMessage('should not show task picker');
}
};
FileTasks
.create(
fileManager.volumeManager, fileManager.metadataModel,
fileManager.directoryModel, fileManager.ui, [mockEntry], [null],
taskHistory)
.then(function(tasks) {
tasks.executeDefault();
assertEquals(latestTaskId, executedTask);
resolve();
});
});
reportPromise(promise, callback);
}
...@@ -223,8 +223,6 @@ testcase.defaultTaskDialogOnDownloads = function() { ...@@ -223,8 +223,6 @@ testcase.defaultTaskDialogOnDownloads = function() {
testcase.genericTaskIsNotExecuted = function() { testcase.genericTaskIsNotExecuted = function() {
var tasks = [ var tasks = [
new FakeTask(false, 'dummytaskid|open-with', 'DummyTask1', new FakeTask(false, 'dummytaskid|open-with', 'DummyTask1',
true /* isGenericFileHandler */),
new FakeTask(false, 'dummytaskid-2|open-with', 'DummyTask2',
true /* isGenericFileHandler */) true /* isGenericFileHandler */)
]; ];
......
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