mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-10 13:18:45 +02:00
Backed out changeset 7e3a105b9160 (bug 1173320) Backed out changeset 094819fbb07f (bug 1173320) Backed out changeset 23b0e55ff1db (bug 1173320) Backed out changeset 8bf8e2fcedad (bug 1173320) Backed out changeset 3de390c6f47f (bug 1173320) Backed out changeset fb298010e12e (bug 1173320) Backed out changeset f1a965c2f796 (bug 1173320) Backed out changeset 176128ba757f (bug 1173320)
205 lines
5.2 KiB
C++
205 lines
5.2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "RemoveTask.h"
|
|
|
|
#include "mozilla/dom/File.h"
|
|
#include "mozilla/dom/FileSystemBase.h"
|
|
#include "mozilla/dom/FileSystemUtils.h"
|
|
#include "mozilla/dom/Promise.h"
|
|
#include "mozilla/dom/ipc/BlobChild.h"
|
|
#include "mozilla/dom/ipc/BlobParent.h"
|
|
#include "nsIFile.h"
|
|
#include "nsStringGlue.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
RemoveTask::RemoveTask(FileSystemBase* aFileSystem,
|
|
const nsAString& aDirPath,
|
|
BlobImpl* aTargetBlob,
|
|
const nsAString& aTargetPath,
|
|
bool aRecursive,
|
|
ErrorResult& aRv)
|
|
: FileSystemTaskBase(aFileSystem)
|
|
, mDirRealPath(aDirPath)
|
|
, mTargetBlobImpl(aTargetBlob)
|
|
, mTargetRealPath(aTargetPath)
|
|
, mRecursive(aRecursive)
|
|
, mReturnValue(false)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
MOZ_ASSERT(aFileSystem);
|
|
nsCOMPtr<nsIGlobalObject> globalObject =
|
|
do_QueryInterface(aFileSystem->GetWindow());
|
|
if (!globalObject) {
|
|
return;
|
|
}
|
|
mPromise = Promise::Create(globalObject, aRv);
|
|
}
|
|
|
|
RemoveTask::RemoveTask(FileSystemBase* aFileSystem,
|
|
const FileSystemRemoveParams& aParam,
|
|
FileSystemRequestParent* aParent)
|
|
: FileSystemTaskBase(aFileSystem, aParam, aParent)
|
|
, mRecursive(false)
|
|
, mReturnValue(false)
|
|
{
|
|
MOZ_ASSERT(XRE_IsParentProcess(),
|
|
"Only call from parent process!");
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
MOZ_ASSERT(aFileSystem);
|
|
|
|
mDirRealPath = aParam.directory();
|
|
|
|
mRecursive = aParam.recursive();
|
|
|
|
const FileSystemPathOrFileValue& target = aParam.target();
|
|
|
|
if (target.type() == FileSystemPathOrFileValue::TnsString) {
|
|
mTargetRealPath = target;
|
|
return;
|
|
}
|
|
|
|
BlobParent* bp = static_cast<BlobParent*>(static_cast<PBlobParent*>(target));
|
|
mTargetBlobImpl = bp->GetBlobImpl();
|
|
MOZ_ASSERT(mTargetBlobImpl);
|
|
}
|
|
|
|
RemoveTask::~RemoveTask()
|
|
{
|
|
MOZ_ASSERT(!mPromise || NS_IsMainThread(),
|
|
"mPromise should be released on main thread!");
|
|
}
|
|
|
|
already_AddRefed<Promise>
|
|
RemoveTask::GetPromise()
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
return RefPtr<Promise>(mPromise).forget();
|
|
}
|
|
|
|
FileSystemParams
|
|
RemoveTask::GetRequestParams(const nsString& aFileSystem) const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
FileSystemRemoveParams param;
|
|
param.filesystem() = aFileSystem;
|
|
param.directory() = mDirRealPath;
|
|
param.recursive() = mRecursive;
|
|
if (mTargetBlobImpl) {
|
|
RefPtr<Blob> blob = Blob::Create(mFileSystem->GetWindow(),
|
|
mTargetBlobImpl);
|
|
BlobChild* actor
|
|
= ContentChild::GetSingleton()->GetOrCreateActorForBlob(blob);
|
|
if (actor) {
|
|
param.target() = actor;
|
|
}
|
|
} else {
|
|
param.target() = mTargetRealPath;
|
|
}
|
|
return param;
|
|
}
|
|
|
|
FileSystemResponseValue
|
|
RemoveTask::GetSuccessRequestResult() const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
return FileSystemBooleanResponse(mReturnValue);
|
|
}
|
|
|
|
void
|
|
RemoveTask::SetSuccessRequestResult(const FileSystemResponseValue& aValue)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
FileSystemBooleanResponse r = aValue;
|
|
mReturnValue = r.success();
|
|
}
|
|
|
|
nsresult
|
|
RemoveTask::Work()
|
|
{
|
|
MOZ_ASSERT(XRE_IsParentProcess(),
|
|
"Only call from parent process!");
|
|
MOZ_ASSERT(!NS_IsMainThread(), "Only call on worker thread!");
|
|
|
|
if (mFileSystem->IsShutdown()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
// Get the DOM path if a File is passed as the target.
|
|
if (mTargetBlobImpl) {
|
|
if (!mFileSystem->GetRealPath(mTargetBlobImpl, mTargetRealPath)) {
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
}
|
|
if (!FileSystemUtils::IsDescendantPath(mDirRealPath, mTargetRealPath)) {
|
|
return NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR;
|
|
}
|
|
}
|
|
|
|
nsCOMPtr<nsIFile> file = mFileSystem->GetLocalFile(mTargetRealPath);
|
|
if (!file) {
|
|
return NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR;
|
|
}
|
|
|
|
bool exists = false;
|
|
nsresult rv = file->Exists(&exists);
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
if (!exists) {
|
|
mReturnValue = false;
|
|
return NS_OK;
|
|
}
|
|
|
|
bool isFile = false;
|
|
rv = file->IsFile(&isFile);
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
if (isFile && !mFileSystem->IsSafeFile(file)) {
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
}
|
|
|
|
rv = file->Remove(mRecursive);
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
mReturnValue = true;
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
RemoveTask::HandlerCallback()
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread!");
|
|
if (mFileSystem->IsShutdown()) {
|
|
mPromise = nullptr;
|
|
return;
|
|
}
|
|
|
|
if (HasError()) {
|
|
mPromise->MaybeReject(mErrorValue);
|
|
mPromise = nullptr;
|
|
return;
|
|
}
|
|
|
|
mPromise->MaybeResolve(mReturnValue);
|
|
mPromise = nullptr;
|
|
}
|
|
|
|
void
|
|
RemoveTask::GetPermissionAccessType(nsCString& aAccess) const
|
|
{
|
|
aAccess.AssignLiteral("write");
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|