Bumping gaia.json for 2 gaia revision(s) a=gaia-bump
[gecko.git] / dom / indexedDB / IDBFileHandle.cpp
blob336aa2f007bd8d06385269cda76ba6d13c8c0cfc
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"
9 #include "IDBEvents.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"
19 namespace {
21 NS_DEFINE_CID(kAppShellCID2, NS_APPSHELL_CID);
23 } // anonymous namespace
25 namespace mozilla {
26 namespace dom {
27 namespace indexedDB {
29 IDBFileHandle::IDBFileHandle(FileMode aMode,
30 RequestMode aRequestMode,
31 IDBMutableFile* aMutableFile)
32 : FileHandleBase(aMode, aRequestMode)
33 , mMutableFile(aMutableFile)
35 SetIsDOMBinding();
38 IDBFileHandle::~IDBFileHandle()
42 // static
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)) {
57 return nullptr;
60 nsresult rv = appShell->RunBeforeNextEvent(fileHandle);
61 if (NS_WARN_IF(NS_FAILED(rv))) {
62 return nullptr;
65 fileHandle->SetCreating();
67 FileService* service = FileService::GetOrCreate();
68 if (NS_WARN_IF(!service)) {
69 return nullptr;
72 rv = service->Enqueue(fileHandle, nullptr);
73 if (NS_WARN_IF(NS_FAILED(rv))) {
74 return nullptr;
77 return fileHandle.forget();
80 mozilla::dom::MutableFileBase*
81 IDBFileHandle::MutableFile() const
83 return mMutableFile;
86 NS_IMPL_CYCLE_COLLECTION_INHERITED(IDBFileHandle, DOMEventTargetHelper,
87 mMutableFile)
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)
96 nsresult
97 IDBFileHandle::PreHandleEvent(EventChainPreVisitor& aVisitor)
99 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
101 aVisitor.mCanHandle = true;
102 aVisitor.mParentTarget = mMutableFile;
103 return NS_OK;
106 // virtual
107 JSObject*
108 IDBFileHandle::WrapObject(JSContext* aCx)
110 return IDBFileHandleBinding::Wrap(aCx, this);
113 already_AddRefed<IDBFileRequest>
114 IDBFileHandle::GetMetadata(const IDBFileMetadataParameters& aParameters,
115 ErrorResult& aRv)
117 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
119 // Common state checking
120 if (!CheckState(aRv)) {
121 return nullptr;
124 // Do nothing if the window is closed
125 if (!CheckWindow()) {
126 return nullptr;
129 nsRefPtr<MetadataParameters> params =
130 new MetadataParameters(aParameters.mSize, aParameters.mLastModified);
131 if (!params->IsConfigured()) {
132 aRv.ThrowTypeError(MSG_METADATA_NOT_CONFIGURED);
133 return nullptr;
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);
143 return nullptr;
146 return fileRequest.forget().downcast<IDBFileRequest>();
149 NS_IMETHODIMP
150 IDBFileHandle::Run()
152 OnReturnToEventLoop();
153 return NS_OK;
156 nsresult
157 IDBFileHandle::OnCompleteOrAbort(bool aAborted)
159 nsCOMPtr<nsIDOMEvent> event;
160 if (aAborted) {
161 event = CreateGenericEvent(this, NS_LITERAL_STRING(ABORT_EVT_STR),
162 eDoesBubble, eNotCancelable);
163 } else {
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;
171 bool dummy;
172 if (NS_FAILED(DispatchEvent(event, &dummy))) {
173 NS_WARNING("Dispatch failed!");
176 return NS_OK;
179 bool
180 IDBFileHandle::CheckWindow()
182 return GetOwner();
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
195 } // namespace dom
196 } // namespace mozilla