/* static */ already_AddRefed<URLSearchParams> URLSearchParams::Constructor(const GlobalObject& aGlobal, const USVStringSequenceSequenceOrUSVString& aInit, ErrorResult& aRv) { RefPtr<URLSearchParams> sp = new URLSearchParams(aGlobal.GetAsSupports(), nullptr); if (aInit.IsUSVString()) { NS_ConvertUTF16toUTF8 input(aInit.GetAsUSVString()); if (StringBeginsWith(input, NS_LITERAL_CSTRING("?"))) { sp->ParseInput(Substring(input, 1, input.Length() - 1)); } else { sp->ParseInput(input); } } else if (aInit.IsUSVStringSequenceSequence()) { const Sequence<Sequence<nsString>>& list = aInit.GetAsUSVStringSequenceSequence(); for (uint32_t i = 0; i < list.Length(); ++i) { const Sequence<nsString>& item = list[i]; if (item.Length() != 2) { aRv.Throw(NS_ERROR_DOM_TYPE_ERR); return nullptr; } sp->Append(item[0], item[1]); } } else { MOZ_CRASH("This should not happen."); } return sp.forget(); }
already_AddRefed<TouchList> TouchEvent::CopyTouches( const Sequence<OwningNonNull<Touch>>& aTouches) { RefPtr<TouchList> list = new TouchList(GetParentObject()); size_t len = aTouches.Length(); for (size_t i = 0; i < len; ++i) { list->Append(aTouches[i]); } return list.forget(); }
already_AddRefed<PaintRequestList> NotifyPaintEvent::PaintRequests(SystemCallerGuarantee) { Event* parent = this; RefPtr<PaintRequestList> requests = new PaintRequestList(parent); for (uint32_t i = 0; i < mInvalidateRequests.Length(); ++i) { RefPtr<PaintRequest> r = new PaintRequest(parent); r->SetRequest(mInvalidateRequests[i]); requests->Append(r); } return requests.forget(); }
already_AddRefed<DOMRectList> NotifyPaintEvent::ClientRects() { nsISupports* parent = ToSupports(this); RefPtr<DOMRectList> rectList = new DOMRectList(parent); nsRegion r = GetRegion(); for (auto iter = r.RectIter(); !iter.Done(); iter.Next()) { RefPtr<DOMRect> rect = new DOMRect(parent); rect->SetLayoutRect(iter.Get()); rectList->Append(rect); } return rectList.forget(); }
already_AddRefed<PaintRequestList> NotifyPaintEvent::PaintRequests() { Event* parent = this; RefPtr<PaintRequestList> requests = new PaintRequestList(parent); if (nsContentUtils::IsCallerChrome()) { for (uint32_t i = 0; i < mInvalidateRequests.Length(); ++i) { RefPtr<PaintRequest> r = new PaintRequest(parent); r->SetRequest(mInvalidateRequests[i]); requests->Append(r); } } return requests.forget(); }
// static already_AddRefed<InternalHeaders> InternalHeaders::CORSHeaders(InternalHeaders* aHeaders) { RefPtr<InternalHeaders> cors = new InternalHeaders(aHeaders->mGuard); ErrorResult result; nsAutoCString acExposedNames; aHeaders->Get(NS_LITERAL_CSTRING("Access-Control-Expose-Headers"), acExposedNames, result); MOZ_ASSERT(!result.Failed()); AutoTArray<nsCString, 5> exposeNamesArray; nsCCharSeparatedTokenizer exposeTokens(acExposedNames, ','); while (exposeTokens.hasMoreTokens()) { const nsDependentCSubstring& token = exposeTokens.nextToken(); if (token.IsEmpty()) { continue; } if (!NS_IsValidHTTPToken(token)) { NS_WARNING("Got invalid HTTP token in Access-Control-Expose-Headers. Header value is:"); NS_WARNING(acExposedNames.get()); exposeNamesArray.Clear(); break; } exposeNamesArray.AppendElement(token); } nsCaseInsensitiveCStringArrayComparator comp; for (uint32_t i = 0; i < aHeaders->mList.Length(); ++i) { const Entry& entry = aHeaders->mList[i]; if (entry.mName.EqualsASCII("cache-control") || entry.mName.EqualsASCII("content-language") || entry.mName.EqualsASCII("content-type") || entry.mName.EqualsASCII("expires") || entry.mName.EqualsASCII("last-modified") || entry.mName.EqualsASCII("pragma") || exposeNamesArray.Contains(entry.mName, comp)) { cors->Append(entry.mName, entry.mValue, result); MOZ_ASSERT(!result.Failed()); } } return cors.forget(); }
// The end of a body is marked by a CRLF followed by the boundary. So the // CRLF is part of the boundary and not the body, but any prior CRLFs are // part of the body. This will position the iterator at the beginning of the // boundary (after the CRLF). bool ParseBody(const nsACString& aBoundaryString, nsACString::const_iterator& aStart, nsACString::const_iterator& aEnd) { const char* beginning = aStart.get(); // Find the boundary marking the end of the body. nsACString::const_iterator end(aEnd); if (!FindInReadable(aBoundaryString, aStart, end)) { return false; } // We found a boundary, strip the just prior CRLF, and consider // everything else the body section. if (aStart.get() - beginning < 2) { // Only the first entry can have a boundary right at the beginning. Even // an empty body will have a CRLF before the boundary. So this is // a failure. return false; } // Check that there is a CRLF right before the boundary. aStart.advance(-2); // Skip optional hyphens. if (*aStart == '-' && *(aStart.get()+1) == '-') { if (aStart.get() - beginning < 2) { return false; } aStart.advance(-2); } if (*aStart != nsCRT::CR || *(aStart.get()+1) != nsCRT::LF) { return false; } nsAutoCString body(beginning, aStart.get() - beginning); // Restore iterator to after the \r\n as we promised. // We do not need to handle the extra hyphens case since our boundary // parser in PushOverBoundary() aStart.advance(2); if (!mFormData) { mFormData = new nsFormData(); } NS_ConvertUTF8toUTF16 name(mName); if (mFilename.IsVoid()) { mFormData->Append(name, NS_ConvertUTF8toUTF16(body)); } else { // Unfortunately we've to copy the data first since all our strings are // going to free it. We also need fallible alloc, so we can't just use // ToNewCString(). char* copy = static_cast<char*>(moz_xmalloc(body.Length())); if (!copy) { NS_WARNING("Failed to copy File entry body."); return false; } nsCString::const_iterator bodyIter, bodyEnd; body.BeginReading(bodyIter); body.EndReading(bodyEnd); char *p = copy; while (bodyIter != bodyEnd) { *p++ = *bodyIter++; } p = nullptr; RefPtr<Blob> file = File::CreateMemoryFile(mParentObject, reinterpret_cast<void *>(copy), body.Length(), NS_ConvertUTF8toUTF16(mFilename), NS_ConvertUTF8toUTF16(mContentType), /* aLastModifiedDate */ 0); Optional<nsAString> dummy; mFormData->Append(name, *file, dummy); } return true; }