1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "IDBFileHandle.h"
10 #include "IDBMutableFile.h"
11 #include "mozilla/dom/FileService.h"
12 #include "mozilla/dom/IDBFileHandleBinding.h"
13 #include "mozilla/dom/MetadataHelper.h"
14 #include "mozilla/EventDispatcher.h"
15 #include "nsIAppShell.h"
16 #include "nsServiceManagerUtils.h"
17 #include "nsWidgetsCID.h"
21 NS_DEFINE_CID(kAppShellCID2
, NS_APPSHELL_CID
);
23 } // anonymous namespace
29 IDBFileHandle::IDBFileHandle(FileMode aMode
,
30 RequestMode aRequestMode
,
31 IDBMutableFile
* aMutableFile
)
32 : FileHandleBase(aMode
, aRequestMode
)
33 , mMutableFile(aMutableFile
)
38 IDBFileHandle::~IDBFileHandle()
43 already_AddRefed
<IDBFileHandle
>
44 IDBFileHandle::Create(FileMode aMode
,
45 RequestMode aRequestMode
,
46 IDBMutableFile
* aMutableFile
)
48 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
50 nsRefPtr
<IDBFileHandle
> fileHandle
=
51 new IDBFileHandle(aMode
, aRequestMode
, aMutableFile
);
53 fileHandle
->BindToOwner(aMutableFile
);
55 nsCOMPtr
<nsIAppShell
> appShell
= do_GetService(kAppShellCID2
);
56 if (NS_WARN_IF(!appShell
)) {
60 nsresult rv
= appShell
->RunBeforeNextEvent(fileHandle
);
61 if (NS_WARN_IF(NS_FAILED(rv
))) {
65 fileHandle
->SetCreating();
67 FileService
* service
= FileService::GetOrCreate();
68 if (NS_WARN_IF(!service
)) {
72 rv
= service
->Enqueue(fileHandle
, nullptr);
73 if (NS_WARN_IF(NS_FAILED(rv
))) {
77 return fileHandle
.forget();
80 mozilla::dom::MutableFileBase
*
81 IDBFileHandle::MutableFile() const
86 NS_IMPL_CYCLE_COLLECTION_INHERITED(IDBFileHandle
, DOMEventTargetHelper
,
89 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBFileHandle
)
90 NS_INTERFACE_MAP_ENTRY(nsIRunnable
)
91 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper
)
93 NS_IMPL_ADDREF_INHERITED(IDBFileHandle
, DOMEventTargetHelper
)
94 NS_IMPL_RELEASE_INHERITED(IDBFileHandle
, DOMEventTargetHelper
)
97 IDBFileHandle::PreHandleEvent(EventChainPreVisitor
& aVisitor
)
99 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
101 aVisitor
.mCanHandle
= true;
102 aVisitor
.mParentTarget
= mMutableFile
;
108 IDBFileHandle::WrapObject(JSContext
* aCx
)
110 return IDBFileHandleBinding::Wrap(aCx
, this);
113 already_AddRefed
<IDBFileRequest
>
114 IDBFileHandle::GetMetadata(const IDBFileMetadataParameters
& aParameters
,
117 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
119 // Common state checking
120 if (!CheckState(aRv
)) {
124 // Do nothing if the window is closed
125 if (!CheckWindow()) {
129 nsRefPtr
<MetadataParameters
> params
=
130 new MetadataParameters(aParameters
.mSize
, aParameters
.mLastModified
);
131 if (!params
->IsConfigured()) {
132 aRv
.ThrowTypeError(MSG_METADATA_NOT_CONFIGURED
);
136 nsRefPtr
<FileRequestBase
> fileRequest
= GenerateFileRequest();
138 nsRefPtr
<MetadataHelper
> helper
=
139 new MetadataHelper(this, fileRequest
, params
);
141 if (NS_WARN_IF(NS_FAILED(helper
->Enqueue()))) {
142 aRv
.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR
);
146 return fileRequest
.forget().downcast
<IDBFileRequest
>();
152 OnReturnToEventLoop();
157 IDBFileHandle::OnCompleteOrAbort(bool aAborted
)
159 nsCOMPtr
<nsIDOMEvent
> event
;
161 event
= CreateGenericEvent(this, NS_LITERAL_STRING(ABORT_EVT_STR
),
162 eDoesBubble
, eNotCancelable
);
164 event
= CreateGenericEvent(this, NS_LITERAL_STRING(COMPLETE_EVT_STR
),
165 eDoesNotBubble
, eNotCancelable
);
167 if (NS_WARN_IF(!event
)) {
168 return NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR
;
172 if (NS_FAILED(DispatchEvent(event
, &dummy
))) {
173 NS_WARNING("Dispatch failed!");
180 IDBFileHandle::CheckWindow()
185 already_AddRefed
<mozilla::dom::FileRequestBase
>
186 IDBFileHandle::GenerateFileRequest()
188 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
190 return IDBFileRequest::Create(GetOwner(), this,
191 /* aWrapAsDOMRequest */ false);
194 } // namespace indexedDB
196 } // namespace mozilla