std::size_t SpectraVisualisation::SignalSamplesPerGrid(void) const { return Document().SamplesPerSecond(); }
void RestyleTracker::DoProcessRestyles() { nsAutoCString docURL; if (profiler_is_active()) { nsIURI *uri = Document()->GetDocumentURI(); if (uri) { uri->GetSpec(docURL); } else { docURL = "N/A"; } } PROFILER_LABEL_PRINTF("RestyleTracker", "ProcessRestyles", js::ProfileEntry::Category::CSS, "(%s)", docURL.get()); nsDocShell* docShell = static_cast<nsDocShell*>(mRestyleManager->PresContext()->GetDocShell()); RefPtr<TimelineConsumers> timelines = TimelineConsumers::Get(); bool isTimelineRecording = timelines && timelines->HasConsumer(docShell); // Create a AnimationsWithDestroyedFrame during restyling process to // stop animations on elements that have no frame at the end of the // restyling process. RestyleManager::AnimationsWithDestroyedFrame animationsWithDestroyedFrame(mRestyleManager); // Create a ReframingStyleContexts struct on the stack and put it in our // mReframingStyleContexts for almost all of the remaining scope of // this function. // // It needs to be *in* scope during BeginProcessingRestyles, which // might (if mDoRebuildAllStyleData is true) do substantial amounts of // restyle processing. // // However, it needs to be *out* of scope during // EndProcessingRestyles, since we should release the style contexts // it holds prior to any EndReconstruct call that // EndProcessingRestyles makes. This is because in EndReconstruct we // try to destroy the old rule tree using the GC mechanism, which // means it only gets destroyed if it's unreferenced (and if it's // referenced, we assert). So we want the ReframingStyleContexts // (which holds old style contexts) to be destroyed before the // EndReconstruct so those style contexts go away before // EndReconstruct. { RestyleManager::ReframingStyleContexts reframingStyleContexts(mRestyleManager); mRestyleManager->BeginProcessingRestyles(*this); LOG_RESTYLE("Processing %d pending %srestyles with %d restyle roots for %s", mPendingRestyles.Count(), mRestyleManager->PresContext()->TransitionManager()-> InAnimationOnlyStyleUpdate() ? (const char*) "animation " : (const char*) "", static_cast<int>(mRestyleRoots.Length()), GetDocumentURI(Document()).get()); LOG_RESTYLE_INDENT(); // loop so that we process any restyle events generated by processing while (mPendingRestyles.Count()) { if (mHaveLaterSiblingRestyles) { // Convert them to individual restyles on all the later siblings nsAutoTArray<RefPtr<Element>, RESTYLE_ARRAY_STACKSIZE> laterSiblingArr; for (auto iter = mPendingRestyles.Iter(); !iter.Done(); iter.Next()) { auto element = static_cast<dom::Element*>(iter.Key()); // Only collect the entries that actually need restyling by us (and // haven't, for example, already been restyled). // It's important to not mess with the flags on entries not in our // document. if (element->GetCrossShadowCurrentDoc() == Document() && element->HasFlag(RestyleBit()) && (iter.Data()->mRestyleHint & eRestyle_LaterSiblings)) { laterSiblingArr.AppendElement(element); } } for (uint32_t i = 0; i < laterSiblingArr.Length(); ++i) { Element* element = laterSiblingArr[i]; for (nsIContent* sibling = element->GetNextSibling(); sibling; sibling = sibling->GetNextSibling()) { if (sibling->IsElement()) { LOG_RESTYLE("adding pending restyle for %s due to " "eRestyle_LaterSiblings hint on %s", FrameTagToString(sibling->AsElement()).get(), FrameTagToString(element->AsElement()).get()); if (AddPendingRestyle(sibling->AsElement(), eRestyle_Subtree, NS_STYLE_HINT_NONE)) { // Nothing else to do here; we'll handle the following // siblings when we get to |sibling| in laterSiblingArr. break; } } } } // Now remove all those eRestyle_LaterSiblings bits for (uint32_t i = 0; i < laterSiblingArr.Length(); ++i) { Element* element = laterSiblingArr[i]; NS_ASSERTION(element->HasFlag(RestyleBit()), "How did that happen?"); RestyleData* data; #ifdef DEBUG bool found = #endif mPendingRestyles.Get(element, &data); NS_ASSERTION(found, "Where did our entry go?"); data->mRestyleHint = nsRestyleHint(data->mRestyleHint & ~eRestyle_LaterSiblings); } LOG_RESTYLE("%d pending restyles after expanding out " "eRestyle_LaterSiblings", mPendingRestyles.Count()); mHaveLaterSiblingRestyles = false; } uint32_t rootCount; while ((rootCount = mRestyleRoots.Length())) { // Make sure to pop the element off our restyle root array, so // that we can freely append to the array as we process this // element. RefPtr<Element> element; element.swap(mRestyleRoots[rootCount - 1]); mRestyleRoots.RemoveElementAt(rootCount - 1); LOG_RESTYLE("processing style root %s at index %d", FrameTagToString(element).get(), rootCount - 1); LOG_RESTYLE_INDENT(); // Do the document check before calling GetRestyleData, since we // don't want to do the sibling-processing GetRestyleData does if // the node is no longer relevant. if (element->GetCrossShadowCurrentDoc() != Document()) { // Content node has been removed from our document; nothing else // to do here LOG_RESTYLE("skipping, no longer in the document"); continue; } nsAutoPtr<RestyleData> data; if (!GetRestyleData(element, data)) { LOG_RESTYLE("skipping, already restyled"); continue; } if (isTimelineRecording) { timelines->AddMarkerForDocShell(docShell, Move( MakeUnique<RestyleTimelineMarker>( data->mRestyleHint, MarkerTracingType::START))); } #if defined(MOZ_ENABLE_PROFILER_SPS) && !defined(MOZILLA_XPCOMRT_API) Maybe<GeckoProfilerTracingRAII> profilerRAII; if (profiler_feature_active("restyle")) { profilerRAII.emplace("Paint", "Styles", Move(data->mBacktrace)); } #endif ProcessOneRestyle(element, data->mRestyleHint, data->mChangeHint, data->mRestyleHintData); AddRestyleRootsIfAwaitingRestyle(data->mDescendants); if (isTimelineRecording) { timelines->AddMarkerForDocShell(docShell, Move( MakeUnique<RestyleTimelineMarker>( data->mRestyleHint, MarkerTracingType::END))); } } if (mHaveLaterSiblingRestyles) { // Keep processing restyles for now continue; } // Now we only have entries with change hints left. To be safe in // case of reentry from the handing of the change hint, use a // scratch array instead of calling out to ProcessOneRestyle while // enumerating the hashtable. Use the stack if we can, otherwise // fall back on heap-allocation. nsAutoTArray<RestyleEnumerateData, RESTYLE_ARRAY_STACKSIZE> restyleArr; RestyleEnumerateData* restylesToProcess = restyleArr.AppendElements(mPendingRestyles.Count()); if (restylesToProcess) { RestyleEnumerateData* restyle = restylesToProcess; #ifdef RESTYLE_LOGGING uint32_t count = 0; #endif for (auto iter = mPendingRestyles.Iter(); !iter.Done(); iter.Next()) { auto element = static_cast<dom::Element*>(iter.Key()); RestyleTracker::RestyleData* data = iter.Data(); // Only collect the entries that actually need restyling by us (and // haven't, for example, already been restyled). // It's important to not mess with the flags on entries not in our // document. if (element->GetCrossShadowCurrentDoc() != Document() || !element->HasFlag(RestyleBit())) { LOG_RESTYLE("skipping pending restyle %s, already restyled or no " "longer in the document", FrameTagToString(element).get()); continue; } NS_ASSERTION( !element->HasFlag(RootBit()) || // Maybe we're just not reachable via the frame tree? (element->GetFlattenedTreeParent() && (!element->GetFlattenedTreeParent()->GetPrimaryFrame() || element->GetFlattenedTreeParent()->GetPrimaryFrame()->IsLeaf() || element->GetCrossShadowCurrentDoc()->GetShell()->FrameManager() ->GetDisplayContentsStyleFor(element))) || // Or not reachable due to an async reinsert we have // pending? If so, we'll have a reframe hint around. // That incidentally makes it safe that we still have // the bit, since any descendants that didn't get added // to the roots list because we had the bits will be // completely restyled in a moment. (data->mChangeHint & nsChangeHint_ReconstructFrame), "Why did this not get handled while processing mRestyleRoots?"); // Unset the restyle bits now, so if they get readded later as we // process we won't clobber that adding of the bit. element->UnsetFlags(RestyleBit() | RootBit() | ConditionalDescendantsBit()); restyle->mElement = element; restyle->mRestyleHint = data->mRestyleHint; restyle->mChangeHint = data->mChangeHint; // We can move data since we'll be clearing mPendingRestyles after // we finish enumerating it. restyle->mRestyleHintData = Move(data->mRestyleHintData); #if defined(MOZ_ENABLE_PROFILER_SPS) && !defined(MOZILLA_XPCOMRT_API) restyle->mBacktrace = Move(data->mBacktrace); #endif #ifdef RESTYLE_LOGGING count++; #endif // Increment to the next slot in the array restyle++; } RestyleEnumerateData* lastRestyle = restyle; // Clear the hashtable now that we don't need it anymore mPendingRestyles.Clear(); #ifdef RESTYLE_LOGGING uint32_t index = 0; #endif for (RestyleEnumerateData* currentRestyle = restylesToProcess; currentRestyle != lastRestyle; ++currentRestyle) { LOG_RESTYLE("processing pending restyle %s at index %d/%d", FrameTagToString(currentRestyle->mElement).get(), index++, count); LOG_RESTYLE_INDENT(); #if defined(MOZ_ENABLE_PROFILER_SPS) && !defined(MOZILLA_XPCOMRT_API) Maybe<GeckoProfilerTracingRAII> profilerRAII; if (profiler_feature_active("restyle")) { profilerRAII.emplace("Paint", "Styles", Move(currentRestyle->mBacktrace)); } #endif if (isTimelineRecording) { timelines->AddMarkerForDocShell(docShell, Move( MakeUnique<RestyleTimelineMarker>( currentRestyle->mRestyleHint, MarkerTracingType::START))); } ProcessOneRestyle(currentRestyle->mElement, currentRestyle->mRestyleHint, currentRestyle->mChangeHint, currentRestyle->mRestyleHintData); if (isTimelineRecording) { timelines->AddMarkerForDocShell(docShell, Move( MakeUnique<RestyleTimelineMarker>( currentRestyle->mRestyleHint, MarkerTracingType::END))); } } } } } // mPendingRestyles is now empty. mHaveSelectors = false; mRestyleManager->EndProcessingRestyles(); }
wxString SpectraVisualisation::Name(void) { return Document().Name(); }
/** * Parses manifest file and checks that files described in manifest exist, also * checks that no extra file do exist that are not described in manifest.xml. * * Note: If non-ascii characters are present in XML data, we depend on the LANG variable to be set properly * (see iconv --list for the list of supported encoding values for libiconv). * * @param path directory on disk of the BDOC container. * @throws IOException exception is thrown if the manifest.xml file parsing failed. * @throws BDocException */ void digidoc::BDoc::parseManifestAndLoadFiles(const std::string &path) throw(IOException, BDocException) { DEBUG("BDoc::readManifest(path = '%s')", path.c_str()); try { // Parse manifest file. std::string fileName = util::File::path(path, "META-INF/manifest.xml"); xml_schema::Properties properties; properties.schema_location(BDocPrivate::MANIFEST_NAMESPACE, Conf::getInstance()->getManifestXsdPath()); std::auto_ptr<manifest::Manifest> manifest(manifest::manifest(fileName, xml_schema::Flags::dont_initialize, properties)); // Extract and validate file list from manifest. std::set<std::string> manifestFiles; bool mimetypeChecked = false; for(manifest::Manifest::File_entrySequence::const_iterator iter = manifest->file_entry().begin(); iter != manifest->file_entry().end(); iter++) { DEBUG("full_path = '%s', media_type = '%s'", iter->full_path().c_str(), iter->media_type().c_str()); // Check container mimetype. if(std::string("/").compare(iter->full_path()) == 0) { if(mimetypeChecked) THROW_BDOCEXCEPTION("Manifest has more than one container media type defined."); if(getMimeType().compare(iter->media_type()) != 0) { THROW_BDOCEXCEPTION("Manifest has incorrect BDCO container media type defined '%s', expecting '%s'.", iter->media_type().c_str(), getMimeType().c_str()); } DEBUG("BDOC mimetype OK"); mimetypeChecked = true; continue; } // Check that file reference is not defined already and add relative file reference to set. if(manifestFiles.find(iter->full_path()) != manifestFiles.end()) THROW_BDOCEXCEPTION("Manifest multiple entries defined for file '%s'.", iter->media_type().c_str()); #ifdef __APPLE__ // Apple decomposes always utf-8 chars on filesystem, make sure that we compare paths with composed form manifestFiles.insert(digidoc::util::File::decodeName(iter->full_path())); #else manifestFiles.insert(iter->full_path()); #endif // Add document to documents list. if(iter->full_path().find_first_of("/") == std::string::npos) { if(!util::File::fileExists(util::File::path(path, iter->full_path()))) { THROW_BDOCEXCEPTION("File described in manifest '%s' does not exist in BDOC container.", iter->full_path().c_str()); } d->documents.push_back(Document(util::File::fileName(iter->full_path()), util::File::path(path, iter->full_path()), iter->media_type())); continue; } // Add signature to signatures list. DEBUG("%s :: %u", iter->full_path().c_str(), iter->full_path().find_first_of("META-INF/")); std::string signatureFileName = (iter->full_path().substr((iter->full_path().find('/'))+1)); if(iter->full_path().find_first_of("META-INF/") == 0) { DEBUG("signature filename :: '%s'", signatureFileName.c_str()); if(signatureFileName.find_first_of("/") != std::string::npos) THROW_BDOCEXCEPTION("Unexpected file described in manifest '%s'.", iter->full_path().c_str()); if(!util::File::fileExists(util::File::path(util::File::path(path, "META-INF"), signatureFileName))) THROW_BDOCEXCEPTION("File described in manifest '%s' does not exist in BDOC container.", iter->full_path().c_str()); std::string signaturePath = util::File::path(util::File::path(path, "META-INF"), signatureFileName); try { if(SignatureBES::MEDIA_TYPE == iter->media_type()) d->signatures.push_back(new SignatureBES(signaturePath, *this)); else if(SignatureTM::MEDIA_TYPE == iter->media_type()) d->signatures.push_back(new SignatureTM(signaturePath, *this)); else THROW_BDOCEXCEPTION("Unknown signature media type '%s'.", iter->media_type().c_str()); } catch(const SignatureException& e) { THROW_BDOCEXCEPTION_CAUSE(e, "Failed to parse signature '%s', type '%s'.", signaturePath.c_str(), iter->media_type().c_str()); } continue; } // Found unexpected file description in manifest. THROW_BDOCEXCEPTION("Unexpected file description found in container manifest."); } if(!mimetypeChecked) THROW_BDOCEXCEPTION("Manifest file does not have BDOC media type described."); // Check that there are no unexpected files in container. std::vector<std::string> containerFiles = util::File::listFiles(path, true, true, true); for(std::vector<std::string>::const_iterator iter = containerFiles.begin(); iter != containerFiles.end(); iter++) { std::string containerFile = *iter; if(std::string("mimetype").compare(containerFile) == 0 || std::string("META-INF/manifest.xml").compare(containerFile) == 0) continue; std::replace(containerFile.begin(), containerFile.end(), '\\', '/'); if(manifestFiles.find(containerFile) == manifestFiles.end()) THROW_BDOCEXCEPTION("File '%s' found in BDOC container is not described in manifest.", containerFile.c_str()); } } catch(const xml_schema::Exception& e) { std::ostringstream oss; oss << e; THROW_IOEXCEPTION("Failed to parse manifest XML: %s", oss.str().c_str()); } }
Value DocumentSourceBsonArray::serialize(bool explain) const { if (explain) { return Value(DOC("bsonArray" << Document())); } return Value(); }
void DocumentSourceCursor::findNext() { unstarted = false; if ( !_cursorWithContext ) { pCurrent = Document(); hasCurrent = false; return; } for( ; cursor()->ok(); cursor()->advance() ) { yieldSometimes(); if ( !cursor()->ok() ) { // The cursor was exhausted during the yield. break; } if ( !cursor()->currentMatches() || cursor()->currentIsDup() ) continue; // grab the matching document if (canUseCoveredIndex()) { // Can't have collection metadata if we are here BSONObj indexKey = cursor()->currKey(); pCurrent = Document(cursor()->c()->keyFieldsOnly()->hydrate(indexKey)); } else { BSONObj next = cursor()->current(); // check to see if this is a new object we don't own yet // because of a chunk migration if (collMetadata()) { KeyPattern kp( collMetadata()->getKeyPattern() ); if ( !collMetadata()->keyBelongsToMe( kp.extractSingleKey( next ) ) ) continue; } if (!_projection) { pCurrent = Document(next); } else { pCurrent = documentFromBsonWithDeps(next, _dependencies); if (debug && !_dependencies.empty()) { // Make sure we behave the same as Projection. Projection doesn't have a // way to specify "no fields needed" so we skip the test in that case. MutableDocument byAggo(pCurrent); MutableDocument byProj(Document(_projection->transform(next))); if (_dependencies["_id"].getType() == Object) { // We handle subfields of _id identically to other fields. // Projection doesn't handle them correctly. byAggo.remove("_id"); byProj.remove("_id"); } if (Document::compare(byAggo.peek(), byProj.peek()) != 0) { PRINT(next); PRINT(_dependencies); PRINT(_projection->getSpec()); PRINT(byAggo.peek()); PRINT(byProj.peek()); verify(false); } } } } hasCurrent = true; cursor()->advance(); return; } // If we got here, there aren't any more documents. // The CursorWithContext (and its read lock) must be released, see SERVER-6123. dispose(); pCurrent = Document(); hasCurrent = false; }
void DocumentSourceOut::initialize() { invariant(_mongod); DBClientBase* conn = _mongod->directClient(); // Save the original collection options and index specs so we can check they didn't change // during computation. _originalOutOptions = _mongod->getCollectionOptions(_outputNs); _originalIndexes = conn->getIndexSpecs(_outputNs.ns()); // Check if it's sharded or capped to make sure we have a chance of succeeding before we do all // the work. If the collection becomes capped during processing, the collection options will // have changed, and the $out will fail. If it becomes sharded during processing, the final // rename will fail. uassert(17017, str::stream() << "namespace '" << _outputNs.ns() << "' is sharded so it can't be used for $out'", !_mongod->isSharded(_outputNs)); uassert(17152, str::stream() << "namespace '" << _outputNs.ns() << "' is capped so it can't be used for $out", _originalOutOptions["capped"].eoo()); // We will write all results into a temporary collection, then rename the temporary collection // to be the target collection once we are done. _tempNs = NamespaceString(str::stream() << _outputNs.db() << ".tmp.agg_out." << aggOutCounter.addAndFetch(1)); // Create output collection, copying options from existing collection if any. { BSONObjBuilder cmd; cmd << "create" << _tempNs.coll(); cmd << "temp" << true; cmd.appendElementsUnique(_originalOutOptions); BSONObj info; bool ok = conn->runCommand(_outputNs.db().toString(), cmd.done(), info); uassert(16994, str::stream() << "failed to create temporary $out collection '" << _tempNs.ns() << "': " << info.toString(), ok); } // copy indexes to _tempNs for (std::list<BSONObj>::const_iterator it = _originalIndexes.begin(); it != _originalIndexes.end(); ++it) { MutableDocument index((Document(*it))); index.remove("_id"); // indexes shouldn't have _ids but some existing ones do index["ns"] = Value(_tempNs.ns()); BSONObj indexBson = index.freeze().toBson(); conn->insert(_tempNs.getSystemIndexesCollection(), indexBson); BSONObj err = conn->getLastErrorDetailed(); uassert(16995, str::stream() << "copying index for $out failed." << " index: " << indexBson << " error: " << err, DBClientWithCommands::getLastErrorString(err).empty()); } _initialized = true; }
CApaDocument* C{{PROJECT}}Application::CreateDocumentL() { return new (ELeave) C{{PROJECT}}Document(*this); }