ImportLoader* ImportManager::GetNearestPredecessor(nsINode* aNode) { // Return the previous link if there is any in the same document. nsIDocument* doc = aNode->OwnerDoc(); int32_t idx = doc->IndexOfSubImportLink(aNode); MOZ_ASSERT(idx != -1, "aNode must be a sub import link of its owner document"); for (; idx > 0; idx--) { HTMLLinkElement* link = static_cast<HTMLLinkElement*>(doc->GetSubImportLink(idx - 1)); nsCOMPtr<nsIURI> uri = link->GetHrefURI(); RefPtr<ImportLoader> ret; mImports.Get(uri, getter_AddRefs(ret)); // Only main referrer links are interesting. if (ret->GetMainReferrer() == link) { return ret; } } if (idx == 0) { if (doc->IsMasterDocument()) { // If there is no previous one, and it was the master document, then // there is no predecessor. return nullptr; } // Else we find the main referrer of the import parent of the link's document. // And do a recursion. ImportLoader* owner = Find(doc); MOZ_ASSERT(owner); nsCOMPtr<nsINode> mainReferrer = owner->GetMainReferrer(); return GetNearestPredecessor(mainReferrer); } return nullptr; }
ImportLoader* ImportManager::Find(nsINode* aLink) { HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(aLink); nsCOMPtr<nsIURI> uri = linkElement->GetHrefURI(); return mImports.GetWeak(uri); }