Example #1
0
bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute,
                          CrossOriginAttributeValue crossOrigin,
                          const String& type,
                          const String& as,
                          const String& media,
                          ReferrerPolicy referrerPolicy,
                          const KURL& href,
                          Document& document,
                          const NetworkHintsInterface& networkHintsInterface) {
  if (!m_client->shouldLoadLink())
    return false;

  dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface,
                      LinkCalledFromMarkup);

  preconnectIfNeeded(relAttribute, href, document, crossOrigin,
                     networkHintsInterface, LinkCalledFromMarkup);

  bool errorOccurred = false;
  createLinkPreloadResourceClient(preloadIfNeeded(
      relAttribute, href, document, as, type, media, crossOrigin,
      LinkCalledFromMarkup, errorOccurred, nullptr, referrerPolicy));
  if (errorOccurred)
    m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE);

  if (href.isEmpty() || !href.isValid())
    released();

  prefetchIfNeeded(document, href, relAttribute, crossOrigin, referrerPolicy);

  if (const unsigned prerenderRelTypes =
          prerenderRelTypesFromRelAttribute(relAttribute, document)) {
    if (!m_prerender) {
      m_prerender =
          PrerenderHandle::create(document, this, href, prerenderRelTypes);
    } else if (m_prerender->url() != href) {
      m_prerender->cancel();
      m_prerender =
          PrerenderHandle::create(document, this, href, prerenderRelTypes);
    }
    // TODO(gavinp): Handle changes to rel types of existing prerenders.
  } else if (m_prerender) {
    m_prerender->cancel();
    m_prerender.clear();
  }
  return true;
}
Example #2
0
bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, CrossOriginAttributeValue crossOrigin, const String& type,
    const String& as, const String& media, const KURL& href, Document& document, const NetworkHintsInterface& networkHintsInterface)
{
    // TODO(yoav): Do all links need to load only after they're in document???

    // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAttributeValue. crbug.com/486689
    // FIXME(crbug.com/463266): We're ignoring type here, for everything but preload. Maybe we shouldn't.
    dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface, LinkCalledFromMarkup);

    preconnectIfNeeded(relAttribute, href, document, crossOrigin, networkHintsInterface, LinkCalledFromMarkup);

    bool errorOccurred = false;
    if (m_client->shouldLoadLink())
        createLinkPreloadResourceClient(preloadIfNeeded(relAttribute, href, document, as, type, media, crossOrigin, LinkCalledFromMarkup, errorOccurred, nullptr));
    if (errorOccurred)
        m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE);

    if (href.isEmpty() || !href.isValid())
        released();

    // FIXME(crbug.com/323096): Should take care of import.
    if (relAttribute.isLinkPrefetch() && href.isValid() && document.frame()) {
        if (!m_client->shouldLoadLink())
            return false;
        UseCounter::count(document, UseCounter::LinkRelPrefetch);

        FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), FetchInitiatorTypeNames::link);
        if (crossOrigin != CrossOriginAttributeNotSet)
            linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), crossOrigin);
        setResource(LinkFetchResource::fetch(Resource::LinkPrefetch, linkRequest, document.fetcher()));
    }

    if (const unsigned prerenderRelTypes = prerenderRelTypesFromRelAttribute(relAttribute, document)) {
        if (!m_prerender) {
            m_prerender = PrerenderHandle::create(document, this, href, prerenderRelTypes);
        } else if (m_prerender->url() != href) {
            m_prerender->cancel();
            m_prerender = PrerenderHandle::create(document, this, href, prerenderRelTypes);
        }
        // TODO(gavinp): Handle changes to rel types of existing prerenders.
    } else if (m_prerender) {
        m_prerender->cancel();
        m_prerender.clear();
    }
    return true;
}