示例#1
0
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();
}