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

Unified Diff: third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp

Issue 2297043002: Web expose FileSystemFileEntry, FileSystemDirectoryEntry and friends (Closed)
Patch Set: Rebased Created 4 years, 1 month 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
Index: third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp
diff --git a/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp b/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp
deleted file mode 100644
index e15477ee836df46b71113bf623817db077c163f6..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/modules/filesystem/DOMFileSystemBase.cpp
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "modules/filesystem/DOMFileSystemBase.h"
-
-#include "core/dom/ExecutionContext.h"
-#include "core/fileapi/File.h"
-#include "core/fileapi/FileError.h"
-#include "core/html/VoidCallback.h"
-#include "modules/filesystem/DOMFilePath.h"
-#include "modules/filesystem/DirectoryEntry.h"
-#include "modules/filesystem/DirectoryReaderBase.h"
-#include "modules/filesystem/EntriesCallback.h"
-#include "modules/filesystem/Entry.h"
-#include "modules/filesystem/EntryBase.h"
-#include "modules/filesystem/EntryCallback.h"
-#include "modules/filesystem/FileSystemCallbacks.h"
-#include "modules/filesystem/MetadataCallback.h"
-#include "platform/weborigin/SecurityOrigin.h"
-#include "public/platform/Platform.h"
-#include "public/platform/WebFileSystem.h"
-#include "public/platform/WebFileSystemCallbacks.h"
-#include "wtf/text/StringBuilder.h"
-#include "wtf/text/TextEncoding.h"
-#include <memory>
-
-namespace blink {
-
-const char DOMFileSystemBase::persistentPathPrefix[] = "persistent";
-const char DOMFileSystemBase::temporaryPathPrefix[] = "temporary";
-const char DOMFileSystemBase::isolatedPathPrefix[] = "isolated";
-const char DOMFileSystemBase::externalPathPrefix[] = "external";
-
-DOMFileSystemBase::DOMFileSystemBase(ExecutionContext* context,
- const String& name,
- FileSystemType type,
- const KURL& rootURL)
- : m_context(context),
- m_name(name),
- m_type(type),
- m_filesystemRootURL(rootURL),
- m_clonable(false) {}
-
-DOMFileSystemBase::~DOMFileSystemBase() {}
-
-DEFINE_TRACE(DOMFileSystemBase) {
- visitor->trace(m_context);
-}
-
-WebFileSystem* DOMFileSystemBase::fileSystem() const {
- Platform* platform = Platform::current();
- if (!platform)
- return nullptr;
- return platform->fileSystem();
-}
-
-SecurityOrigin* DOMFileSystemBase::getSecurityOrigin() const {
- return m_context->getSecurityOrigin();
-}
-
-bool DOMFileSystemBase::isValidType(FileSystemType type) {
- return type == FileSystemTypeTemporary || type == FileSystemTypePersistent ||
- type == FileSystemTypeIsolated || type == FileSystemTypeExternal;
-}
-
-KURL DOMFileSystemBase::createFileSystemRootURL(const String& origin,
- FileSystemType type) {
- String typeString;
- if (type == FileSystemTypeTemporary)
- typeString = temporaryPathPrefix;
- else if (type == FileSystemTypePersistent)
- typeString = persistentPathPrefix;
- else if (type == FileSystemTypeExternal)
- typeString = externalPathPrefix;
- else
- return KURL();
-
- String result = "filesystem:" + origin + "/" + typeString + "/";
- return KURL(ParsedURLString, result);
-}
-
-bool DOMFileSystemBase::supportsToURL() const {
- ASSERT(isValidType(m_type));
- return m_type != FileSystemTypeIsolated;
-}
-
-KURL DOMFileSystemBase::createFileSystemURL(const EntryBase* entry) const {
- return createFileSystemURL(entry->fullPath());
-}
-
-KURL DOMFileSystemBase::createFileSystemURL(const String& fullPath) const {
- ASSERT(DOMFilePath::isAbsolute(fullPath));
-
- if (type() == FileSystemTypeExternal) {
- // For external filesystem originString could be different from what we have
- // in m_filesystemRootURL.
- StringBuilder result;
- result.append("filesystem:");
- result.append(getSecurityOrigin()->toString());
- result.append('/');
- result.append(externalPathPrefix);
- result.append(m_filesystemRootURL.path());
- // Remove the extra leading slash.
- result.append(encodeWithURLEscapeSequences(fullPath.substring(1)));
- return KURL(ParsedURLString, result.toString());
- }
-
- // For regular types we can just append the entry's fullPath to the
- // m_filesystemRootURL that should look like
- // 'filesystem:<origin>/<typePrefix>'.
- ASSERT(!m_filesystemRootURL.isEmpty());
- KURL url = m_filesystemRootURL;
- // Remove the extra leading slash.
- url.setPath(url.path() + encodeWithURLEscapeSequences(fullPath.substring(1)));
- return url;
-}
-
-bool DOMFileSystemBase::pathToAbsolutePath(FileSystemType type,
- const EntryBase* base,
- String path,
- String& absolutePath) {
- ASSERT(base);
-
- if (!DOMFilePath::isAbsolute(path))
- path = DOMFilePath::append(base->fullPath(), path);
- absolutePath = DOMFilePath::removeExtraParentReferences(path);
-
- return (type != FileSystemTypeTemporary &&
- type != FileSystemTypePersistent) ||
- DOMFilePath::isValidPath(absolutePath);
-}
-
-bool DOMFileSystemBase::pathPrefixToFileSystemType(const String& pathPrefix,
- FileSystemType& type) {
- if (pathPrefix == temporaryPathPrefix) {
- type = FileSystemTypeTemporary;
- return true;
- }
-
- if (pathPrefix == persistentPathPrefix) {
- type = FileSystemTypePersistent;
- return true;
- }
-
- if (pathPrefix == externalPathPrefix) {
- type = FileSystemTypeExternal;
- return true;
- }
-
- return false;
-}
-
-File* DOMFileSystemBase::createFile(const FileMetadata& metadata,
- const KURL& fileSystemURL,
- FileSystemType type,
- const String name) {
- // For regular filesystem types (temporary or persistent), we should not cache
- // file metadata as it could change File semantics. For other filesystem
- // types (which could be platform-specific ones), there's a chance that the
- // files are on remote filesystem. If the port has returned metadata just
- // pass it to File constructor (so we may cache the metadata).
- // FIXME: We should use the snapshot metadata for all files.
- // https://www.w3.org/Bugs/Public/show_bug.cgi?id=17746
- if (type == FileSystemTypeTemporary || type == FileSystemTypePersistent)
- return File::createForFileSystemFile(metadata.platformPath, name);
-
- const File::UserVisibility userVisibility = (type == FileSystemTypeExternal)
- ? File::IsUserVisible
- : File::IsNotUserVisible;
-
- if (!metadata.platformPath.isEmpty()) {
- // If the platformPath in the returned metadata is given, we create a File
- // object for the snapshot path.
- return File::createForFileSystemFile(name, metadata, userVisibility);
- } else {
- // Otherwise we create a File object for the fileSystemURL.
- return File::createForFileSystemFile(fileSystemURL, metadata,
- userVisibility);
- }
-}
-
-void DOMFileSystemBase::getMetadata(const EntryBase* entry,
- MetadataCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(MetadataCallbacks::create(
- successCallback, errorCallback, m_context, this));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
- fileSystem()->readMetadata(createFileSystemURL(entry), std::move(callbacks));
-}
-
-static bool verifyAndGetDestinationPathForCopyOrMove(const EntryBase* source,
- EntryBase* parent,
- const String& newName,
- String& destinationPath) {
- ASSERT(source);
-
- if (!parent || !parent->isDirectory())
- return false;
-
- if (!newName.isEmpty() && !DOMFilePath::isValidName(newName))
- return false;
-
- const bool isSameFileSystem =
- (*source->filesystem() == *parent->filesystem());
-
- // It is an error to try to copy or move an entry inside itself at any depth
- // if it is a directory.
- if (source->isDirectory() && isSameFileSystem &&
- DOMFilePath::isParentOf(source->fullPath(), parent->fullPath()))
- return false;
-
- // It is an error to copy or move an entry into its parent if a name different
- // from its current one isn't provided.
- if (isSameFileSystem && (newName.isEmpty() || source->name() == newName) &&
- DOMFilePath::getDirectory(source->fullPath()) == parent->fullPath())
- return false;
-
- destinationPath = parent->fullPath();
- if (!newName.isEmpty())
- destinationPath = DOMFilePath::append(destinationPath, newName);
- else
- destinationPath = DOMFilePath::append(destinationPath, source->name());
-
- return true;
-}
-
-void DOMFileSystemBase::move(const EntryBase* source,
- EntryBase* parent,
- const String& newName,
- EntryCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- String destinationPath;
- if (!verifyAndGetDestinationPathForCopyOrMove(source, parent, newName,
- destinationPath)) {
- reportError(errorCallback, FileError::kInvalidModificationErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(EntryCallbacks::create(
- successCallback, errorCallback, m_context, parent->filesystem(),
- destinationPath, source->isDirectory()));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- fileSystem()->move(createFileSystemURL(source),
- parent->filesystem()->createFileSystemURL(destinationPath),
- std::move(callbacks));
-}
-
-void DOMFileSystemBase::copy(const EntryBase* source,
- EntryBase* parent,
- const String& newName,
- EntryCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- String destinationPath;
- if (!verifyAndGetDestinationPathForCopyOrMove(source, parent, newName,
- destinationPath)) {
- reportError(errorCallback, FileError::kInvalidModificationErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(EntryCallbacks::create(
- successCallback, errorCallback, m_context, parent->filesystem(),
- destinationPath, source->isDirectory()));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- fileSystem()->copy(createFileSystemURL(source),
- parent->filesystem()->createFileSystemURL(destinationPath),
- std::move(callbacks));
-}
-
-void DOMFileSystemBase::remove(const EntryBase* entry,
- VoidCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- ASSERT(entry);
- // We don't allow calling remove() on the root directory.
- if (entry->fullPath() == String(DOMFilePath::root)) {
- reportError(errorCallback, FileError::kInvalidModificationErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(
- VoidCallbacks::create(successCallback, errorCallback, m_context, this));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- fileSystem()->remove(createFileSystemURL(entry), std::move(callbacks));
-}
-
-void DOMFileSystemBase::removeRecursively(const EntryBase* entry,
- VoidCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- ASSERT(entry && entry->isDirectory());
- // We don't allow calling remove() on the root directory.
- if (entry->fullPath() == String(DOMFilePath::root)) {
- reportError(errorCallback, FileError::kInvalidModificationErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(
- VoidCallbacks::create(successCallback, errorCallback, m_context, this));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- fileSystem()->removeRecursively(createFileSystemURL(entry),
- std::move(callbacks));
-}
-
-void DOMFileSystemBase::getParent(const EntryBase* entry,
- EntryCallback* successCallback,
- ErrorCallbackBase* errorCallback) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- ASSERT(entry);
- String path = DOMFilePath::getDirectory(entry->fullPath());
-
- fileSystem()->directoryExists(
- createFileSystemURL(path),
- EntryCallbacks::create(successCallback, errorCallback, m_context, this,
- path, true));
-}
-
-void DOMFileSystemBase::getFile(const EntryBase* entry,
- const String& path,
- const FileSystemFlags& flags,
- EntryCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- String absolutePath;
- if (!pathToAbsolutePath(m_type, entry, path, absolutePath)) {
- reportError(errorCallback, FileError::kInvalidModificationErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(EntryCallbacks::create(
- successCallback, errorCallback, m_context, this, absolutePath, false));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- if (flags.createFlag())
- fileSystem()->createFile(createFileSystemURL(absolutePath),
- flags.exclusive(), std::move(callbacks));
- else
- fileSystem()->fileExists(createFileSystemURL(absolutePath),
- std::move(callbacks));
-}
-
-void DOMFileSystemBase::getDirectory(const EntryBase* entry,
- const String& path,
- const FileSystemFlags& flags,
- EntryCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return;
- }
-
- String absolutePath;
- if (!pathToAbsolutePath(m_type, entry, path, absolutePath)) {
- reportError(errorCallback, FileError::kInvalidModificationErr);
- return;
- }
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(EntryCallbacks::create(
- successCallback, errorCallback, m_context, this, absolutePath, true));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- if (flags.createFlag())
- fileSystem()->createDirectory(createFileSystemURL(absolutePath),
- flags.exclusive(), std::move(callbacks));
- else
- fileSystem()->directoryExists(createFileSystemURL(absolutePath),
- std::move(callbacks));
-}
-
-int DOMFileSystemBase::readDirectory(DirectoryReaderBase* reader,
- const String& path,
- EntriesCallback* successCallback,
- ErrorCallbackBase* errorCallback,
- SynchronousType synchronousType) {
- if (!fileSystem()) {
- reportError(errorCallback, FileError::kAbortErr);
- return 0;
- }
-
- ASSERT(DOMFilePath::isAbsolute(path));
-
- std::unique_ptr<AsyncFileSystemCallbacks> callbacks(EntriesCallbacks::create(
- successCallback, errorCallback, m_context, reader, path));
- callbacks->setShouldBlockUntilCompletion(synchronousType == Synchronous);
-
- return fileSystem()->readDirectory(createFileSystemURL(path),
- std::move(callbacks));
-}
-
-bool DOMFileSystemBase::waitForAdditionalResult(int callbacksId) {
- if (!fileSystem())
- return false;
- return fileSystem()->waitForAdditionalResult(callbacksId);
-}
-
-} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698