void nsXULPrototypeCache::AbortFastLoads() { #ifdef DEBUG_brendan NS_BREAK(); #endif // Save a strong ref to the FastLoad file, so we can remove it after we // close open streams to it. nsCOMPtr<nsIFile> file = gFastLoadFile; // Flush the XUL cache for good measure, in case we cached a bogus/downrev // script, somehow. Flush(); // Clear the FastLoad set mFastLoadURITable.Clear(); if (! gFastLoadService) return; // Fetch the current input (if FastLoad file existed) or output (if we're // creating the FastLoad file during this app startup) stream. nsCOMPtr<nsIObjectInputStream> objectInput; nsCOMPtr<nsIObjectOutputStream> objectOutput; gFastLoadService->GetInputStream(getter_AddRefs(objectInput)); gFastLoadService->GetOutputStream(getter_AddRefs(objectOutput)); if (objectOutput) { gFastLoadService->SetOutputStream(nsnull); if (NS_SUCCEEDED(objectOutput->Close()) && gChecksumXULFastLoadFile) gFastLoadService->CacheChecksum(gFastLoadFile, objectOutput); } if (objectInput) { // If this is the last of one or more XUL master documents loaded // together at app startup, close the FastLoad service's singleton // input stream now. gFastLoadService->SetInputStream(nsnull); objectInput->Close(); } // Now rename or remove the file. if (file) { #ifdef DEBUG // Remove any existing Aborted.mfasl files generated in previous runs. nsCOMPtr<nsIFile> existingAbortedFile; file->Clone(getter_AddRefs(existingAbortedFile)); if (existingAbortedFile) { existingAbortedFile->SetLeafName(NS_LITERAL_STRING("Aborted.mfasl")); PRBool fileExists = PR_FALSE; existingAbortedFile->Exists(&fileExists); if (fileExists) existingAbortedFile->Remove(PR_FALSE); } file->MoveToNative(nsnull, NS_LITERAL_CSTRING("Aborted.mfasl")); #else file->Remove(PR_FALSE); #endif } // If the list is empty now, the FastLoad process is done. NS_RELEASE(gFastLoadService); NS_RELEASE(gFastLoadFile); }
nsresult EventListenerManager::CompileEventHandlerInternal(Listener* aListener, const nsAString* aBody, Element* aElement) { MOZ_ASSERT(aListener->GetJSEventHandler()); MOZ_ASSERT(aListener->mHandlerIsString, "Why are we compiling a non-string JS listener?"); JSEventHandler* jsEventHandler = aListener->GetJSEventHandler(); MOZ_ASSERT(!jsEventHandler->GetTypedEventHandler().HasEventHandler(), "What is there to compile?"); nsresult result = NS_OK; nsCOMPtr<nsIDocument> doc; nsCOMPtr<nsIScriptGlobalObject> global = GetScriptGlobalAndDocument(getter_AddRefs(doc)); NS_ENSURE_STATE(global); // Activate JSAPI, and make sure that exceptions are reported on the right // Window. AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(global))) { return NS_ERROR_UNEXPECTED; } jsapi.TakeOwnershipOfErrorReporting(); JSContext* cx = jsapi.cx(); nsCOMPtr<nsIAtom> typeAtom = aListener->mTypeAtom; nsIAtom* attrName = typeAtom; // Flag us as not a string so we don't keep trying to compile strings which // can't be compiled. aListener->mHandlerIsString = false; // mTarget may not be an Element if it's a window and we're // getting an inline event listener forwarded from <html:body> or // <html:frameset> or <xul:window> or the like. // XXX I don't like that we have to reference content from // here. The alternative is to store the event handler string on // the JSEventHandler itself, and that still doesn't address // the arg names issue. nsCOMPtr<Element> element = do_QueryInterface(mTarget); MOZ_ASSERT(element || aBody, "Where will we get our body?"); nsAutoString handlerBody; const nsAString* body = aBody; if (!aBody) { if (aListener->mTypeAtom == nsGkAtoms::onSVGLoad) { attrName = nsGkAtoms::onload; } else if (aListener->mTypeAtom == nsGkAtoms::onSVGUnload) { attrName = nsGkAtoms::onunload; } else if (aListener->mTypeAtom == nsGkAtoms::onSVGResize) { attrName = nsGkAtoms::onresize; } else if (aListener->mTypeAtom == nsGkAtoms::onSVGScroll) { attrName = nsGkAtoms::onscroll; } else if (aListener->mTypeAtom == nsGkAtoms::onSVGZoom) { attrName = nsGkAtoms::onzoom; } else if (aListener->mTypeAtom == nsGkAtoms::onbeginEvent) { attrName = nsGkAtoms::onbegin; } else if (aListener->mTypeAtom == nsGkAtoms::onrepeatEvent) { attrName = nsGkAtoms::onrepeat; } else if (aListener->mTypeAtom == nsGkAtoms::onendEvent) { attrName = nsGkAtoms::onend; } element->GetAttr(kNameSpaceID_None, attrName, handlerBody); body = &handlerBody; aElement = element; } aListener = nullptr; uint32_t lineNo = 0; nsAutoCString url (NS_LITERAL_CSTRING("-moz-evil:lying-event-listener")); MOZ_ASSERT(body); MOZ_ASSERT(aElement); nsIURI *uri = aElement->OwnerDoc()->GetDocumentURI(); if (uri) { uri->GetSpec(url); lineNo = 1; } nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(mTarget); uint32_t argCount; const char **argNames; nsContentUtils::GetEventArgNames(aElement->GetNameSpaceID(), typeAtom, win, &argCount, &argNames); JSAddonId *addonId = MapURIToAddonID(uri); // Wrap the event target, so that we can use it as the scope for the event // handler. Note that mTarget is different from aElement in the <body> case, // where mTarget is a Window. // // The wrapScope doesn't really matter here, because the target will create // its reflector in the proper scope, and then we'll enter that compartment. JS::Rooted<JSObject*> wrapScope(cx, global->GetGlobalJSObject()); JS::Rooted<JS::Value> v(cx); { JSAutoCompartment ac(cx, wrapScope); nsresult rv = nsContentUtils::WrapNative(cx, mTarget, &v, /* aAllowWrapping = */ false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } if (addonId) { JS::Rooted<JSObject*> vObj(cx, &v.toObject()); JS::Rooted<JSObject*> addonScope(cx, xpc::GetAddonScope(cx, vObj, addonId)); if (!addonScope) { return NS_ERROR_FAILURE; } JSAutoCompartment ac(cx, addonScope); // Wrap our event target into the addon scope, since that's where we want to // do all our work. if (!JS_WrapValue(cx, &v)) { return NS_ERROR_FAILURE; } } JS::Rooted<JSObject*> target(cx, &v.toObject()); JSAutoCompartment ac(cx, target); // Now that we've entered the compartment we actually care about, create our // scope chain. Note that we start with |element|, not aElement, because // mTarget is different from aElement in the <body> case, where mTarget is a // Window, and in that case we do not want the scope chain to include the body // or the document. JS::AutoObjectVector scopeChain(cx); if (!nsJSUtils::GetScopeChainForElement(cx, element, scopeChain)) { return NS_ERROR_OUT_OF_MEMORY; } nsDependentAtomString str(attrName); // Most of our names are short enough that we don't even have to malloc // the JS string stuff, so don't worry about playing games with // refcounting XPCOM stringbuffers. JS::Rooted<JSString*> jsStr(cx, JS_NewUCStringCopyN(cx, str.BeginReading(), str.Length())); NS_ENSURE_TRUE(jsStr, NS_ERROR_OUT_OF_MEMORY); // Get the reflector for |aElement|, so that we can pass to setElement. if (NS_WARN_IF(!GetOrCreateDOMReflector(cx, target, aElement, &v))) { return NS_ERROR_FAILURE; } JS::CompileOptions options(cx); options.setIntroductionType("eventHandler") .setFileAndLine(url.get(), lineNo) .setVersion(JSVERSION_DEFAULT) .setElement(&v.toObject()) .setElementAttributeName(jsStr); JS::Rooted<JSObject*> handler(cx); result = nsJSUtils::CompileFunction(jsapi, scopeChain, options, nsAtomCString(typeAtom), argCount, argNames, *body, handler.address()); NS_ENSURE_SUCCESS(result, result); NS_ENSURE_TRUE(handler, NS_ERROR_FAILURE); if (jsEventHandler->EventName() == nsGkAtoms::onerror && win) { nsRefPtr<OnErrorEventHandlerNonNull> handlerCallback = new OnErrorEventHandlerNonNull(handler, /* aIncumbentGlobal = */ nullptr); jsEventHandler->SetHandler(handlerCallback); } else if (jsEventHandler->EventName() == nsGkAtoms::onbeforeunload && win) { nsRefPtr<OnBeforeUnloadEventHandlerNonNull> handlerCallback = new OnBeforeUnloadEventHandlerNonNull(handler, /* aIncumbentGlobal = */ nullptr); jsEventHandler->SetHandler(handlerCallback); } else { nsRefPtr<EventHandlerNonNull> handlerCallback = new EventHandlerNonNull(handler, /* aIncumbentGlobal = */ nullptr); jsEventHandler->SetHandler(handlerCallback); } return result; }
nsresult sbLocalDatabaseLibraryFactory::InitalizeLibrary(nsIFile* aDatabaseFile, const nsAString &aResourceGUID) { nsresult rv; PRInt32 dbOk; nsCOMPtr<nsIFile> parentDirectory; rv = aDatabaseFile->GetParent(getter_AddRefs(parentDirectory)); NS_ENSURE_SUCCESS(rv, rv); bool parentExists; rv = parentDirectory->Exists(&parentExists); NS_ENSURE_SUCCESS(rv, rv); if (!parentExists) { rv = CreateDirectory(parentDirectory); NS_ENSURE_SUCCESS(rv, rv); } bool parentIsWritable = IsDirectoryWritable(parentDirectory); NS_ENSURE_TRUE(parentIsWritable, NS_ERROR_FILE_ACCESS_DENIED); // Now that we know we have appropriate permissions make a new query. nsCOMPtr<sbIDatabaseQuery> query = do_CreateInstance(SONGBIRD_DATABASEQUERY_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = query->SetAsyncQuery(PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); rv = SetQueryDatabaseFile(query, aDatabaseFile); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIURI> schemaURI; rv = NS_NewURI(getter_AddRefs(schemaURI), NS_LITERAL_CSTRING(SCHEMA_URL)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIInputStream> input; rv = NS_OpenURI(getter_AddRefs(input), schemaURI); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIConverterInputStream> converterStream = do_CreateInstance("@mozilla.org/intl/converter-input-stream;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rv = converterStream->Init(input, "UTF-8", CONVERTER_BUFFER_SIZE, nsIConverterInputStream:: DEFAULT_REPLACEMENT_CHARACTER); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIUnicharInputStream> unichar = do_QueryInterface(converterStream, &rv); NS_ENSURE_SUCCESS(rv, rv); PRUint32 read; nsString response, result; rv = unichar->ReadString(PR_UINT32_MAX, result, &read); NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(read, "Schema file zero bytes?"); while (read > 0) { response.Append(result); rv = unichar->ReadString(PR_UINT32_MAX, result, &read); NS_ENSURE_SUCCESS(rv, rv); } rv = unichar->Close(); NS_ENSURE_SUCCESS(rv, rv); NS_NAMED_LITERAL_STRING(colonNewline, ";\n"); PRInt32 posStart = 0; PRInt32 posEnd = response.Find(colonNewline, posStart); while (posEnd >= 0) { rv = query->AddQuery(Substring(response, posStart, posEnd - posStart)); NS_ENSURE_SUCCESS(rv, rv); posStart = posEnd + 2; posEnd = response.Find(colonNewline, posStart); } rv = query->Execute(&dbOk); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE); nsString guid(aResourceGUID); if(guid.IsEmpty()) { // Create a resource guid for this database. nsCOMPtr<nsIUUIDGenerator> uuidGen = do_GetService("@mozilla.org/uuid-generator;1", &rv); NS_ENSURE_SUCCESS(rv, rv); nsID id; rv = uuidGen->GenerateUUIDInPlace(&id); NS_ENSURE_SUCCESS(rv, rv); char guidChars[NSID_LENGTH]; id.ToProvidedString(guidChars); guid = NS_ConvertASCIItoUTF16(nsDependentCString(guidChars + 1, NSID_LENGTH - 3)); } // Insert the guid into the database. nsCOMPtr<sbISQLInsertBuilder> insert = do_CreateInstance(SB_SQLBUILDER_INSERT_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = insert->SetIntoTableName(NS_LITERAL_STRING("library_metadata")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("name")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("value")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueString(NS_LITERAL_STRING("resource-guid")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueString(guid); NS_ENSURE_SUCCESS(rv, rv); nsAutoString sql; rv = insert->ToString(sql); NS_ENSURE_SUCCESS(rv, rv); rv = query->ResetQuery(); NS_ENSURE_SUCCESS(rv, rv); rv = query->AddQuery(sql); NS_ENSURE_SUCCESS(rv, rv); rv = query->Execute(&dbOk); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE); nsString now; sbLocalDatabaseLibrary::GetNowString(now); nsCOMPtr<nsIURI> fileURI; rv = NS_NewFileURI(getter_AddRefs(fileURI), aDatabaseFile); NS_ENSURE_SUCCESS(rv, rv); nsCString uriSpec; rv = fileURI->GetSpec(uriSpec); NS_ENSURE_SUCCESS(rv, rv); // Add the default library media item properties insert = do_CreateInstance(SB_SQLBUILDER_INSERT_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = insert->SetIntoTableName(NS_LITERAL_STRING("library_media_item")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("guid")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueString(guid); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("created")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueString(now); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("updated")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueString(now); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("content_url")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueString(NS_ConvertUTF8toUTF16(uriSpec)); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("hidden")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueLong(0); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddColumn(NS_LITERAL_STRING("is_list")); NS_ENSURE_SUCCESS(rv, rv); rv = insert->AddValueLong(0); NS_ENSURE_SUCCESS(rv, rv); rv = insert->ToString(sql); NS_ENSURE_SUCCESS(rv, rv); rv = query->ResetQuery(); NS_ENSURE_SUCCESS(rv, rv); rv = query->AddQuery(sql); NS_ENSURE_SUCCESS(rv, rv); rv = query->Execute(&dbOk); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(dbOk == 0, NS_ERROR_FAILURE); return NS_OK; }
NS_DECL_THREADSAFE_ISUPPORTS NS_IMETHOD CollectReports(nsIMemoryReporterCallback *aCallback, nsISupports *aClosure, bool aAnonymize) override { typedef BlobImplMemory::DataOwner DataOwner; StaticMutexAutoLock lock(DataOwner::sDataOwnerMutex); if (!DataOwner::sDataOwners) { return NS_OK; } const size_t LARGE_OBJECT_MIN_SIZE = 8 * 1024; size_t smallObjectsTotal = 0; for (DataOwner *owner = DataOwner::sDataOwners->getFirst(); owner; owner = owner->getNext()) { size_t size = MemoryFileDataOwnerMallocSizeOf(owner->mData); if (size < LARGE_OBJECT_MIN_SIZE) { smallObjectsTotal += size; } else { SHA1Sum sha1; sha1.update(owner->mData, owner->mLength); uint8_t digest[SHA1Sum::kHashSize]; // SHA1 digests are 20 bytes long. sha1.finish(digest); nsAutoCString digestString; for (size_t i = 0; i < sizeof(digest); i++) { digestString.AppendPrintf("%02x", digest[i]); } nsresult rv = aCallback->Callback( /* process */ NS_LITERAL_CSTRING(""), nsPrintfCString( "explicit/dom/memory-file-data/large/file(length=%llu, sha1=%s)", owner->mLength, aAnonymize ? "<anonymized>" : digestString.get()), KIND_HEAP, UNITS_BYTES, size, nsPrintfCString( "Memory used to back a memory file of length %llu bytes. The file " "has a sha1 of %s.\n\n" "Note that the allocator may round up a memory file's length -- " "that is, an N-byte memory file may take up more than N bytes of " "memory.", owner->mLength, digestString.get()), aClosure); NS_ENSURE_SUCCESS(rv, rv); } } if (smallObjectsTotal > 0) { nsresult rv = aCallback->Callback( /* process */ NS_LITERAL_CSTRING(""), NS_LITERAL_CSTRING("explicit/dom/memory-file-data/small"), KIND_HEAP, UNITS_BYTES, smallObjectsTotal, nsPrintfCString( "Memory used to back small memory files (less than %d bytes each).\n\n" "Note that the allocator may round up a memory file's length -- " "that is, an N-byte memory file may take up more than N bytes of " "memory."), aClosure); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }
CallbackObject::CallSetup::CallSetup(CallbackObject* aCallback, ErrorResult& aRv, const char* aExecutionReason, ExceptionHandling aExceptionHandling, JS::Realm* aRealm, bool aIsJSImplementedWebIDL) : mCx(nullptr), mRealm(aRealm), mErrorResult(aRv), mExceptionHandling(aExceptionHandling), mIsMainThread(NS_IsMainThread()) { CycleCollectedJSContext* ccjs = CycleCollectedJSContext::Get(); if (ccjs) { ccjs->EnterMicroTask(); } // Compute the caller's subject principal (if necessary) early, before we // do anything that might perturb the relevant state. nsIPrincipal* webIDLCallerPrincipal = nullptr; if (aIsJSImplementedWebIDL) { webIDLCallerPrincipal = nsContentUtils::SubjectPrincipalOrSystemIfNativeCaller(); } JSObject* wrappedCallback = aCallback->CallbackPreserveColor(); if (!wrappedCallback) { aRv.ThrowDOMException( NS_ERROR_DOM_NOT_SUPPORTED_ERR, NS_LITERAL_CSTRING( "Cannot execute callback from a nuked compartment.")); return; } nsIGlobalObject* globalObject = nullptr; { // First, find the real underlying callback. JSObject* realCallback = js::UncheckedUnwrap(wrappedCallback); // Check that it's ok to run this callback. JS-implemented WebIDL is always // OK to run, since it runs with Chrome privileges anyway. if (mIsMainThread && !aIsJSImplementedWebIDL) { // Make sure to use realCallback to get the global of the callback // object, not the wrapper. if (!xpc::Scriptability::Get(realCallback).Allowed()) { aRv.ThrowDOMException( NS_ERROR_DOM_NOT_SUPPORTED_ERR, NS_LITERAL_CSTRING( "Refusing to execute function from global in which " "script is disabled.")); return; } } // Now get the global for this callback. Note that for the case of // JS-implemented WebIDL we never have a window here. nsGlobalWindowInner* win = mIsMainThread && !aIsJSImplementedWebIDL ? xpc::WindowGlobalOrNull(realCallback) : nullptr; if (win) { // We don't want to run script in windows that have been navigated away // from. if (!win->HasActiveDocument()) { aRv.ThrowDOMException( NS_ERROR_DOM_NOT_SUPPORTED_ERR, NS_LITERAL_CSTRING("Refusing to execute function from window " "whose document is no longer active.")); return; } globalObject = win; } else { // No DOM Window. Store the global. globalObject = xpc::NativeGlobal(realCallback); MOZ_ASSERT(globalObject); } } // Bail out if there's no useful global. if (!globalObject->HasJSGlobal()) { aRv.ThrowDOMException( NS_ERROR_DOM_NOT_SUPPORTED_ERR, NS_LITERAL_CSTRING("Refusing to execute function from global which is " "being torn down.")); return; } mAutoEntryScript.emplace(globalObject, aExecutionReason, mIsMainThread); mAutoEntryScript->SetWebIDLCallerPrincipal(webIDLCallerPrincipal); nsIGlobalObject* incumbent = aCallback->IncumbentGlobalOrNull(); if (incumbent) { // The callback object traces its incumbent JS global, so in general it // should be alive here. However, it's possible that we could run afoul // of the same IPC global weirdness described above, wherein the // nsIGlobalObject has severed its reference to the JS global. Let's just // be safe here, so that nobody has to waste a day debugging gaia-ui tests. if (!incumbent->HasJSGlobal()) { aRv.ThrowDOMException( NS_ERROR_DOM_NOT_SUPPORTED_ERR, NS_LITERAL_CSTRING("Refusing to execute function because our " "incumbent global is being torn down.")); return; } mAutoIncumbentScript.emplace(incumbent); } JSContext* cx = mAutoEntryScript->cx(); // Unmark the callable (by invoking CallbackOrNull() and not the // CallbackPreserveColor() variant), and stick it in a Rooted before it can // go gray again. // Nothing before us in this function can trigger a CC, so it's safe to wait // until here it do the unmark. This allows us to construct mRootedCallable // with the cx from mAutoEntryScript, avoiding the cost of finding another // JSContext. (Rooted<> does not care about requests or compartments.) mRootedCallable.emplace(cx, aCallback->CallbackOrNull()); mRootedCallableGlobal.emplace(cx, aCallback->CallbackGlobalOrNull()); mAsyncStack.emplace(cx, aCallback->GetCreationStack()); if (*mAsyncStack) { mAsyncStackSetter.emplace(cx, *mAsyncStack, aExecutionReason); } // Enter the realm of our callback, so we can actually work with it. // // Note that if the callback is a wrapper, this will not be the same // realm that we ended up in with mAutoEntryScript above, because the // entry point is based off of the unwrapped callback (realCallback). mAr.emplace(cx, *mRootedCallableGlobal); // And now we're ready to go. mCx = cx; }
/* statis */ nsTArray<UniquePtr<TrackInfo>> MP4Decoder::GetTracksInfo(const MediaContainerType& aType, MediaResult& aError) { nsTArray<UniquePtr<TrackInfo>> tracks; if (!IsTypeValid(aType)) { aError = MediaResult( NS_ERROR_DOM_MEDIA_FATAL_ERR, RESULT_DETAIL("Invalid type:%s", aType.Type().AsString().get())); return tracks; } aError = NS_OK; const MediaCodecs& codecs = aType.ExtendedType().Codecs(); if (codecs.IsEmpty()) { return tracks; } const bool isVideo = aType.Type() == MEDIAMIMETYPE("video/mp4") || aType.Type() == MEDIAMIMETYPE("video/quicktime") || aType.Type() == MEDIAMIMETYPE("video/x-m4v"); for (const auto& codec : codecs.Range()) { if (IsAACCodecString(codec)) { tracks.AppendElement( CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( NS_LITERAL_CSTRING("audio/mp4a-latm"), aType)); continue; } if (codec.EqualsLiteral("mp3")) { tracks.AppendElement( CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( NS_LITERAL_CSTRING("audio/mpeg"), aType)); continue; } if (codec.EqualsLiteral("opus") || codec.EqualsLiteral("flac")) { tracks.AppendElement( CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( NS_LITERAL_CSTRING("audio/") + NS_ConvertUTF16toUTF8(codec), aType)); continue; } if (IsVP9CodecString(codec)) { auto trackInfo = CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( NS_LITERAL_CSTRING("video/vp9"), aType); uint8_t profile = 0; uint8_t level = 0; uint8_t bitDepth = 0; if (ExtractVPXCodecDetails(codec, profile, level, bitDepth)) { trackInfo->GetAsVideoInfo()->mColorDepth = gfx::ColorDepthForBitDepth(bitDepth); } tracks.AppendElement(std::move(trackInfo)); continue; } #ifdef MOZ_AV1 if (IsAV1CodecString(codec)) { tracks.AppendElement( CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( NS_LITERAL_CSTRING("video/av1"), aType)); continue; } #endif if (isVideo && IsWhitelistedH264Codec(codec)) { auto trackInfo = CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( NS_LITERAL_CSTRING("video/avc"), aType); uint8_t profile = 0, constraint = 0, level = 0; MOZ_ALWAYS_TRUE( ExtractH264CodecDetails(codec, profile, constraint, level)); uint32_t width = aType.ExtendedType().GetWidth().refOr(1280); uint32_t height = aType.ExtendedType().GetHeight().refOr(720); trackInfo->GetAsVideoInfo()->mExtraData = H264::CreateExtraData(profile, constraint, level, { width, height }); tracks.AppendElement(std::move(trackInfo)); continue; } // Unknown codec aError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, RESULT_DETAIL("Unknown codec:%s", NS_ConvertUTF16toUTF8(codec).get())); } return tracks; }
NS_IMETHODIMP nsCharsetConverterManager::GetCharsetDetectorList(nsIUTF8StringEnumerator** aResult) { return GetList(NS_LITERAL_CSTRING("charset-detectors"), NS_LITERAL_CSTRING("chardet."), aResult); }
nsresult StartupCache::Init() { // workaround for bug 653936 nsCOMPtr<nsIProtocolHandler> jarInitializer(do_GetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "jar")); nsresult rv; mTable.Init(); #ifdef DEBUG mWriteObjectMap.Init(); #endif // This allows to override the startup cache filename // which is useful from xpcshell, when there is no ProfLDS directory to keep cache in. char *env = PR_GetEnv("MOZ_STARTUP_CACHE"); if (env) { rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(env), false, getter_AddRefs(mFile)); } else { nsCOMPtr<nsIFile> file; rv = NS_GetSpecialDirectory("ProfLDS", getter_AddRefs(file)); if (NS_FAILED(rv)) { // return silently, this will fail in mochitests's xpcshell process. return rv; } rv = file->AppendNative(NS_LITERAL_CSTRING("startupCache")); NS_ENSURE_SUCCESS(rv, rv); // Try to create the directory if it's not there yet rv = file->Create(nsIFile::DIRECTORY_TYPE, 0777); if (NS_FAILED(rv) && rv != NS_ERROR_FILE_ALREADY_EXISTS) return rv; rv = file->AppendNative(NS_LITERAL_CSTRING(sStartupCacheName)); NS_ENSURE_SUCCESS(rv, rv); mFile = do_QueryInterface(file); } NS_ENSURE_TRUE(mFile, NS_ERROR_UNEXPECTED); mObserverService = do_GetService("@mozilla.org/observer-service;1"); if (!mObserverService) { NS_WARNING("Could not get observerService."); return NS_ERROR_UNEXPECTED; } mListener = new StartupCacheListener(); rv = mObserverService->AddObserver(mListener, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); NS_ENSURE_SUCCESS(rv, rv); rv = mObserverService->AddObserver(mListener, "startupcache-invalidate", false); NS_ENSURE_SUCCESS(rv, rv); rv = LoadArchive(RECORD_AGE); // Sometimes we don't have a cache yet, that's ok. // If it's corrupted, just remove it and start over. if (NS_FAILED(rv) && rv != NS_ERROR_FILE_NOT_FOUND) { NS_WARNING("Failed to load startupcache file correctly, removing!"); InvalidateCache(); } mMappingMemoryReporter = new NS_MEMORY_REPORTER_NAME(StartupCacheMapping); mDataMemoryReporter = new NS_MEMORY_REPORTER_NAME(StartupCacheData); (void)::NS_RegisterMemoryReporter(mMappingMemoryReporter); (void)::NS_RegisterMemoryReporter(mDataMemoryReporter); return NS_OK; }
void ThebesLayerD3D10::Validate(ReadbackProcessor *aReadback) { if (mVisibleRegion.IsEmpty()) { return; } nsIntRect newTextureRect = mVisibleRegion.GetBounds(); SurfaceMode mode = GetSurfaceMode(); if (mode == SURFACE_COMPONENT_ALPHA && (!mParent || !mParent->SupportsComponentAlphaChildren())) { mode = SURFACE_SINGLE_CHANNEL_ALPHA; } // If we have a transform that requires resampling of our texture, then // we need to make sure we don't sample pixels that haven't been drawn. // We clamp sample coordinates to the texture rect, but when the visible region // doesn't fill the entire texture rect we need to make sure we draw all the // pixels in the texture rect anyway in case they get sampled. nsIntRegion neededRegion = mVisibleRegion; if (!neededRegion.GetBounds().IsEqualInterior(newTextureRect) || neededRegion.GetNumRects() > 1) { gfxMatrix transform2d; if (!GetEffectiveTransform().Is2D(&transform2d) || transform2d.HasNonIntegerTranslation()) { neededRegion = newTextureRect; if (mode == SURFACE_OPAQUE) { // We're going to paint outside the visible region, but layout hasn't // promised that it will paint opaquely there, so we'll have to // treat this layer as transparent. mode = SURFACE_SINGLE_CHANNEL_ALPHA; } } } mCurrentSurfaceMode = mode; VerifyContentType(mode); nsTArray<ReadbackProcessor::Update> readbackUpdates; nsIntRegion readbackRegion; if (aReadback && UsedForReadback()) { aReadback->GetThebesLayerUpdates(this, &readbackUpdates, &readbackRegion); } if (mTexture) { if (!mTextureRect.IsEqualInterior(newTextureRect)) { nsRefPtr<ID3D10Texture2D> oldTexture = mTexture; mTexture = nullptr; nsRefPtr<ID3D10Texture2D> oldTextureOnWhite = mTextureOnWhite; mTextureOnWhite = nullptr; nsIntRegion retainRegion = mTextureRect; // Old visible region will become the region that is covered by both the // old and the new visible region. retainRegion.And(retainRegion, mVisibleRegion); // No point in retaining parts which were not valid. retainRegion.And(retainRegion, mValidRegion); CreateNewTextures(gfxIntSize(newTextureRect.width, newTextureRect.height), mode); nsIntRect largeRect = retainRegion.GetLargestRectangle(); // If we had no hardware texture before, or have no retained area larger than // the retention threshold, we're not retaining and are done here. // If our texture creation failed this can mean a device reset is pending // and we should silently ignore the failure. In the future when device // failures are properly handled we should test for the type of failure // and gracefully handle different failures. See bug 569081. if (!oldTexture || !mTexture || largeRect.width * largeRect.height < RETENTION_THRESHOLD) { mValidRegion.SetEmpty(); } else { CopyRegion(oldTexture, mTextureRect.TopLeft(), mTexture, newTextureRect.TopLeft(), retainRegion, &mValidRegion); if (oldTextureOnWhite) { CopyRegion(oldTextureOnWhite, mTextureRect.TopLeft(), mTextureOnWhite, newTextureRect.TopLeft(), retainRegion, &mValidRegion); } } } } mTextureRect = newTextureRect; if (!mTexture || (mode == SURFACE_COMPONENT_ALPHA && !mTextureOnWhite)) { CreateNewTextures(gfxIntSize(newTextureRect.width, newTextureRect.height), mode); mValidRegion.SetEmpty(); } nsIntRegion drawRegion; drawRegion.Sub(neededRegion, mValidRegion); if (!drawRegion.IsEmpty()) { LayerManagerD3D10::CallbackInfo cbInfo = mD3DManager->GetCallbackInfo(); if (!cbInfo.Callback) { NS_ERROR("D3D10 should never need to update ThebesLayers in an empty transaction"); return; } DrawRegion(drawRegion, mode); if (readbackUpdates.Length() > 0) { CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, newTextureRect.width, newTextureRect.height, 1, 1, 0, D3D10_USAGE_STAGING, D3D10_CPU_ACCESS_READ); nsRefPtr<ID3D10Texture2D> readbackTexture; HRESULT hr = device()->CreateTexture2D(&desc, NULL, getter_AddRefs(readbackTexture)); if (FAILED(hr)) { LayerManagerD3D10::ReportFailure(NS_LITERAL_CSTRING("ThebesLayerD3D10::Validate(): Failed to create texture"), hr); return; } device()->CopyResource(readbackTexture, mTexture); for (uint32_t i = 0; i < readbackUpdates.Length(); i++) { mD3DManager->readbackManager()->PostTask(readbackTexture, &readbackUpdates[i], gfxPoint(newTextureRect.x, newTextureRect.y)); } } mValidRegion = neededRegion; } }
NS_IMETHODIMP nsPop3Sink::IncorporateBegin(const char* uidlString, nsIURI* aURL, uint32_t flags, void** closure) { #ifdef DEBUG printf("Incorporate message begin:\n"); if (uidlString) printf("uidl string: %s\n", uidlString); #endif nsCOMPtr<nsIFile> path; m_folder->GetFilePath(getter_AddRefs(path)); nsresult rv; nsCOMPtr<nsIPrefBranch> pPrefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (pPrefBranch) { nsCOMPtr<nsIMsgIncomingServer> server; m_folder->GetServer(getter_AddRefs(server)); nsCString plugStoreContract; server->GetCharValue("storeContractID", plugStoreContract); // Maildir doesn't care about quaranting, but other stores besides berkeley // mailbox might. We should probably make this an attribute on the pluggable // store, though. if (plugStoreContract.Equals( NS_LITERAL_CSTRING("@mozilla.org/msgstore/berkeleystore;1"))) pPrefBranch->GetBoolPref("mailnews.downloadToTempFile", &m_downloadingToTempFile); } nsCOMPtr<nsIMsgDBHdr> newHdr; nsCOMPtr<nsIMsgIncomingServer> server = do_QueryInterface(m_popServer); if (!server) return NS_ERROR_UNEXPECTED; if (m_downloadingToTempFile) { // need to create an nsIOFileStream from a temp file... nsCOMPtr<nsIFile> tmpDownloadFile; rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "newmsg", getter_AddRefs(tmpDownloadFile)); NS_ASSERTION(NS_SUCCEEDED(rv), "writing tmp pop3 download file: failed to append filename"); if (NS_FAILED(rv)) return rv; if (!m_tmpDownloadFile) { //need a unique tmp file to prevent dataloss in multiuser environment rv = tmpDownloadFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); NS_ENSURE_SUCCESS(rv, rv); m_tmpDownloadFile = do_QueryInterface(tmpDownloadFile, &rv); } if (NS_SUCCEEDED(rv)) { rv = MsgGetFileStream(m_tmpDownloadFile, getter_AddRefs(m_outFileStream)); NS_ENSURE_SUCCESS(rv, rv); } } else { rv = server->GetMsgStore(getter_AddRefs(m_msgStore)); bool reusable; NS_ENSURE_SUCCESS(rv, rv); m_msgStore->GetNewMsgOutputStream(m_folder, getter_AddRefs(newHdr), &reusable, getter_AddRefs(m_outFileStream)); } // The following (!m_outFileStream etc) was added to make sure that we don't // write somewhere where for some reason or another we can't write to and // lose the messages. See bug 62480 if (!m_outFileStream) return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsISeekableStream> seekableOutStream = do_QueryInterface(m_outFileStream); // create a new mail parser if (!m_newMailParser) m_newMailParser = new nsParseNewMailState; NS_ENSURE_TRUE(m_newMailParser, NS_ERROR_OUT_OF_MEMORY); if (m_uidlDownload) m_newMailParser->DisableFilters(); nsCOMPtr <nsIMsgFolder> serverFolder; rv = GetServerFolder(getter_AddRefs(serverFolder)); if (NS_FAILED(rv)) return rv; rv = m_newMailParser->Init(serverFolder, m_folder, m_window, newHdr, m_outFileStream); // If we failed to initialize the parser, then just don't use it!!! // We can still continue without one. if (NS_FAILED(rv)) { m_newMailParser = nullptr; rv = NS_OK; } if (closure) *closure = (void*) this; nsCString outputString(GetDummyEnvelope()); rv = WriteLineToMailbox(outputString); NS_ENSURE_SUCCESS(rv, rv); // Write out account-key before UIDL so the code that looks for // UIDL will find the account first and know it can stop looking // once it finds the UIDL line. if (!m_accountKey.IsEmpty()) { outputString.AssignLiteral(HEADER_X_MOZILLA_ACCOUNT_KEY ": "); outputString.Append(m_accountKey); outputString.AppendLiteral(MSG_LINEBREAK); rv = WriteLineToMailbox(outputString); NS_ENSURE_SUCCESS(rv, rv); } if (uidlString) { outputString.AssignLiteral("X-UIDL: "); outputString.Append(uidlString); outputString.AppendLiteral(MSG_LINEBREAK); rv = WriteLineToMailbox(outputString); NS_ENSURE_SUCCESS(rv, rv); } // WriteLineToMailbox("X-Mozilla-Status: 8000" MSG_LINEBREAK); char *statusLine = PR_smprintf(X_MOZILLA_STATUS_FORMAT MSG_LINEBREAK, flags); outputString.Assign(statusLine); rv = WriteLineToMailbox(outputString); PR_smprintf_free(statusLine); NS_ENSURE_SUCCESS(rv, rv); rv = WriteLineToMailbox(NS_LITERAL_CSTRING("X-Mozilla-Status2: 00000000" MSG_LINEBREAK)); NS_ENSURE_SUCCESS(rv, rv); // leave space for 60 bytes worth of keys/tags rv = WriteLineToMailbox(NS_LITERAL_CSTRING(X_MOZILLA_KEYWORDS)); return NS_OK; }
NS_IMETHODIMP nsPop3Sink::IncorporateComplete(nsIMsgWindow *aMsgWindow, int32_t aSize) { if (m_buildMessageUri && !m_baseMessageUri.IsEmpty() && m_newMailParser && m_newMailParser->m_newMsgHdr) { nsMsgKey msgKey; m_newMailParser->m_newMsgHdr->GetMessageKey(&msgKey); m_messageUri.Truncate(); nsBuildLocalMessageURI(m_baseMessageUri.get(), msgKey, m_messageUri); } nsresult rv = WriteLineToMailbox(NS_LITERAL_CSTRING(MSG_LINEBREAK)); NS_ENSURE_SUCCESS(rv, rv); bool leaveOnServer = false; m_popServer->GetLeaveMessagesOnServer(&leaveOnServer); // We need to flush the output stream, in case mail filters move // the new message, which relies on all the data being flushed. rv = m_outFileStream->Flush(); // Make sure the message is written to the disk NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(m_newMailParser, "could not get m_newMailParser"); if (m_newMailParser) { // PublishMsgHdr clears m_newMsgHdr, so we need a comptr to // hold onto it. nsCOMPtr<nsIMsgDBHdr> hdr = m_newMailParser->m_newMsgHdr; NS_ASSERTION(hdr, "m_newMailParser->m_newMsgHdr wasn't set"); if (!hdr) return NS_ERROR_FAILURE; nsCOMPtr<nsIMsgLocalMailFolder> localFolder = do_QueryInterface(m_folder); bool doSelect = false; // aSize is only set for partial messages. For full messages, // check to see if we're replacing an old partial message. if (!aSize && localFolder) (void) localFolder->DeleteDownloadMsg(hdr, &doSelect); // If a header already exists for this message (for example, when // getting a complete message when a partial exists), then update the new // header from the old. if (!m_origMessageUri.IsEmpty() && localFolder) { nsCOMPtr <nsIMsgDBHdr> oldMsgHdr; rv = GetMsgDBHdrFromURI(m_origMessageUri.get(), getter_AddRefs(oldMsgHdr)); if (NS_SUCCEEDED(rv) && oldMsgHdr) localFolder->UpdateNewMsgHdr(oldMsgHdr, hdr); } if (m_downloadingToTempFile) { // close file to give virus checkers a chance to do their thing... m_outFileStream->Flush(); m_outFileStream->Close(); m_newMailParser->FinishHeader(); // need to re-open the inbox file stream. bool exists; m_tmpDownloadFile->Exists(&exists); if (!exists) return HandleTempDownloadFailed(aMsgWindow); nsCOMPtr <nsIInputStream> inboxInputStream = do_QueryInterface(m_outFileStream); rv = MsgReopenFileStream(m_tmpDownloadFile, inboxInputStream); NS_ENSURE_SUCCESS(rv, HandleTempDownloadFailed(aMsgWindow)); if (m_outFileStream) { int64_t tmpDownloadFileSize; uint32_t msgSize; hdr->GetMessageSize(&msgSize); // we need to clone because nsLocalFileUnix caches its stat result, // so it doesn't realize the file has changed size. nsCOMPtr <nsIFile> tmpClone; rv = m_tmpDownloadFile->Clone(getter_AddRefs(tmpClone)); NS_ENSURE_SUCCESS(rv, rv); tmpClone->GetFileSize(&tmpDownloadFileSize); if (msgSize > tmpDownloadFileSize) rv = NS_MSG_ERROR_WRITING_MAIL_FOLDER; else rv = m_newMailParser->AppendMsgFromStream(inboxInputStream, hdr, msgSize, m_folder); if (NS_FAILED(rv)) return HandleTempDownloadFailed(aMsgWindow); m_outFileStream->Close(); // close so we can truncate. m_tmpDownloadFile->SetFileSize(0); } else { return HandleTempDownloadFailed(aMsgWindow); // need to give an error here. } } else { m_msgStore->FinishNewMessage(m_outFileStream, hdr); } m_newMailParser->PublishMsgHeader(aMsgWindow); // run any reply/forward filter after we've finished with the // temp quarantine file, and/or moved the message to another folder. m_newMailParser->ApplyForwardAndReplyFilter(aMsgWindow); if (aSize) hdr->SetUint32Property("onlineSize", aSize); // if DeleteDownloadMsg requested it, select the new message else if (doSelect) (void) localFolder->SelectDownloadMsg(); } #ifdef DEBUG printf("Incorporate message complete.\n"); #endif nsCOMPtr<nsIPop3Service> pop3Service(do_GetService(NS_POP3SERVICE_CONTRACTID1, &rv)); NS_ENSURE_SUCCESS(rv, rv); pop3Service->NotifyDownloadProgress(m_folder, ++m_numMsgsDownloaded, m_numNewMessages); return NS_OK; }
nsresult nsPluginStreamListenerPeer::SetUpStreamListener(nsIRequest* request, nsIURI* aURL) { nsresult rv = NS_OK; // If we don't yet have a stream listener, we need to get // one from the plugin. // NOTE: this should only happen when a stream was NOT created // with GetURL or PostURL (i.e. it's the initial stream we // send to the plugin as determined by the SRC or DATA attribute) if (!mPStreamListener) { if (!mPluginInstance) { return NS_ERROR_FAILURE; } RefPtr<nsNPAPIPluginStreamListener> streamListener; rv = mPluginInstance->NewStreamListener(nullptr, nullptr, getter_AddRefs(streamListener)); if (NS_FAILED(rv) || !streamListener) { return NS_ERROR_FAILURE; } mPStreamListener = static_cast<nsNPAPIPluginStreamListener*>(streamListener.get()); } mPStreamListener->SetStreamListenerPeer(this); // get httpChannel to retrieve some info we need for nsIPluginStreamInfo setup nsCOMPtr<nsIChannel> channel = do_QueryInterface(request); nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel); /* * Assumption * By the time nsPluginStreamListenerPeer::OnDataAvailable() gets * called, all the headers have been read. */ if (httpChannel) { // Reassemble the HTTP response status line and provide it to our // listener. Would be nice if we could get the raw status line, // but nsIHttpChannel doesn't currently provide that. // Status code: required; the status line isn't useful without it. uint32_t statusNum; if (NS_SUCCEEDED(httpChannel->GetResponseStatus(&statusNum)) && statusNum < 1000) { // HTTP version: provide if available. Defaults to empty string. nsCString ver; nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal = do_QueryInterface(channel); if (httpChannelInternal) { uint32_t major, minor; if (NS_SUCCEEDED( httpChannelInternal->GetResponseVersion(&major, &minor))) { ver = nsPrintfCString("/%" PRIu32 ".%" PRIu32, major, minor); } } // Status text: provide if available. Defaults to "OK". nsCString statusText; if (NS_FAILED(httpChannel->GetResponseStatusText(statusText))) { statusText = "OK"; } // Assemble everything and pass to listener. nsPrintfCString status("HTTP%s %" PRIu32 " %s", ver.get(), statusNum, statusText.get()); static_cast<nsIHTTPHeaderListener*>(mPStreamListener) ->StatusLine(status.get()); } // Also provide all HTTP response headers to our listener. rv = httpChannel->VisitResponseHeaders(this); MOZ_ASSERT(NS_SUCCEEDED(rv)); // we require a content len // get Last-Modified header for plugin info nsAutoCString lastModified; if (NS_SUCCEEDED(httpChannel->GetResponseHeader( NS_LITERAL_CSTRING("last-modified"), lastModified)) && !lastModified.IsEmpty()) { PRTime time64; PR_ParseTimeString(lastModified.get(), true, &time64); // convert string time to integer time // Convert PRTime to unix-style time_t, i.e. seconds since the epoch double fpTime = double(time64); mModified = (uint32_t)(fpTime * 1e-6 + 0.5); } } MOZ_ASSERT(!mRequest); mRequest = request; rv = mPStreamListener->OnStartBinding(this); mStartBinding = true; if (NS_FAILED(rv)) return rv; return NS_OK; }
nsresult nsXBLProtoImplProperty::CompileMember(nsIScriptContext* aContext, const nsCString& aClassStr, void* aClassObject) { NS_PRECONDITION(!mIsCompiled, "Trying to compile an already-compiled property"); NS_PRECONDITION(aClassObject, "Must have class object to compile"); if (!mName) return NS_ERROR_FAILURE; // Without a valid name, we can't install the member. // We have a property. nsresult rv = NS_OK; nsCAutoString functionUri; if (mGetterText || mSetterText) { functionUri = aClassStr; PRInt32 hash = functionUri.RFindChar('#'); if (hash != kNotFound) { functionUri.Truncate(hash); } } bool deletedGetter = false; if (mGetterText && mGetterText->GetText()) { nsDependentString getter(mGetterText->GetText()); if (!getter.IsEmpty()) { // Compile into a temp object so we don't wipe out mGetterText JSObject* getterObject = nsnull; rv = aContext->CompileFunction(aClassObject, NS_LITERAL_CSTRING("get_") + NS_ConvertUTF16toUTF8(mName), 0, nsnull, getter, functionUri.get(), mGetterText->GetLineNumber(), JSVERSION_LATEST, true, (void **) &getterObject); // Make sure we free mGetterText here before setting mJSGetterObject, since // that'll overwrite mGetterText delete mGetterText; deletedGetter = true; mJSGetterObject = getterObject; if (mJSGetterObject && NS_SUCCEEDED(rv)) { mJSAttributes |= JSPROP_GETTER | JSPROP_SHARED; } if (NS_FAILED(rv)) { mJSGetterObject = nsnull; mJSAttributes &= ~JSPROP_GETTER; /*chaining to return failure*/ } } } // if getter is not empty if (!deletedGetter) { // Empty getter delete mGetterText; mJSGetterObject = nsnull; } if (NS_FAILED(rv)) { // We failed to compile our getter. So either we've set it to null, or // it's still set to the text object. In either case, it's safe to return // the error here, since then we'll be cleaned up as uncompiled and that // will be ok. Going on and compiling the setter and _then_ returning an // error, on the other hand, will try to clean up a compiled setter as // uncompiled and crash. return rv; } bool deletedSetter = false; if (mSetterText && mSetterText->GetText()) { nsDependentString setter(mSetterText->GetText()); if (!setter.IsEmpty()) { // Compile into a temp object so we don't wipe out mSetterText JSObject* setterObject = nsnull; rv = aContext->CompileFunction(aClassObject, NS_LITERAL_CSTRING("set_") + NS_ConvertUTF16toUTF8(mName), 1, gPropertyArgs, setter, functionUri.get(), mSetterText->GetLineNumber(), JSVERSION_LATEST, true, (void **) &setterObject); // Make sure we free mSetterText here before setting mJSGetterObject, since // that'll overwrite mSetterText delete mSetterText; deletedSetter = true; mJSSetterObject = setterObject; if (mJSSetterObject && NS_SUCCEEDED(rv)) { mJSAttributes |= JSPROP_SETTER | JSPROP_SHARED; } if (NS_FAILED(rv)) { mJSSetterObject = nsnull; mJSAttributes &= ~JSPROP_SETTER; /*chaining to return failure*/ } } } // if setter wasn't empty.... if (!deletedSetter) { // Empty setter delete mSetterText; mJSSetterObject = nsnull; } #ifdef DEBUG mIsCompiled = NS_SUCCEEDED(rv); #endif return rv; }
/* static */ bool MP4Decoder::CanHandleMediaType(const nsACString& aMIMETypeExcludingCodecs, const nsAString& aCodecs) { if (!IsEnabled()) { return false; } // Whitelist MP4 types, so they explicitly match what we encounter on // the web, as opposed to what we use internally (i.e. what our demuxers // etc output). const bool isMP4Audio = aMIMETypeExcludingCodecs.EqualsASCII("audio/mp4") || aMIMETypeExcludingCodecs.EqualsASCII("audio/x-m4a"); const bool isMP4Video = aMIMETypeExcludingCodecs.EqualsASCII("video/mp4") || aMIMETypeExcludingCodecs.EqualsASCII("video/x-m4v"); if (!isMP4Audio && !isMP4Video) { return false; } #ifdef MOZ_GONK_MEDIACODEC if (aMIMETypeExcludingCodecs.EqualsASCII(VIDEO_3GPP)) { return Preferences::GetBool("media.fragmented-mp4.gonk.enabled", false); } #endif nsTArray<nsCString> codecMimes; if (aCodecs.IsEmpty()) { // No codecs specified. Assume AAC/H.264 if (isMP4Audio) { codecMimes.AppendElement(NS_LITERAL_CSTRING("audio/mp4a-latm")); } else { MOZ_ASSERT(isMP4Video); codecMimes.AppendElement(NS_LITERAL_CSTRING("video/avc")); } } else { // Verify that all the codecs specified are ones that we expect that // we can play. nsTArray<nsString> codecs; if (!ParseCodecsString(aCodecs, codecs)) { return false; } for (const nsString& codec : codecs) { if (IsAACCodecString(codec)) { codecMimes.AppendElement(NS_LITERAL_CSTRING("audio/mp4a-latm")); continue; } if (codec.EqualsLiteral("mp3")) { codecMimes.AppendElement(NS_LITERAL_CSTRING("audio/mpeg")); continue; } // Note: Only accept H.264 in a video content type, not in an audio // content type. if (IsWhitelistedH264Codec(codec) && isMP4Video) { codecMimes.AppendElement(NS_LITERAL_CSTRING("video/avc")); continue; } // Some unsupported codec. return false; } } // Verify that we have a PDM that supports the whitelisted types. PDMFactory::Init(); nsRefPtr<PDMFactory> platform = new PDMFactory(); for (const nsCString& codecMime : codecMimes) { if (!platform->SupportsMimeType(codecMime)) { return false; } } return true; }
nsresult nsXULPrototypeCache::StartFastLoad(nsIURI* aURI) { nsresult rv; nsCAutoString path; aURI->GetPath(path); if (!StringEndsWith(path, NS_LITERAL_CSTRING(".xul"))) return NS_ERROR_NOT_AVAILABLE; // Test gFastLoadFile to decide whether this is the first nsXULDocument // participating in FastLoad. If gFastLoadFile is non-null, this document // must not be first, but it can join the FastLoad process. Examples of // multiple master documents participating include hiddenWindow.xul and // navigator.xul on the Mac, and multiple-app-component (e.g., mailnews // and browser) startup due to command-line arguments. // // XXXbe we should attempt to update the FastLoad file after startup! // // XXXbe we do not yet use nsFastLoadPtrs, but once we do, we must keep // the FastLoad input stream open for the life of the app. if (gFastLoadService && gFastLoadFile) { mFastLoadURITable.Put(aURI, 1); return NS_OK; } // Use a local to refer to the service till we're sure we succeeded, then // commit to gFastLoadService. Same for gFastLoadFile, which is used to // delete the FastLoad file on abort. nsCOMPtr<nsIFastLoadService> fastLoadService(do_GetFastLoadService()); if (! fastLoadService) return NS_ERROR_FAILURE; gDisableXULFastLoad = nsContentUtils::GetBoolPref(kDisableXULFastLoadPref, gDisableXULFastLoad); gChecksumXULFastLoadFile = nsContentUtils::GetBoolPref(kChecksumXULFastLoadFilePref, gChecksumXULFastLoadFile); nsContentUtils::RegisterPrefCallback(kDisableXULFastLoadPref, FastLoadPrefChangedCallback, nsnull); nsContentUtils::RegisterPrefCallback(kChecksumXULFastLoadFilePref, FastLoadPrefChangedCallback, nsnull); if (gDisableXULFastLoad) return NS_ERROR_NOT_AVAILABLE; // Get the chrome directory to validate against the one stored in the // FastLoad file, or to store there if we're generating a new file. nsCOMPtr<nsIFile> chromeDir; rv = NS_GetSpecialDirectory(NS_APP_CHROME_DIR, getter_AddRefs(chromeDir)); if (NS_FAILED(rv)) return rv; nsCAutoString chromePath; rv = chromeDir->GetNativePath(chromePath); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIFile> file; rv = fastLoadService->NewFastLoadFile(XUL_FASTLOAD_FILE_BASENAME, getter_AddRefs(file)); if (NS_FAILED(rv)) return rv; // Give the FastLoad service an object by which it can get or create a // file output stream given an input stream on the same file. nsXULFastLoadFileIO* xio = new nsXULFastLoadFileIO(file); nsCOMPtr<nsIFastLoadFileIO> io = static_cast<nsIFastLoadFileIO*>(xio); if (! io) return NS_ERROR_OUT_OF_MEMORY; fastLoadService->SetFileIO(io); nsCOMPtr<nsIXULChromeRegistry> chromeReg(do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv)); if (NS_FAILED(rv)) return rv; // XXXbe we assume the first package's locale is the same as the locale of // all subsequent packages of FastLoaded chrome URIs.... nsCAutoString package; rv = aURI->GetHost(package); if (NS_FAILED(rv)) return rv; nsCAutoString locale; rv = chromeReg->GetSelectedLocale(package, locale); if (NS_FAILED(rv)) return rv; // Try to read an existent FastLoad file. PRBool exists = PR_FALSE; if (NS_SUCCEEDED(file->Exists(&exists)) && exists) { nsCOMPtr<nsIObjectInputStream> objectInput; rv = fastLoadService->NewInputStream(file, getter_AddRefs(objectInput)); if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) { // Get the XUL fastload file version number, which should be // decremented whenever the XUL-specific file format changes // (see public/nsIXULPrototypeCache.h for the #define). PRUint32 xulFastLoadVersion, jsByteCodeVersion; rv = objectInput->Read32(&xulFastLoadVersion); rv |= objectInput->Read32(&jsByteCodeVersion); if (NS_SUCCEEDED(rv)) { if (xulFastLoadVersion != XUL_FASTLOAD_FILE_VERSION || jsByteCodeVersion != JSXDR_BYTECODE_VERSION) { #ifdef DEBUG printf((xulFastLoadVersion != XUL_FASTLOAD_FILE_VERSION) ? "bad FastLoad file version\n" : "bad JS bytecode version\n"); #endif rv = NS_ERROR_UNEXPECTED; } else { nsCAutoString fileChromePath, fileLocale; rv = objectInput->ReadCString(fileChromePath); rv |= objectInput->ReadCString(fileLocale); if (NS_SUCCEEDED(rv) && (!fileChromePath.Equals(chromePath) || !fileLocale.Equals(locale))) { rv = NS_ERROR_UNEXPECTED; } } } } } if (NS_SUCCEEDED(rv)) { fastLoadService->SetInputStream(objectInput); } else { // NB: we must close before attempting to remove, for non-Unix OSes // that can't do open-unlink. if (objectInput) objectInput->Close(); xio->mInputStream = nsnull; #ifdef DEBUG file->MoveToNative(nsnull, NS_LITERAL_CSTRING("Invalid.mfasl")); #else file->Remove(PR_FALSE); #endif exists = PR_FALSE; } } // FastLoad file not found, or invalid: write a new one. if (! exists) { nsCOMPtr<nsIOutputStream> output; rv = io->GetOutputStream(getter_AddRefs(output)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIObjectOutputStream> objectOutput; rv = fastLoadService->NewOutputStream(output, getter_AddRefs(objectOutput)); if (NS_SUCCEEDED(rv)) { rv = objectOutput->Write32(XUL_FASTLOAD_FILE_VERSION); rv |= objectOutput->Write32(JSXDR_BYTECODE_VERSION); rv |= objectOutput->WriteStringZ(chromePath.get()); rv |= objectOutput->WriteStringZ(locale.get()); } // Remove here even though some errors above will lead to a FastLoad // file invalidation. Other errors (failure to note the dependency on // installed-chrome.txt, e.g.) will not cause invalidation, and we may // as well tidy up now. if (NS_FAILED(rv)) { if (objectOutput) objectOutput->Close(); else output->Close(); xio->mOutputStream = nsnull; file->Remove(PR_FALSE); return NS_ERROR_FAILURE; } fastLoadService->SetOutputStream(objectOutput); } // Success! Insert this URI into the mFastLoadURITable // and commit locals to globals. mFastLoadURITable.Put(aURI, 1); NS_ADDREF(gFastLoadService = fastLoadService); NS_ADDREF(gFastLoadFile = file); return NS_OK; }
NS_IMETHODIMP nsCharsetConverterManager::GetEncoderList(nsIUTF8StringEnumerator ** aResult) { return GetList(NS_LITERAL_CSTRING(NS_UNICODEENCODER_NAME), EmptyCString(), aResult); }
static nsresult InitOperators(void) { // Load the property file containing the Operator Dictionary nsresult rv; nsCOMPtr<nsIPersistentProperties> mathfontProp; rv = NS_LoadPersistentPropertiesFromURISpec(getter_AddRefs(mathfontProp), NS_LITERAL_CSTRING("resource://gre/res/fonts/mathfont.properties")); if (NS_FAILED(rv)) return rv; // Get the list of invariant chars for (int32_t i = 0; i < eMATHVARIANT_COUNT; ++i) { nsAutoCString key(NS_LITERAL_CSTRING("mathvariant.")); key.Append(kMathVariant_name[i]); nsAutoString value; mathfontProp->GetStringProperty(key, value); gInvariantCharArray->AppendElement(value); // i.e., gInvariantCharArray[i] holds this list } // Parse the Operator Dictionary in two passes. // The first pass is to count the number of operators; the second pass is to // allocate the necessary space for them and to add them in the hash table. for (int32_t pass = 1; pass <= 2; pass++) { OperatorData dummyData; OperatorData* operatorData = &dummyData; nsCOMPtr<nsISimpleEnumerator> iterator; if (NS_SUCCEEDED(mathfontProp->Enumerate(getter_AddRefs(iterator)))) { bool more; uint32_t index = 0; nsAutoCString name; nsAutoString attributes; while ((NS_SUCCEEDED(iterator->HasMoreElements(&more))) && more) { nsCOMPtr<nsIPropertyElement> element; if (NS_SUCCEEDED(iterator->GetNext(getter_AddRefs(element)))) { if (NS_SUCCEEDED(element->GetKey(name)) && NS_SUCCEEDED(element->GetValue(attributes))) { // expected key: operator.\uNNNN.{infix,postfix,prefix} if ((21 <= name.Length()) && (0 == name.Find("operator.\\u"))) { name.Cut(0, 9); // 9 is the length of "operator."; int32_t len = name.Length(); nsOperatorFlags form = 0; if (kNotFound != name.RFind(".infix")) { form = NS_MATHML_OPERATOR_FORM_INFIX; len -= 6; // 6 is the length of ".infix"; } else if (kNotFound != name.RFind(".postfix")) { form = NS_MATHML_OPERATOR_FORM_POSTFIX; len -= 8; // 8 is the length of ".postfix"; } else if (kNotFound != name.RFind(".prefix")) { form = NS_MATHML_OPERATOR_FORM_PREFIX; len -= 7; // 7 is the length of ".prefix"; } else continue; // input is not applicable name.SetLength(len); if (2 == pass) { // allocate space and start the storage if (!gOperatorArray) { if (0 == gOperatorCount) return NS_ERROR_UNEXPECTED; gOperatorArray = new OperatorData[gOperatorCount]; if (!gOperatorArray) return NS_ERROR_OUT_OF_MEMORY; } operatorData = &gOperatorArray[index]; } else { form = 0; // to quickly return from SetOperator() at pass 1 } // See if the operator should be retained if (SetOperator(operatorData, form, name, attributes)) { index++; if (1 == pass) gOperatorCount = index; } } } } } } } return NS_OK; }
nsresult nsDOMStorageDBWrapper::CreateScopeDBKey(nsIPrincipal* aPrincipal, nsACString& aKey) { nsCOMPtr<nsIURI> uri; nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(uri, NS_ERROR_UNEXPECTED); nsAutoCString domainScope; rv = uri->GetAsciiHost(domainScope); NS_ENSURE_SUCCESS(rv, rv); if (domainScope.IsEmpty()) { // About pages have an empty host but a valid path. Since they are handled // internally by our own redirector, we can trust them and use path as key. // if file:/// protocol, let's make the exact directory the domain bool isScheme = false; if ((NS_SUCCEEDED(uri->SchemeIs("about", &isScheme)) && isScheme) || (NS_SUCCEEDED(uri->SchemeIs("moz-safe-about", &isScheme)) && isScheme)) { rv = uri->GetPath(domainScope); NS_ENSURE_SUCCESS(rv, rv); // While the host is always canonicalized to lowercase, the path is not, // thus need to force the casing. ToLowerCase(domainScope); } else if (NS_SUCCEEDED(uri->SchemeIs("file", &isScheme)) && isScheme) { nsCOMPtr<nsIURL> url = do_QueryInterface(uri, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = url->GetDirectory(domainScope); NS_ENSURE_SUCCESS(rv, rv); } } nsAutoCString key; rv = CreateReversedDomain(domainScope, key); NS_ENSURE_SUCCESS(rv, rv); nsAutoCString scheme; rv = uri->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); key.Append(NS_LITERAL_CSTRING(":") + scheme); int32_t port = NS_GetRealPort(uri); if (port != -1) { key.Append(nsPrintfCString(":%d", port)); } uint32_t appId; rv = aPrincipal->GetAppId(&appId); NS_ENSURE_SUCCESS(rv, rv); bool isInBrowserElement; rv = aPrincipal->GetIsInBrowserElement(&isInBrowserElement); NS_ENSURE_SUCCESS(rv, rv); if (appId == nsIScriptSecurityManager::NO_APP_ID && !isInBrowserElement) { aKey.Assign(key); return NS_OK; } aKey.Truncate(); aKey.AppendInt(appId); aKey.Append(NS_LITERAL_CSTRING(":") + (isInBrowserElement ? NS_LITERAL_CSTRING("t") : NS_LITERAL_CSTRING("f")) + NS_LITERAL_CSTRING(":") + key); return NS_OK; }