Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Unified Diff: chrome/test/data/extensions/api_test/file_system_provider/thumbnail/test.js

Issue 538873002: [fsp] Wire FSP to chrome.fileBrowserPrivate.getEntryProperties(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/data/extensions/api_test/file_system_provider/thumbnail/manifest.json ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « chrome/test/data/extensions/api_test/file_system_provider/thumbnail/manifest.json ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698