already_AddRefed<DOMStringList> DataTransfer::GetTypes(ErrorResult& aRv) const { RefPtr<DOMStringList> types = new DOMStringList(); const nsTArray<RefPtr<DataTransferItem>>* items = mItems->MozItemsAt(0); if (NS_WARN_IF(!items)) { return types.forget(); } for (uint32_t i = 0; i < items->Length(); i++) { DataTransferItem* item = items->ElementAt(i); MOZ_ASSERT(item); if (item->ChromeOnly() && !nsContentUtils::LegacyIsCallerChromeOrNativeCode()) { continue; } nsAutoString type; item->GetType(type); if (item->Kind() == DataTransferItem::KIND_STRING || type.EqualsASCII(kFileMime)) { // If the entry has kind KIND_STRING, we want to add it to the list. if (NS_WARN_IF(!types->Add(type))) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } } } for (uint32_t i = 0; i < mItems->Length(); ++i) { ErrorResult rv; bool found = false; DataTransferItem* item = mItems->IndexedGetter(i, found, rv); if (!found || rv.Failed() || item->Kind() != DataTransferItem::KIND_FILE) { rv.SuppressException(); continue; } if (NS_WARN_IF(!types->Add(NS_LITERAL_STRING("Files")))) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } break; } return types.forget(); }
already_AddRefed<DOMStringList> DataTransfer::MozTypesAt(uint32_t aIndex, CallerType aCallerType, ErrorResult& aRv) const { // Only the first item is valid for clipboard events if (aIndex > 0 && (mEventMessage == eCut || mEventMessage == eCopy || mEventMessage == ePaste)) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } RefPtr<DOMStringList> types = new DOMStringList(); if (aIndex < MozItemCount()) { // note that you can retrieve the types regardless of their principal const nsTArray<RefPtr<DataTransferItem>>& items = *mItems->MozItemsAt(aIndex); bool addFile = false; for (uint32_t i = 0; i < items.Length(); i++) { if (items[i]->ChromeOnly() && aCallerType != CallerType::System) { continue; } // NOTE: The reason why we get the internal type here is because we want // kFileMime to appear in the types list for backwards compatibility // reasons. nsAutoString type; items[i]->GetInternalType(type); if (NS_WARN_IF(!types->Add(type))) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } if (items[i]->Kind() == DataTransferItem::KIND_FILE) { addFile = true; } } if (addFile) { types->Add(NS_LITERAL_STRING("Files")); } } return types.forget(); }
already_AddRefed<DOMStringList> DataTransfer::MozTypesAt(uint32_t aIndex, ErrorResult& aRv) const { // Only the first item is valid for clipboard events if (aIndex > 0 && (mEventMessage == eCut || mEventMessage == eCopy || mEventMessage == ePaste)) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } RefPtr<DOMStringList> types = new DOMStringList(); if (aIndex < MozItemCount()) { // note that you can retrieve the types regardless of their principal const nsTArray<RefPtr<DataTransferItem>>& items = *mItems->MozItemsAt(aIndex); bool addFile = false; for (uint32_t i = 0; i < items.Length(); i++) { if (items[i]->ChromeOnly() && !nsContentUtils::LegacyIsCallerChromeOrNativeCode()) { continue; } nsAutoString type; items[i]->GetType(type); if (NS_WARN_IF(!types->Add(type))) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } if (items[i]->Kind() == DataTransferItem::KIND_FILE) { addFile = true; } } if (addFile) { types->Add(NS_LITERAL_STRING("Files")); } } return types.forget(); }
already_AddRefed<DOMStringList> DataTransfer::MozTypesAt(uint32_t aIndex, ErrorResult& aRv) const { // Only the first item is valid for clipboard events if (aIndex > 0 && (mEventMessage == eCut || mEventMessage == eCopy || mEventMessage == ePaste)) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } RefPtr<DOMStringList> types = new DOMStringList(); if (aIndex < mItems.Length()) { bool addFile = false; // note that you can retrieve the types regardless of their principal const nsTArray<TransferItem>& item = mItems[aIndex]; for (uint32_t i = 0; i < item.Length(); i++) { const nsString& format = item[i].mFormat; types->Add(format); if (!addFile) { addFile = format.EqualsASCII(kFileMime); } } if (addFile) { // If this is a content caller, and a file is in the data transfer, remove // the non-file types. This prevents alternate text forms of the file // from being returned. if (!nsContentUtils::LegacyIsCallerChromeOrNativeCode()) { types->Clear(); types->Add(NS_LITERAL_STRING(kFileMime)); } types->Add(NS_LITERAL_STRING("Files")); } } return types.forget(); }
already_AddRefed<DOMStringList> DataTransfer::Types() { RefPtr<DOMStringList> types = new DOMStringList(); if (mItems.Length()) { bool addFile = false; const nsTArray<TransferItem>& item = mItems[0]; for (uint32_t i = 0; i < item.Length(); i++) { const nsString& format = item[i].mFormat; types->Add(format); if (!addFile) { addFile = format.EqualsASCII(kFileMime) || format.EqualsASCII("application/x-moz-file-promise"); } } if (addFile) { types->Add(NS_LITERAL_STRING("Files")); } } return types.forget(); }
already_AddRefed<DOMStringList> DataTransfer::MozTypesAt(uint32_t aIndex, ErrorResult& aRv) { // Only the first item is valid for clipboard events if (aIndex > 0 && (mEventMessage == eCut || mEventMessage == eCopy || mEventMessage == ePaste)) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } RefPtr<DOMStringList> types = new DOMStringList(); if (aIndex < mItems.Length()) { // note that you can retrieve the types regardless of their principal nsTArray<TransferItem>& item = mItems[aIndex]; for (uint32_t i = 0; i < item.Length(); i++) types->Add(item[i].mFormat); } return types.forget(); }
already_AddRefed<DOMStringList> nsDOMOfflineResourceList::GetMozItems(ErrorResult& aRv) { if (IS_CHILD_PROCESS()) { aRv.Throw(NS_ERROR_NOT_IMPLEMENTED); return nullptr; } RefPtr<DOMStringList> items = new DOMStringList(); // If we are not associated with an application cache, return an // empty list. nsCOMPtr<nsIApplicationCache> appCache = GetDocumentAppCache(); if (!appCache) { return items.forget(); } aRv = Init(); if (aRv.Failed()) { return nullptr; } uint32_t length; char **keys; aRv = appCache->GatherEntries(nsIApplicationCache::ITEM_DYNAMIC, &length, &keys); if (aRv.Failed()) { return nullptr; } for (uint32_t i = 0; i < length; i++) { items->Add(NS_ConvertUTF8toUTF16(keys[i])); } NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(length, keys); return items.forget(); }