void HTMLFormattingElementList::tryToEnsureNoahsArkConditionQuickly( HTMLStackItem* newItem, HeapVector<Member<HTMLStackItem>>& remainingCandidates) { ASSERT(remainingCandidates.isEmpty()); if (m_entries.size() < kNoahsArkCapacity) return; // Use a vector with inline capacity to avoid a malloc in the common case of a // quickly ensuring the condition. HeapVector<Member<HTMLStackItem>, 10> candidates; size_t newItemAttributeCount = newItem->attributes().size(); for (size_t i = m_entries.size(); i;) { --i; Entry& entry = m_entries[i]; if (entry.isMarker()) break; // Quickly reject obviously non-matching candidates. HTMLStackItem* candidate = entry.stackItem(); if (newItem->localName() != candidate->localName() || newItem->namespaceURI() != candidate->namespaceURI()) continue; if (candidate->attributes().size() != newItemAttributeCount) continue; candidates.append(candidate); } // There's room for the new element in the ark. There's no need to copy out // the remainingCandidates. if (candidates.size() < kNoahsArkCapacity) return; remainingCandidates.appendVector(candidates); }
void InspectorResourceContentLoader::start() { m_started = true; HeapVector<Member<Document>> documents; InspectedFrames* inspectedFrames = InspectedFrames::create(m_inspectedFrame); for (LocalFrame* frame : *inspectedFrames) { documents.append(frame->document()); documents.appendVector(InspectorPageAgent::importsForFrame(frame)); } for (Document* document : documents) { HashSet<String> urlsToFetch; ResourceRequest resourceRequest; HistoryItem* item = document->frame() ? document->frame()->loader().currentItem() : nullptr; if (item) { resourceRequest = FrameLoader::resourceRequestFromHistoryItem( item, WebCachePolicy::ReturnCacheDataDontLoad); } else { resourceRequest = document->url(); resourceRequest.setCachePolicy(WebCachePolicy::ReturnCacheDataDontLoad); } resourceRequest.setRequestContext(WebURLRequest::RequestContextInternal); if (!resourceRequest.url().getString().isEmpty()) { urlsToFetch.add(resourceRequest.url().getString()); FetchRequest request(resourceRequest, FetchInitiatorTypeNames::internal); Resource* resource = RawResource::fetch(request, document->fetcher()); if (resource) { // Prevent garbage collection by holding a reference to this resource. m_resources.append(resource); ResourceClient* resourceClient = new ResourceClient(this); m_pendingResourceClients.add(resourceClient); resourceClient->waitForResource(resource); } } HeapVector<Member<CSSStyleSheet>> styleSheets; InspectorCSSAgent::collectAllDocumentStyleSheets(document, styleSheets); for (CSSStyleSheet* styleSheet : styleSheets) { if (styleSheet->isInline() || !styleSheet->contents()->loadCompleted()) continue; String url = styleSheet->href(); if (url.isEmpty() || urlsToFetch.contains(url)) continue; urlsToFetch.add(url); FetchRequest request(ResourceRequest(url), FetchInitiatorTypeNames::internal); request.mutableResourceRequest().setRequestContext( WebURLRequest::RequestContextInternal); Resource* resource = CSSStyleSheetResource::fetch(request, document->fetcher()); if (!resource) continue; // Prevent garbage collection by holding a reference to this resource. m_resources.append(resource); ResourceClient* resourceClient = new ResourceClient(this); m_pendingResourceClients.add(resourceClient); resourceClient->waitForResource(resource); } } m_allRequestsStarted = true; checkDone(); }