| Index: chrome/test/data/extensions/api_test/file_system_provider/thumbnail/test.js
|
| diff --git a/chrome/test/data/extensions/api_test/file_system_provider/thumbnail/test.js b/chrome/test/data/extensions/api_test/file_system_provider/thumbnail/test.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0916a71b754efd5252653dd9e050ff9a9a31f33e
|
| --- /dev/null
|
| +++ b/chrome/test/data/extensions/api_test/file_system_provider/thumbnail/test.js
|
| @@ -0,0 +1,217 @@
|
| +// 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.
|
| +
|
| +'use strict';
|
| +
|
| +/**
|
| + * @type {Object}
|
| + * @const
|
| + */
|
| +var TESTING_ROOT = Object.freeze({
|
| + isDirectory: true,
|
| + name: '',
|
| + size: 0,
|
| + modificationTime: new Date(2013, 3, 27, 9, 38, 14)
|
| +});
|
| +
|
| +/**
|
| + * @type {Object}
|
| + * @const
|
| + */
|
| +var TESTING_WITH_VALID_THUMBNAIL_FILE = Object.freeze({
|
| + isDirectory: false,
|
| + name: 'valid-thumbnail.txt',
|
| + size: 4096,
|
| + modificationTime: new Date(2014, 4, 28, 10, 39, 15),
|
| + thumbnail: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA' +
|
| + 'AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO' +
|
| + '9TXL0Y4OHwAAAABJRU5ErkJggg=='
|
| +});
|
| +
|
| +/**
|
| + * @type {Object}
|
| + * @const
|
| + */
|
| +var TESTING_ALWAYS_WITH_THUMBNAIL_FILE = Object.freeze({
|
| + isDirectory: false,
|
| + name: 'always-with-thumbnail.txt',
|
| + size: 4096,
|
| + modificationTime: new Date(2014, 4, 28, 10, 39, 15),
|
| + thumbnail: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA' +
|
| + 'AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO' +
|
| + '9TXL0Y4OHwAAAABJRU5ErkJggg=='
|
| +});
|
| +
|
| +/**
|
| + * @type {Object}
|
| + * @const
|
| + */
|
| +var TESTING_WITH_INVALID_THUMBNAIL_FILE = Object.freeze({
|
| + isDirectory: false,
|
| + name: 'invalid-thumbnail.txt',
|
| + size: 4096,
|
| + modificationTime: new Date(2014, 4, 28, 10, 39, 15),
|
| + thumbnail: 'https://www.foobar.com/evil'
|
| +});
|
| +
|
| +/**
|
| + * Returns metadata for a requested entry.
|
| + *
|
| + * @param {GetMetadataRequestedOptions} options Options.
|
| + * @param {function(Object)} onSuccess Success callback with metadata passed
|
| + * an argument.
|
| + * @param {function(string)} onError Error callback with an error code.
|
| + */
|
| +function onGetMetadataRequested(options, onSuccess, onError) {
|
| + if (options.fileSystemId != test_util.FILE_SYSTEM_ID) {
|
| + onError('SECURITY'); // enum ProviderError.
|
| + return;
|
| + }
|
| +
|
| + // Metadata to be returned.
|
| + var metadata;
|
| +
|
| + switch (options.entryPath) {
|
| + case '/':
|
| + metadata = TESTING_ROOT;
|
| + break;
|
| +
|
| + case '/' + TESTING_WITH_VALID_THUMBNAIL_FILE.name:
|
| + metadata = TESTING_WITH_VALID_THUMBNAIL_FILE;
|
| + break;
|
| +
|
| + case '/' + TESTING_ALWAYS_WITH_THUMBNAIL_FILE.name:
|
| + metadata = TESTING_ALWAYS_WITH_THUMBNAIL_FILE;
|
| + break;
|
| +
|
| + case '/' + TESTING_WITH_INVALID_THUMBNAIL_FILE.name:
|
| + metadata = TESTING_WITH_INVALID_THUMBNAIL_FILE;
|
| + break;
|
| +
|
| + default:
|
| + onError('NOT_FOUND'); // enum ProviderError.
|
| + return;
|
| + }
|
| +
|
| + // Returning a thumbnail while not requested is not allowed for performance
|
| + // reasons. Remove the field if needed. However, do not remove it for one
|
| + // file, to simulate an error.
|
| + if (!options.thumbnail && metadata.thumbnail &&
|
| + options.entryPath != '/' + TESTING_ALWAYS_WITH_THUMBNAIL_FILE.name) {
|
| + var metadataWithoutThumbnail = {
|
| + isDirectory: metadata.isDirectory,
|
| + name: metadata.name,
|
| + size: metadata.size,
|
| + modificationTime: metadata.modificationTime
|
| + };
|
| + onSuccess(metadataWithoutThumbnail);
|
| + } else {
|
| + onSuccess(metadata);
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Sets up the tests. Called once per all test cases. In case of a failure,
|
| + * the callback is not called.
|
| + *
|
| + * @param {function()} callback Success callback.
|
| + */
|
| +function setUp(callback) {
|
| + chrome.fileSystemProvider.onGetMetadataRequested.addListener(
|
| + onGetMetadataRequested);
|
| + test_util.mountFileSystem(callback);
|
| +}
|
| +
|
| +/**
|
| + * Runs all of the test cases, one by one.
|
| + */
|
| +function runTests() {
|
| + chrome.test.runTests([
|
| + // Test if providers are notified that no thumbnail is requested when normal
|
| + // metadata is requested.
|
| + function notRequestedAndNotProvidedThumbnailSuccess() {
|
| + var onSuccess = chrome.test.callbackPass();
|
| + test_util.fileSystem.root.getFile(
|
| + TESTING_WITH_VALID_THUMBNAIL_FILE.name,
|
| + {create: false},
|
| + function(fileEntry) {
|
| + onSuccess();
|
| + }, function(error) {
|
| + chrome.test.fail(error.name);
|
| + });
|
| + },
|
| +
|
| + // If providers return a thumbnail data despite not being requested for
|
| + // that, then the operation must fail.
|
| + function notRequestedButProvidedThumbnailError() {
|
| + var onSuccess = chrome.test.callbackPass();
|
| + test_util.fileSystem.root.getFile(
|
| + TESTING_ALWAYS_WITH_THUMBNAIL_FILE.name,
|
| + {create: false},
|
| + function(fileEntry) {
|
| + chrome.test.fail(
|
| + 'Thumbnail returned when not requested should result in an ' +
|
| + 'error, but the operation succeeded.');
|
| + }, function(error) {
|
| + chrome.test.assertEq('InvalidStateError', error.name);
|
| + onSuccess();
|
| + });
|
| + },
|
| +
|
| + // Thumbnails should be returned when available for private API request.
|
| + function getEntryPropertiesWithThumbnailSuccess() {
|
| + var onSuccess = chrome.test.callbackPass();
|
| + test_util.fileSystem.root.getFile(
|
| + TESTING_WITH_VALID_THUMBNAIL_FILE.name,
|
| + {create: false},
|
| + function(fileEntry) {
|
| + chrome.fileBrowserPrivate.getEntryProperties(
|
| + [fileEntry.toURL()],
|
| + function(fileProperties) {
|
| + chrome.test.assertEq(1, fileProperties.length);
|
| + chrome.test.assertEq(
|
| + TESTING_WITH_VALID_THUMBNAIL_FILE.thumbnail,
|
| + fileProperties[0].thumbnailUrl);
|
| + chrome.test.assertEq(
|
| + TESTING_WITH_VALID_THUMBNAIL_FILE.fileSize,
|
| + fileProperties[0].size);
|
| + chrome.test.assertEq(
|
| + TESTING_WITH_VALID_THUMBNAIL_FILE.modificationTime,
|
| + new Date(fileProperties[0].lastModifiedTime));
|
| + onSuccess();
|
| + });
|
| + },
|
| + function(error) {
|
| + chrome.test.fail(error.name);
|
| + });
|
| + },
|
| +
|
| + // Confirm that extensions are not able to pass an invalid thumbnail url,
|
| + // including evil urls.
|
| + function getEntryPropertiesWithInvalidThumbnail() {
|
| + var onSuccess = chrome.test.callbackPass();
|
| + test_util.fileSystem.root.getFile(
|
| + TESTING_WITH_INVALID_THUMBNAIL_FILE.name,
|
| + {create: false},
|
| + function(fileEntry) {
|
| + chrome.fileBrowserPrivate.getEntryProperties(
|
| + [fileEntry.toURL()],
|
| + function(fileProperties) {
|
| + chrome.test.assertEq(1, fileProperties.length);
|
| + // The results for an entry is an empty dictionary in case of
|
| + // an error.
|
| + chrome.test.assertEq(
|
| + 0, Object.keys(fileProperties[0]).length);
|
| + onSuccess();
|
| + });
|
| + },
|
| + function(error) {
|
| + chrome.test.fail(error.name);
|
| + });
|
| + }
|
| + ]);
|
| +}
|
| +
|
| +// Setup and run all of the test cases.
|
| +setUp(runTests);
|
|
|