Bumping manifests a=b2g-bump
[gecko.git] / dom / base / nsMimeTypeArray.cpp
blob257abf6f569ae0330bbeaecd784dbe04e0fa7d19
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 sw=2 et tw=79: */
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
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "nsMimeTypeArray.h"
9 #include "mozilla/dom/MimeTypeArrayBinding.h"
10 #include "mozilla/dom/MimeTypeBinding.h"
11 #include "nsIDOMNavigator.h"
12 #include "nsPluginArray.h"
13 #include "nsIMIMEService.h"
14 #include "nsIMIMEInfo.h"
15 #include "Navigator.h"
16 #include "nsServiceManagerUtils.h"
18 using namespace mozilla;
19 using namespace mozilla::dom;
21 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsMimeTypeArray)
22 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsMimeTypeArray)
23 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsMimeTypeArray)
24 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
25 NS_INTERFACE_MAP_ENTRY(nsISupports)
26 NS_INTERFACE_MAP_END
28 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsMimeTypeArray,
29 mWindow,
30 mMimeTypes,
31 mHiddenMimeTypes)
33 nsMimeTypeArray::nsMimeTypeArray(nsPIDOMWindow* aWindow)
34 : mWindow(aWindow)
38 nsMimeTypeArray::~nsMimeTypeArray()
42 JSObject*
43 nsMimeTypeArray::WrapObject(JSContext* aCx)
45 return MimeTypeArrayBinding::Wrap(aCx, this);
48 void
49 nsMimeTypeArray::Refresh()
51 mMimeTypes.Clear();
52 mHiddenMimeTypes.Clear();
55 nsPIDOMWindow*
56 nsMimeTypeArray::GetParentObject() const
58 MOZ_ASSERT(mWindow);
59 return mWindow;
62 nsMimeType*
63 nsMimeTypeArray::Item(uint32_t aIndex)
65 bool unused;
66 return IndexedGetter(aIndex, unused);
69 nsMimeType*
70 nsMimeTypeArray::NamedItem(const nsAString& aName)
72 bool unused;
73 return NamedGetter(aName, unused);
76 nsMimeType*
77 nsMimeTypeArray::IndexedGetter(uint32_t aIndex, bool &aFound)
79 aFound = false;
81 EnsurePluginMimeTypes();
83 if (aIndex >= mMimeTypes.Length()) {
84 return nullptr;
87 aFound = true;
89 return mMimeTypes[aIndex];
92 static nsMimeType*
93 FindMimeType(const nsTArray<nsRefPtr<nsMimeType> >& aMimeTypes,
94 const nsAString& aType)
96 for (uint32_t i = 0; i < aMimeTypes.Length(); ++i) {
97 nsMimeType* mimeType = aMimeTypes[i];
98 if (aType.Equals(mimeType->Type())) {
99 return mimeType;
103 return nullptr;
106 nsMimeType*
107 nsMimeTypeArray::NamedGetter(const nsAString& aName, bool &aFound)
109 aFound = false;
111 EnsurePluginMimeTypes();
113 nsString lowerName(aName);
114 ToLowerCase(lowerName);
116 nsMimeType* mimeType = FindMimeType(mMimeTypes, lowerName);
117 if (!mimeType) {
118 mimeType = FindMimeType(mHiddenMimeTypes, lowerName);
121 if (mimeType) {
122 aFound = true;
123 return mimeType;
126 // Now let's check with the MIME service.
127 nsCOMPtr<nsIMIMEService> mimeSrv = do_GetService("@mozilla.org/mime;1");
128 if (!mimeSrv) {
129 return nullptr;
132 nsCOMPtr<nsIMIMEInfo> mimeInfo;
133 mimeSrv->GetFromTypeAndExtension(NS_ConvertUTF16toUTF8(lowerName),
134 EmptyCString(), getter_AddRefs(mimeInfo));
135 if (!mimeInfo) {
136 return nullptr;
139 // Now we check whether we can really claim to support this type
140 nsHandlerInfoAction action = nsIHandlerInfo::saveToDisk;
141 mimeInfo->GetPreferredAction(&action);
142 if (action != nsIMIMEInfo::handleInternally) {
143 bool hasHelper = false;
144 mimeInfo->GetHasDefaultHandler(&hasHelper);
146 if (!hasHelper) {
147 nsCOMPtr<nsIHandlerApp> helper;
148 mimeInfo->GetPreferredApplicationHandler(getter_AddRefs(helper));
150 if (!helper) {
151 // mime info from the OS may not have a PreferredApplicationHandler
152 // so just check for an empty default description
153 nsAutoString defaultDescription;
154 mimeInfo->GetDefaultDescription(defaultDescription);
156 if (defaultDescription.IsEmpty()) {
157 // no support; just leave
158 return nullptr;
164 // If we got here, we support this type! Say so.
165 aFound = true;
167 // We don't want navigator.mimeTypes enumeration to expose MIME types with
168 // application handlers, so add them to the list of hidden MIME types.
169 nsMimeType *mt = new nsMimeType(mWindow, lowerName);
170 mHiddenMimeTypes.AppendElement(mt);
172 return mt;
175 bool
176 nsMimeTypeArray::NameIsEnumerable(const nsAString& aName)
178 return true;
181 uint32_t
182 nsMimeTypeArray::Length()
184 EnsurePluginMimeTypes();
186 return mMimeTypes.Length();
189 void
190 nsMimeTypeArray::GetSupportedNames(unsigned, nsTArray< nsString >& aRetval)
192 EnsurePluginMimeTypes();
194 for (uint32_t i = 0; i < mMimeTypes.Length(); ++i) {
195 aRetval.AppendElement(mMimeTypes[i]->Type());
199 void
200 nsMimeTypeArray::EnsurePluginMimeTypes()
202 if (!mMimeTypes.IsEmpty() || !mHiddenMimeTypes.IsEmpty() || !mWindow) {
203 return;
206 nsCOMPtr<nsIDOMNavigator> navigator;
207 mWindow->GetNavigator(getter_AddRefs(navigator));
209 if (!navigator) {
210 return;
213 ErrorResult rv;
214 nsPluginArray *pluginArray =
215 static_cast<Navigator*>(navigator.get())->GetPlugins(rv);
216 if (!pluginArray) {
217 return;
220 pluginArray->GetMimeTypes(mMimeTypes, mHiddenMimeTypes);
223 NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsMimeType, AddRef)
224 NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsMimeType, Release)
226 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsMimeType, mWindow, mPluginElement)
228 nsMimeType::nsMimeType(nsPIDOMWindow* aWindow, nsPluginElement* aPluginElement,
229 uint32_t aPluginTagMimeIndex, const nsAString& aType)
230 : mWindow(aWindow),
231 mPluginElement(aPluginElement),
232 mPluginTagMimeIndex(aPluginTagMimeIndex),
233 mType(aType)
237 nsMimeType::nsMimeType(nsPIDOMWindow* aWindow, const nsAString& aType)
238 : mWindow(aWindow),
239 mPluginElement(nullptr),
240 mPluginTagMimeIndex(0),
241 mType(aType)
245 nsMimeType::~nsMimeType()
249 nsPIDOMWindow*
250 nsMimeType::GetParentObject() const
252 MOZ_ASSERT(mWindow);
253 return mWindow;
256 JSObject*
257 nsMimeType::WrapObject(JSContext* aCx)
259 return MimeTypeBinding::Wrap(aCx, this);
262 void
263 nsMimeType::GetDescription(nsString& retval) const
265 retval.Truncate();
267 if (mPluginElement) {
268 CopyUTF8toUTF16(mPluginElement->PluginTag()->
269 mMimeDescriptions[mPluginTagMimeIndex], retval);
273 nsPluginElement*
274 nsMimeType::GetEnabledPlugin() const
276 return (mPluginElement && mPluginElement->PluginTag()->IsEnabled()) ?
277 mPluginElement : nullptr;
280 void
281 nsMimeType::GetSuffixes(nsString& retval) const
283 retval.Truncate();
285 if (mPluginElement) {
286 CopyUTF8toUTF16(mPluginElement->PluginTag()->
287 mExtensions[mPluginTagMimeIndex], retval);
291 void
292 nsMimeType::GetType(nsString& aRetval) const
294 aRetval = mType;