NS_IMETHODIMP PresentationService::ReconnectSession(const nsTArray<nsString>& aUrls, const nsAString& aSessionId, uint8_t aRole, nsIPresentationServiceCallback* aCallback) { PRES_DEBUG("%s:id[%s]\n", __func__, NS_ConvertUTF16toUTF8(aSessionId).get()); MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(!aSessionId.IsEmpty()); MOZ_ASSERT(aCallback); MOZ_ASSERT(!aUrls.IsEmpty()); if (aRole != nsIPresentationService::ROLE_CONTROLLER) { MOZ_ASSERT(false, "Only controller can call ReconnectSession."); return NS_ERROR_INVALID_ARG; } if (NS_WARN_IF(!aCallback)) { return NS_ERROR_INVALID_ARG; } RefPtr<PresentationSessionInfo> info = GetSessionInfo(aSessionId, aRole); if (NS_WARN_IF(!info)) { return aCallback->NotifyError(NS_ERROR_DOM_NOT_FOUND_ERR); } if (NS_WARN_IF(!aUrls.Contains(info->GetUrl()))) { return aCallback->NotifyError(NS_ERROR_DOM_NOT_FOUND_ERR); } return static_cast<PresentationControllingInfo*>(info.get())->Reconnect(aCallback); }
nsresult gfxFontconfigUtils::GetFontListInternal(nsTArray<nsCString>& aListOfFonts, nsIAtom *aLangGroup) { FcPattern *pat = nullptr; FcObjectSet *os = nullptr; FcFontSet *fs = nullptr; nsresult rv = NS_ERROR_FAILURE; aListOfFonts.Clear(); pat = FcPatternCreate(); if (!pat) goto end; os = FcObjectSetBuild(FC_FAMILY, nullptr); if (!os) goto end; // take the pattern and add the lang group to it if (aLangGroup) { AddLangGroup(pat, aLangGroup); } fs = FcFontList(nullptr, pat, os); if (!fs) goto end; for (int i = 0; i < fs->nfont; i++) { char *family; if (FcPatternGetString(fs->fonts[i], FC_FAMILY, 0, (FcChar8 **) &family) != FcResultMatch) { continue; } // Remove duplicates... nsAutoCString strFamily(family); if (aListOfFonts.Contains(strFamily)) continue; aListOfFonts.AppendElement(strFamily); } rv = NS_OK; end: if (NS_FAILED(rv)) aListOfFonts.Clear(); if (pat) FcPatternDestroy(pat); if (os) FcObjectSetDestroy(os); if (fs) FcFontSetDestroy(fs); return rv; }
void DBusWatcher::HandleWatchAdd() { int fd; ssize_t res = TEMP_FAILURE_RETRY(read(mControlFdR.get(), &fd, sizeof(fd))); if (res < 0) { LOG("Cannot read DBus watch add descriptor data from socket!\n"); return; } unsigned int flags; res = TEMP_FAILURE_RETRY(read(mControlFdR.get(), &flags, sizeof(flags))); if (res < 0) { LOG("Cannot read DBus watch add flag data from socket!\n"); return; } DBusWatch* watch; res = TEMP_FAILURE_RETRY(read(mControlFdR.get(), &watch, sizeof(watch))); if (res < 0) { LOG("Cannot read DBus watch add watch data from socket!\n"); return; } struct pollfd p = { fd, // .fd DBusFlagsToUnixEvents(flags), // .events 0 // .revents }; if (mPollData.Contains(p, PollFdComparator())) { return; } mPollData.AppendElement(p); mWatchData.AppendElement(watch); }
static void AssertPresShellsAndContextsSane(nsPrintObject* aPO, nsTArray<nsIPresShell*>& aPresShells, nsTArray<nsPresContext*>& aPresContexts) { if (aPO->mPresShell) { if (aPresShells.Contains(aPO->mPresShell)) { ASSERT_AND_NOTE("duplicate pres shells in print object tree"); } else { aPresShells.AppendElement(aPO->mPresShell); } } if (aPO->mPresContext) { if (aPresContexts.Contains(aPO->mPresContext)) { ASSERT_AND_NOTE("duplicate pres contexts in print object tree"); } else { aPresContexts.AppendElement(aPO->mPresContext); } } if (aPO->mPresShell && !aPO->mPresContext) { ASSERT_AND_NOTE("print object has pres shell but no pres context"); } if (!aPO->mPresShell && aPO->mPresContext) { ASSERT_AND_NOTE("print object has pres context but no pres shell"); } if (aPO->mPresContext && aPO->mPresContext->GetPresShell() != aPO->mPresShell) { ASSERT_AND_NOTE("print object has mismatching pres shell and pres context"); } if (aPO->mPresContext && !aPO->mPresContext->GetPresShell()) { ASSERT_AND_NOTE("mPresShell->GetPresShell() is null"); } for (uint32_t i = 0; i < aPO->mKids.Length(); i++) { AssertPresShellsAndContextsSane(aPO->mKids[i], aPresShells, aPresContexts); } }
NS_IMETHODIMP PresentationAvailability::NotifyAvailableChange( const nsTArray<nsString>& aAvailabilityUrls, bool aIsAvailable) { bool available = false; for (uint32_t i = 0; i < mUrls.Length(); ++i) { if (aAvailabilityUrls.Contains(mUrls[i])) { mAvailabilityOfUrl[i] = aIsAvailable; } available |= mAvailabilityOfUrl[i]; } return NS_DispatchToCurrentThread(NewRunnableMethod<bool>( "dom::PresentationAvailability::UpdateAvailabilityAndDispatchEvent", this, &PresentationAvailability::UpdateAvailabilityAndDispatchEvent, available)); }
void nsDOMTokenList::RemoveInternal(const nsAttrValue* aAttr, const nsTArray<nsString>& aTokens) { MOZ_ASSERT(aAttr, "Need an attribute"); nsAutoString input; aAttr->ToString(input); nsAString::const_iterator copyStart, tokenStart, iter, end; input.BeginReading(iter); input.EndReading(end); copyStart = iter; nsAutoString output; bool lastTokenRemoved = false; while (iter != end) { // skip whitespace. while (iter != end && nsContentUtils::IsHTMLWhitespace(*iter)) { ++iter; } if (iter == end) { // At this point we're sure the last seen token (if any) wasn't to be // removed. So the trailing spaces will need to be kept. MOZ_ASSERT(!lastTokenRemoved, "How did this happen?"); output.Append(Substring(copyStart, end)); break; } tokenStart = iter; do { ++iter; } while (iter != end && !nsContentUtils::IsHTMLWhitespace(*iter)); if (aTokens.Contains(Substring(tokenStart, iter))) { // Skip whitespace after the token, it will be collapsed. while (iter != end && nsContentUtils::IsHTMLWhitespace(*iter)) { ++iter; } copyStart = iter; lastTokenRemoved = true; } else { if (lastTokenRemoved && !output.IsEmpty()) { MOZ_ASSERT(!nsContentUtils::IsHTMLWhitespace(output.Last()), "Invalid last output token"); output.Append(char16_t(' ')); } lastTokenRemoved = false; output.Append(Substring(copyStart, iter)); copyStart = iter; } } mElement->SetAttr(kNameSpaceID_None, mAttrAtom, output, true); }
uint32_t GridLines::AppendRemovedAutoFits(const ComputedGridTrackInfo* aTrackInfo, const ComputedGridLineInfo* aLineInfo, nscoord aLastTrackEdge, uint32_t& aRepeatIndex, uint32_t aNumRepeatTracks, nsTArray<nsString>& aLineNames) { // Check to see if lineNames contains ALL of the before line names. bool alreadyHasBeforeLineNames = true; for (const auto& beforeName : aLineInfo->mNamesBefore) { if (!aLineNames.Contains(beforeName)) { alreadyHasBeforeLineNames = false; break; } } bool extractedExplicitLineNames = false; nsTArray<nsString> explicitLineNames; uint32_t linesAdded = 0; while (aRepeatIndex < aNumRepeatTracks && aTrackInfo->mRemovedRepeatTracks[aRepeatIndex]) { // If this is not the very first call to this function, and if we // haven't already added a line this call, pull all the explicit // names to pass along to the next line that will be added after // this function completes. if (aRepeatIndex > 0 && linesAdded == 0) { // Find the names that didn't match the before or after names, // and extract them. for (const auto& name : aLineNames) { if (!aLineInfo->mNamesBefore.Contains(name) && !aLineInfo->mNamesAfter.Contains(name)) { explicitLineNames.AppendElement(name); } } for (const auto& extractedName : explicitLineNames) { aLineNames.RemoveElement(extractedName); } extractedExplicitLineNames = true; } // If this is the second or later time through, or didn't already // have before names, add them. if (linesAdded > 0 || !alreadyHasBeforeLineNames) { aLineNames.AppendElements(aLineInfo->mNamesBefore); } RefPtr<GridLine> line = new GridLine(this); mLines.AppendElement(line); line->SetLineValues( aLineNames, nsPresContext::AppUnitsToDoubleCSSPixels(aLastTrackEdge), nsPresContext::AppUnitsToDoubleCSSPixels(0), aTrackInfo->mRepeatFirstTrack + aRepeatIndex + 1, GridDeclaration::Explicit ); // No matter what, the next line should have the after names associated // with it. If we go through the loop again, the before names will also // be added. aLineNames = aLineInfo->mNamesAfter; aRepeatIndex++; linesAdded++; } aRepeatIndex++; if (extractedExplicitLineNames) { // Pass on the explicit names we saved to the next explicit line. aLineNames.AppendElements(explicitLineNames); } if (alreadyHasBeforeLineNames && linesAdded > 0) { // If we started with before names, pass them on to the next explicit // line. aLineNames.AppendElements(aLineInfo->mNamesBefore); } return linesAdded; }