--- a/dom/devicestorage/DeviceStorage.h
+++ b/dom/devicestorage/DeviceStorage.h
@@ -24,17 +24,17 @@ public:
NS_DECL_NSIDOMEVENTTARGET
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMDeviceStorage, nsDOMEventTargetHelper)
NS_DECL_EVENT_HANDLER(change)
nsDOMDeviceStorage();
nsresult Init(nsPIDOMWindow* aWindow, const nsAString &aType);
- void SetRootFileForType(const nsAString& aType);
+ void SetRootDirectoryForType(const nsAString& aType);
static void CreateDeviceStoragesFor(nsPIDOMWindow* aWin,
const nsAString &aType,
nsDOMDeviceStorage** aStore);
void Shutdown();
private:
~nsDOMDeviceStorage();
@@ -46,25 +46,25 @@ private:
nsresult EnumerateInternal(const JS::Value & aName,
const JS::Value & aOptions,
JSContext* aCx,
uint8_t aArgc,
bool aEditable,
nsIDOMDeviceStorageCursor** aRetval);
- int32_t mStorageType;
- nsCOMPtr<nsIFile> mFile;
+ nsString mStorageType;
+ nsCOMPtr<nsIFile> mRootDirectory;
nsCOMPtr<nsIPrincipal> mPrincipal;
bool mIsWatchingFile;
bool mAllowedToWatchFile;
- nsresult Notify(const char* aReason, nsIFile* aFile);
+ nsresult Notify(const char* aReason, class DeviceStorageFile* aFile);
friend class WatchFileEvent;
friend class DeviceStorageRequest;
#ifdef MOZ_WIDGET_GONK
void DispatchMountChangeEvent(nsAString& aType);
#endif
--- a/dom/devicestorage/DeviceStorageRequestChild.cpp
+++ b/dom/devicestorage/DeviceStorageRequestChild.cpp
@@ -78,17 +78,17 @@ DeviceStorageRequestChild::Recv__delete_
uint32_t count = r.paths().Length();
for (uint32_t i = 0; i < count; i++) {
nsCOMPtr<nsIFile> f;
nsresult rv = NS_NewLocalFile(r.paths()[i].fullpath(), false, getter_AddRefs(f));
if (NS_FAILED(rv)) {
continue;
}
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(r.paths()[i].type(), f);
dsf->SetPath(r.paths()[i].name());
cursor->mFiles.AppendElement(dsf);
}
nsCOMPtr<ContinueCursorEvent> event = new ContinueCursorEvent(cursor);
NS_DispatchToMainThread(event);
break;
}
--- a/dom/devicestorage/DeviceStorageRequestParent.cpp
+++ b/dom/devicestorage/DeviceStorageRequestParent.cpp
@@ -25,17 +25,17 @@ DeviceStorageRequestParent::DeviceStorag
switch (aParams.type()) {
case DeviceStorageParams::TDeviceStorageAddParams:
{
DeviceStorageAddParams p = aParams;
nsCOMPtr<nsIFile> f;
NS_NewLocalFile(p.fullpath(), false, getter_AddRefs(f));
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(p.type(), f);
BlobParent* bp = static_cast<BlobParent*>(p.blobParent());
nsCOMPtr<nsIDOMBlob> blob = bp->GetBlob();
nsCOMPtr<nsIInputStream> stream;
blob->GetInternalStream(getter_AddRefs(stream));
nsRefPtr<CancelableRunnable> r = new WriteFileEvent(this, dsf, stream);
@@ -48,66 +48,66 @@ DeviceStorageRequestParent::DeviceStorag
case DeviceStorageParams::TDeviceStorageGetParams:
{
DeviceStorageGetParams p = aParams;
nsCOMPtr<nsIFile> f;
NS_NewLocalFile(p.fullpath(), false, getter_AddRefs(f));
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(p.type(), f);
dsf->SetPath(p.name());
nsRefPtr<CancelableRunnable> r = new ReadFileEvent(this, dsf);
nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
NS_ASSERTION(target, "Must have stream transport service");
target->Dispatch(r, NS_DISPATCH_NORMAL);
break;
}
case DeviceStorageParams::TDeviceStorageDeleteParams:
{
DeviceStorageDeleteParams p = aParams;
nsCOMPtr<nsIFile> f;
NS_NewLocalFile(p.fullpath(), false, getter_AddRefs(f));
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(p.type(), f);
nsRefPtr<CancelableRunnable> r = new DeleteFileEvent(this, dsf);
nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
NS_ASSERTION(target, "Must have stream transport service");
target->Dispatch(r, NS_DISPATCH_NORMAL);
break;
}
case DeviceStorageParams::TDeviceStorageStatParams:
{
DeviceStorageStatParams p = aParams;
nsCOMPtr<nsIFile> f;
NS_NewLocalFile(p.fullpath(), false, getter_AddRefs(f));
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(p.type(), f);
nsRefPtr<StatFileEvent> r = new StatFileEvent(this, dsf);
nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
NS_ASSERTION(target, "Must have stream transport service");
target->Dispatch(r, NS_DISPATCH_NORMAL);
break;
}
case DeviceStorageParams::TDeviceStorageEnumerationParams:
{
DeviceStorageEnumerationParams p = aParams;
nsCOMPtr<nsIFile> f;
NS_NewLocalFile(p.fullpath(), false, getter_AddRefs(f));
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(p.type(), f);
nsRefPtr<CancelableRunnable> r = new EnumerateFileEvent(this, dsf, p.since());
nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
NS_ASSERTION(target, "Must have stream transport service");
target->Dispatch(r, NS_DISPATCH_NORMAL);
break;
}
default:
@@ -401,17 +401,17 @@ DeviceStorageRequestParent::EnumerateFil
mFile->CollectFiles(files, mSince);
InfallibleTArray<DeviceStorageFileValue> values;
uint32_t count = files.Length();
for (uint32_t i = 0; i < count; i++) {
nsString fullpath;
files[i]->mFile->GetPath(fullpath);
- DeviceStorageFileValue dsvf(files[i]->mPath, fullpath);
+ DeviceStorageFileValue dsvf(mFile->mStorageType, files[i]->mPath, fullpath);
values.AppendElement(dsvf);
}
r = new PostEnumerationSuccessEvent(mParent, values);
NS_DispatchToMainThread(r);
return NS_OK;
}
--- a/dom/devicestorage/PDeviceStorageRequest.ipdl
+++ b/dom/devicestorage/PDeviceStorageRequest.ipdl
@@ -22,16 +22,17 @@ struct SuccessResponse
struct BlobResponse
{
PBlob blob;
};
struct DeviceStorageFileValue
{
+ nsString type;
nsString name;
nsString fullpath;
};
struct EnumerationResponse
{
DeviceStorageFileValue[] paths;
};
--- a/dom/devicestorage/nsDeviceStorage.cpp
+++ b/dom/devicestorage/nsDeviceStorage.cpp
@@ -48,17 +48,17 @@
using namespace mozilla::dom;
using namespace mozilla::dom::devicestorage;
#include "nsDirectoryServiceDefs.h"
class IOEventComplete : public nsRunnable
{
public:
- IOEventComplete(nsIFile *aFile, const char *aType)
+ IOEventComplete(DeviceStorageFile *aFile, const char *aType)
: mFile(aFile)
, mType(aType)
{
}
~IOEventComplete() {}
NS_IMETHOD Run()
@@ -67,35 +67,37 @@ public:
nsString data;
CopyASCIItoUTF16(mType, data);
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
obs->NotifyObservers(mFile, "file-watcher-update", data.get());
return NS_OK;
}
private:
- nsCOMPtr<nsIFile> mFile;
+ nsRefPtr<DeviceStorageFile> mFile;
nsCString mType;
};
-DeviceStorageFile::DeviceStorageFile(nsIFile* aFile, const nsAString& aPath)
+DeviceStorageFile::DeviceStorageFile(const nsAString& aStorageType, nsIFile* aFile, const nsAString& aPath)
: mPath(aPath)
+ , mStorageType(aStorageType)
, mEditable(false)
{
NS_ASSERTION(aFile, "Must not create a DeviceStorageFile with a null nsIFile");
// always take a clone
nsCOMPtr<nsIFile> file;
aFile->Clone(getter_AddRefs(mFile));
AppendRelativePath();
NormalizeFilePath();
}
-DeviceStorageFile::DeviceStorageFile(nsIFile* aFile)
- : mEditable(false)
+DeviceStorageFile::DeviceStorageFile(const nsAString& aStorageType, nsIFile* aFile)
+ : mStorageType(aStorageType)
+ , mEditable(false)
{
NS_ASSERTION(aFile, "Must not create a DeviceStorageFile with a null nsIFile");
// always take a clone
nsCOMPtr<nsIFile> file;
aFile->Clone(getter_AddRefs(mFile));
}
void
@@ -180,17 +182,17 @@ DeviceStorageFile::Write(nsIInputStream*
return NS_ERROR_FAILURE;
}
nsresult rv = mFile->Create(nsIFile::NORMAL_FILE_TYPE, 00600);
if (NS_FAILED(rv)) {
return rv;
}
- nsCOMPtr<IOEventComplete> iocomplete = new IOEventComplete(mFile, "created");
+ nsCOMPtr<IOEventComplete> iocomplete = new IOEventComplete(this, "created");
NS_DispatchToMainThread(iocomplete);
uint64_t bufSize = 0;
aInputStream->Available(&bufSize);
nsCOMPtr<nsIOutputStream> outputStream;
NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), mFile);
@@ -214,17 +216,17 @@ DeviceStorageFile::Write(nsIInputStream*
static_cast<uint32_t>(NS_MIN<uint64_t>(bufSize, PR_UINT32_MAX)),
&wrote);
if (NS_FAILED(rv)) {
break;
}
bufSize -= wrote;
}
- iocomplete = new IOEventComplete(mFile, "modified");
+ iocomplete = new IOEventComplete(this, "modified");
NS_DispatchToMainThread(iocomplete);
bufferedOutputStream->Close();
outputStream->Close();
if (NS_FAILED(rv)) {
return rv;
}
return NS_OK;
@@ -233,31 +235,31 @@ DeviceStorageFile::Write(nsIInputStream*
nsresult
DeviceStorageFile::Write(InfallibleTArray<uint8_t>& aBits) {
nsresult rv = mFile->Create(nsIFile::NORMAL_FILE_TYPE, 00600);
if (NS_FAILED(rv)) {
return rv;
}
- nsCOMPtr<IOEventComplete> iocomplete = new IOEventComplete(mFile, "created");
+ nsCOMPtr<IOEventComplete> iocomplete = new IOEventComplete(this, "created");
NS_DispatchToMainThread(iocomplete);
nsCOMPtr<nsIOutputStream> outputStream;
NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), mFile);
if (!outputStream) {
return NS_ERROR_FAILURE;
}
uint32_t wrote;
outputStream->Write((char*) aBits.Elements(), aBits.Length(), &wrote);
outputStream->Close();
- iocomplete = new IOEventComplete(mFile, "modified");
+ iocomplete = new IOEventComplete(this, "modified");
NS_DispatchToMainThread(iocomplete);
if (aBits.Length() != wrote) {
return NS_ERROR_FAILURE;
}
return NS_OK;
}
@@ -276,17 +278,17 @@ DeviceStorageFile::Remove()
return NS_OK;
}
rv = mFile->Remove(true);
if (NS_FAILED(rv)) {
return rv;
}
- nsCOMPtr<IOEventComplete> iocomplete = new IOEventComplete(mFile, "deleted");
+ nsCOMPtr<IOEventComplete> iocomplete = new IOEventComplete(this, "deleted");
NS_DispatchToMainThread(iocomplete);
return NS_OK;
}
void
DeviceStorageFile::CollectFiles(nsTArray<nsRefPtr<DeviceStorageFile> > &aFiles,
uint64_t aSince)
{
@@ -339,21 +341,21 @@ DeviceStorageFile::collectFilesInternal(
NS_ERROR("collectFiles returned a path that does not belong!");
continue;
}
nsAString::size_type len = aRootPath.Length() + 1; // +1 for the trailing /
nsDependentSubstring newPath = Substring(fullpath, len);
if (isDir) {
- DeviceStorageFile dsf(f);
+ DeviceStorageFile dsf(mStorageType, f);
dsf.SetPath(newPath);
dsf.collectFilesInternal(aFiles, aSince, aRootPath);
} else if (isFile) {
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(f);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, f);
dsf->SetPath(newPath);
aFiles.AppendElement(dsf);
}
}
}
uint64_t
DeviceStorageFile::DirectoryDiskUsage(nsIFile* aFile, uint64_t aSoFar)
@@ -451,17 +453,17 @@ static void
UnregisterForSDCardChanges(nsIObserver* aObserver)
{
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
obs->RemoveObserver(aObserver, NS_VOLUME_STATE_CHANGED);
}
#endif
void
-nsDOMDeviceStorage::SetRootFileForType(const nsAString& aType)
+nsDOMDeviceStorage::SetRootDirectoryForType(const nsAString& aType)
{
nsCOMPtr<nsIFile> f;
nsCOMPtr<nsIProperties> dirService = do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID);
NS_ASSERTION(dirService, "Must have directory service");
// Picture directory
if (aType.Equals(NS_LITERAL_STRING("pictures"))) {
#ifdef MOZ_WIDGET_GONK
@@ -494,42 +496,35 @@ nsDOMDeviceStorage::SetRootFileForType(c
dirService->Get(NS_UNIX_XDG_MUSIC_DIR, NS_GET_IID(nsIFile), getter_AddRefs(f));
#endif
}
// in testing, we have access to a few more directory locations
if (mozilla::Preferences::GetBool("device.storage.testing", false)) {
// testing directory
- if (aType.Equals(NS_LITERAL_STRING("testing"))) {
+ if (aType.Equals(NS_LITERAL_STRING("testing")) ||
+ aType.Equals(NS_LITERAL_STRING("testing-other"))) {
dirService->Get(NS_OS_TEMP_DIR, NS_GET_IID(nsIFile), getter_AddRefs(f));
if (f) {
f->AppendRelativeNativePath(NS_LITERAL_CSTRING("device-storage-testing"));
f->Create(nsIFile::DIRECTORY_TYPE, 0777);
f->Normalize();
}
}
-
- if (aType.Equals(NS_LITERAL_STRING("testing-other"))) {
- dirService->Get(NS_OS_TEMP_DIR, NS_GET_IID(nsIFile), getter_AddRefs(f));
- if (f) {
- f->AppendRelativeNativePath(NS_LITERAL_CSTRING("device-storage-testing-other"));
- f->Create(nsIFile::DIRECTORY_TYPE, 0777);
- f->Normalize();
- }
- }
- }
+ }
#ifdef MOZ_WIDGET_GONK
RegisterForSDCardChanges(this);
#endif
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
obs->AddObserver(this, "file-watcher-update", false);
- mFile = f;
+ mRootDirectory = f;
+ mStorageType = aType;
}
jsval InterfaceToJsval(nsPIDOMWindow* aWindow, nsISupports* aObject, const nsIID* aIID)
{
nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(aWindow);
if (!sgo) {
return JSVAL_NULL;
}
@@ -871,17 +866,17 @@ nsDOMDeviceStorageCursor::Allow()
nsresult rv = mFile->mFile->GetPath(fullpath);
if (NS_FAILED(rv)) {
// just do nothing
return NS_OK;
}
PDeviceStorageRequestChild* child = new DeviceStorageRequestChild(this, mFile);
- DeviceStorageEnumerationParams params(fullpath, mSince);
+ DeviceStorageEnumerationParams params(mFile->mStorageType, fullpath, mSince);
ContentChild::GetSingleton()->SendPDeviceStorageRequestConstructor(child, params);
return NS_OK;
}
nsCOMPtr<nsIEventTarget> target = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
NS_ASSERTION(target, "Must have stream transport service");
nsCOMPtr<InitCursorEvent> event = new InitCursorEvent(this, mFile);
@@ -1301,57 +1296,58 @@ public:
BlobChild* actor = ContentChild::GetSingleton()->GetOrCreateActorForBlob(mBlob);
if (!actor) {
return NS_ERROR_FAILURE;
}
DeviceStorageAddParams params;
params.blobChild() = actor;
+ params.type() = mFile->mStorageType;
params.name() = mFile->mPath;
params.fullpath() = fullpath;
PDeviceStorageRequestChild* child = new DeviceStorageRequestChild(mRequest, mFile);
ContentChild::GetSingleton()->SendPDeviceStorageRequestConstructor(child, params);
return NS_OK;
}
r = new WriteFileEvent(mBlob, mFile, mRequest);
break;
}
case DEVICE_STORAGE_REQUEST_READ:
{
if (XRE_GetProcessType() != GeckoProcessType_Default) {
PDeviceStorageRequestChild* child = new DeviceStorageRequestChild(mRequest, mFile);
- DeviceStorageGetParams params(mFile->mPath, fullpath);
+ DeviceStorageGetParams params(mFile->mStorageType, mFile->mPath, fullpath);
ContentChild::GetSingleton()->SendPDeviceStorageRequestConstructor(child, params);
return NS_OK;
}
r = new ReadFileEvent(mFile, mRequest);
break;
}
case DEVICE_STORAGE_REQUEST_DELETE:
{
if (XRE_GetProcessType() != GeckoProcessType_Default) {
PDeviceStorageRequestChild* child = new DeviceStorageRequestChild(mRequest, mFile);
- DeviceStorageDeleteParams params(fullpath);
+ DeviceStorageDeleteParams params(mFile->mStorageType, fullpath);
ContentChild::GetSingleton()->SendPDeviceStorageRequestConstructor(child, params);
return NS_OK;
}
r = new DeleteFileEvent(mFile, mRequest);
break;
}
case DEVICE_STORAGE_REQUEST_STAT:
{
if (XRE_GetProcessType() != GeckoProcessType_Default) {
PDeviceStorageRequestChild* child = new DeviceStorageRequestChild(mRequest, mFile);
- DeviceStorageStatParams params(fullpath);
+ DeviceStorageStatParams params(mFile->mStorageType, fullpath);
ContentChild::GetSingleton()->SendPDeviceStorageRequestConstructor(child, params);
return NS_OK;
}
r = new StatFileEvent(mFile, mRequest);
break;
}
case DEVICE_STORAGE_REQUEST_WATCH:
@@ -1449,18 +1445,18 @@ nsDOMDeviceStorage::nsDOMDeviceStorage()
, mAllowedToWatchFile(false)
{ }
nsresult
nsDOMDeviceStorage::Init(nsPIDOMWindow* aWindow, const nsAString &aType)
{
NS_ASSERTION(aWindow, "Must have a content dom");
- SetRootFileForType(aType);
- if (!mFile) {
+ SetRootDirectoryForType(aType);
+ if (!mRootDirectory) {
return NS_ERROR_NOT_AVAILABLE;
}
BindToOwner(aWindow);
// Grab the principal of the document
nsCOMPtr<nsIDOMDocument> domdoc;
aWindow->GetDocument(getter_AddRefs(domdoc));
@@ -1527,17 +1523,17 @@ nsDOMDeviceStorage::AddNamed(nsIDOMBlob
return NS_ERROR_UNEXPECTED;
}
nsRefPtr<DOMRequest> request = new DOMRequest(win);
NS_ADDREF(*_retval = request);
nsCOMPtr<nsIRunnable> r;
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile, aPath);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory, aPath);
if (!dsf->IsSafePath()) {
r = new PostErrorEvent(request, POST_ERROR_EVENT_ILLEGAL_FILE_NAME, dsf);
}
else {
r = new DeviceStorageRequest(DeviceStorageRequest::DEVICE_STORAGE_REQUEST_WRITE,
win, mPrincipal, dsf, request, aBlob);
}
@@ -1575,25 +1571,25 @@ nsDOMDeviceStorage::GetInternal(const JS
nsRefPtr<DOMRequest> request = new DOMRequest(win);
NS_ADDREF(*_retval = request);
nsCOMPtr<nsIRunnable> r;
JSString* jsstr = JS_ValueToString(aCx, aPath);
nsDependentJSString path;
if (!path.init(aCx, jsstr)) {
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory);
r = new PostErrorEvent(request,
POST_ERROR_EVENT_NON_STRING_TYPE_UNSUPPORTED,
dsf);
NS_DispatchToMainThread(r);
return NS_OK;
}
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile, path);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory, path);
dsf->SetEditable(aEditable);
if (!dsf->IsSafePath()) {
r = new PostErrorEvent(request, POST_ERROR_EVENT_ILLEGAL_FILE_NAME, dsf);
} else {
r = new DeviceStorageRequest(DeviceStorageRequest::DEVICE_STORAGE_REQUEST_READ,
win, mPrincipal, dsf, request);
}
@@ -1612,23 +1608,23 @@ nsDOMDeviceStorage::Delete(const JS::Val
}
nsRefPtr<DOMRequest> request = new DOMRequest(win);
NS_ADDREF(*_retval = request);
JSString* jsstr = JS_ValueToString(aCx, aPath);
nsDependentJSString path;
if (!path.init(aCx, jsstr)) {
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory);
r = new PostErrorEvent(request, POST_ERROR_EVENT_NON_STRING_TYPE_UNSUPPORTED, dsf);
NS_DispatchToMainThread(r);
return NS_OK;
}
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile, path);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory, path);
if (!dsf->IsSafePath()) {
r = new PostErrorEvent(request, POST_ERROR_EVENT_ILLEGAL_FILE_NAME, dsf);
}
else {
r = new DeviceStorageRequest(DeviceStorageRequest::DEVICE_STORAGE_REQUEST_DELETE,
win, mPrincipal, dsf, request);
}
@@ -1642,17 +1638,17 @@ nsDOMDeviceStorage::Stat(nsIDOMDOMReques
nsCOMPtr<nsPIDOMWindow> win = GetOwner();
if (!win) {
return NS_ERROR_UNEXPECTED;
}
nsRefPtr<DOMRequest> request = new DOMRequest(win);
NS_ADDREF(*aRetval = request);
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory);
nsCOMPtr<nsIRunnable> r = new DeviceStorageRequest(DeviceStorageRequest::DEVICE_STORAGE_REQUEST_STAT,
win,
mPrincipal,
dsf,
request);
NS_DispatchToMainThread(r);
return NS_OK;
}
@@ -1726,17 +1722,17 @@ nsDOMDeviceStorage::EnumerateInternal(co
}
if (aArgc == 2 && (JSVAL_IS_VOID(aOptions) || aOptions.isNull() || !aOptions.isObject())) {
return NS_ERROR_FAILURE;
}
since = ExtractDateFromOptions(aCx, aOptions);
}
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile, path);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory, path);
dsf->SetEditable(aEditable);
nsRefPtr<nsDOMDeviceStorageCursor> cursor = new nsDOMDeviceStorageCursor(win, mPrincipal,
dsf, since);
nsRefPtr<DeviceStorageCursorRequest> r = new DeviceStorageCursorRequest(cursor);
NS_ADDREF(*aRetval = cursor);
@@ -1836,20 +1832,17 @@ nsDOMDeviceStorageStat::GetState(nsAStri
return NS_OK;
}
NS_IMETHODIMP
nsDOMDeviceStorage::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *aData)
{
if (!strcmp(aTopic, "file-watcher-update")) {
- nsCOMPtr<nsIFile> file = do_QueryInterface(aSubject);
- if (!file) {
- return NS_OK;
- }
+ DeviceStorageFile* file = static_cast<DeviceStorageFile*>(aSubject);
Notify(NS_ConvertUTF16toUTF8(aData).get(), file);
return NS_OK;
}
#ifdef MOZ_WIDGET_GONK
else if (!strcmp(aTopic, NS_VOLUME_STATE_CHANGED)) {
nsCOMPtr<nsIVolume> vol = do_QueryInterface(aSubject);
if (!vol) {
@@ -1881,45 +1874,45 @@ nsDOMDeviceStorage::Observe(nsISupports
DispatchMountChangeEvent(type);
return NS_OK;
}
#endif
return NS_OK;
}
nsresult
-nsDOMDeviceStorage::Notify(const char* aReason, nsIFile* aFile)
+nsDOMDeviceStorage::Notify(const char* aReason, DeviceStorageFile* aFile)
{
if (!mAllowedToWatchFile) {
return NS_OK;
}
- if (!mFile) {
+ if (!mStorageType.Equals(aFile->mStorageType)) {
+ // Ignore this
+ return NS_OK;
+ }
+
+ if (!mRootDirectory) {
return NS_ERROR_FAILURE;
}
nsString rootpath;
- nsresult rv = mFile->GetPath(rootpath);
+ nsresult rv = mRootDirectory->GetPath(rootpath);
if (NS_FAILED(rv)) {
return NS_OK;
}
nsString fullpath;
- rv = aFile->GetPath(fullpath);
+ rv = aFile->mFile->GetPath(fullpath);
if (NS_FAILED(rv)) {
return NS_OK;
}
NS_ASSERTION(fullpath.Length() >= rootpath.Length(), "Root path longer than full path!");
- if (!StringBeginsWith(fullpath, rootpath)) {
- NS_WARNING("Observing a path outside of our root!");
- return NS_OK;
- }
-
nsAString::size_type len = rootpath.Length() + 1; // +1 for the trailing /
nsDependentSubstring newPath (fullpath, len, fullpath.Length() - len);
nsCOMPtr<nsIDOMEvent> event;
NS_NewDOMDeviceStorageChangeEvent(getter_AddRefs(event), nullptr, nullptr);
nsCOMPtr<nsIDOMDeviceStorageChangeEvent> ce = do_QueryInterface(event);
@@ -1941,17 +1934,17 @@ nsDOMDeviceStorage::AddEventListener(con
uint8_t aArgc)
{
nsCOMPtr<nsPIDOMWindow> win = GetOwner();
if (!win) {
return NS_ERROR_UNEXPECTED;
}
nsRefPtr<DOMRequest> request = new DOMRequest(win);
- nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mFile);
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(mStorageType, mRootDirectory);
nsCOMPtr<nsIRunnable> r = new DeviceStorageRequest(DeviceStorageRequest::DEVICE_STORAGE_REQUEST_WATCH,
win, mPrincipal, dsf, request, this, aListener);
NS_DispatchToMainThread(r);
return nsDOMEventTargetHelper::AddEventListener(aType, aListener, aUseCapture, aWantsUntrusted, aArgc);
}
NS_IMETHODIMP
nsDOMDeviceStorage::AddSystemEventListener(const nsAString & aType,
--- a/dom/devicestorage/nsDeviceStorage.h
+++ b/dom/devicestorage/nsDeviceStorage.h
@@ -39,20 +39,21 @@ class nsPIDOMWindow;
using namespace mozilla::dom;
class DeviceStorageFile MOZ_FINAL
: public nsISupports {
public:
nsCOMPtr<nsIFile> mFile;
nsString mPath;
+ nsString mStorageType;
bool mEditable;
- DeviceStorageFile(nsIFile* aFile, const nsAString& aPath);
- DeviceStorageFile(nsIFile* aFile);
+ DeviceStorageFile(const nsAString& aStorageType, nsIFile* aFile, const nsAString& aPath);
+ DeviceStorageFile(const nsAString& aStorageType, nsIFile* aFile);
void SetPath(const nsAString& aPath);
void SetEditable(bool aEditable);
NS_DECL_ISUPPORTS
// we want to make sure that the names of file can't reach
// outside of the type of storage the user asked for.
bool IsSafePath();
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -969,25 +969,27 @@ bool
ContentChild::RecvLastPrivateDocShellDestroyed()
{
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
obs->NotifyObservers(nullptr, "last-pb-context-exited", nullptr);
return true;
}
bool
-ContentChild::RecvFilePathUpdate(const nsString& path, const nsCString& aReason)
+ContentChild::RecvFilePathUpdate(const nsString& type, const nsString& path, const nsCString& aReason)
{
nsCOMPtr<nsIFile> file;
NS_NewLocalFile(path, false, getter_AddRefs(file));
+ nsRefPtr<DeviceStorageFile> dsf = new DeviceStorageFile(type, file);
+
nsString reason;
CopyASCIItoUTF16(aReason, reason);
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
- obs->NotifyObservers(file, "file-watcher-update", reason.get());
+ obs->NotifyObservers(dsf, "file-watcher-update", reason.get());
return true;
}
bool
ContentChild::RecvFileSystemUpdate(const nsString& aFsName, const nsString& aName, const int32_t &aState)
{
#ifdef MOZ_WIDGET_GONK
nsRefPtr<nsVolume> volume = new nsVolume(aFsName, aName, aState);
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -168,17 +168,17 @@ public:
virtual bool RecvAppInfo(const nsCString& version, const nsCString& buildID);
virtual bool RecvSetProcessAttributes(const uint64_t& id,
const bool& aIsForApp,
const bool& aIsForBrowser);
virtual bool RecvLastPrivateDocShellDestroyed();
- virtual bool RecvFilePathUpdate(const nsString& path, const nsCString& reason);
+ virtual bool RecvFilePathUpdate(const nsString& type, const nsString& path, const nsCString& reason);
virtual bool RecvFileSystemUpdate(const nsString& aFsName, const nsString& aName, const int32_t& aState);
#ifdef ANDROID
gfxIntSize GetScreenSize() { return mScreenSize; }
#endif
// Get the directory for IndexedDB files. We query the parent for this and
// cache the value
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -1031,24 +1031,22 @@ ContentParent::Observe(nsISupports* aSub
unused << SendCycleCollect();
}
else if (!strcmp(aTopic, "last-pb-context-exited")) {
unused << SendLastPrivateDocShellDestroyed();
}
else if (!strcmp(aTopic, "file-watcher-update")) {
nsCString creason;
CopyUTF16toUTF8(aData, creason);
- nsCOMPtr<nsIFile> file = do_QueryInterface(aSubject);
- if (!file) {
- return NS_OK;
- }
+ DeviceStorageFile* file = static_cast<DeviceStorageFile*>(aSubject);
nsString path;
- file->GetPath(path);
- unused << SendFilePathUpdate(path, creason);
+ file->mFile->GetPath(path);
+
+ unused << SendFilePathUpdate(file->mStorageType, path, creason);
}
#ifdef MOZ_WIDGET_GONK
else if(!strcmp(aTopic, NS_VOLUME_STATE_CHANGED)) {
nsCOMPtr<nsIVolume> vol = do_QueryInterface(aSubject);
if (!vol) {
return NS_ERROR_NOT_AVAILABLE;
}
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -67,39 +67,44 @@ struct FontListEntry {
uint16_t weight;
int16_t stretch;
uint8_t italic;
uint8_t index;
};
struct DeviceStorageStatParams
{
+ nsString type;
nsString fullpath;
};
struct DeviceStorageAddParams
{
+ nsString type;
PBlob blob;
nsString name;
nsString fullpath;
};
struct DeviceStorageGetParams
{
+ nsString type;
nsString name;
nsString fullpath;
};
struct DeviceStorageDeleteParams
{
+ nsString type;
nsString fullpath;
};
struct DeviceStorageEnumerationParams
{
+ nsString type;
nsString fullpath;
uint64_t since;
};
union DeviceStorageParams
{
DeviceStorageAddParams;
DeviceStorageGetParams;
@@ -232,17 +237,17 @@ child:
*/
ActivateA11y();
AppInfo(nsCString version, nsCString buildID);
// Notify child that last-pb-context-exited notification was observed
LastPrivateDocShellDestroyed();
- FilePathUpdate(nsString filepath, nsCString reasons);
+ FilePathUpdate(nsString type, nsString filepath, nsCString reasons);
FileSystemUpdate(nsString fsName, nsString mountPoint, int32_t fsState);
parent:
PAudio(int32_t aNumChannels, int32_t aRate, int32_t aFormat);
PDeviceStorageRequest(DeviceStorageParams params);