NS_IMETHODIMP nsImageLoadingContent::ForceReload() { NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE); nsCOMPtr<nsIURI> currentURI; GetCurrentURI(getter_AddRefs(currentURI)); if (!currentURI) { return NS_ERROR_NOT_AVAILABLE; } return LoadImage(currentURI, PR_TRUE, PR_TRUE, nsnull, nsIRequest::VALIDATE_ALWAYS); }
nsresult HTMLImageElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName, const nsAttrValue* aValue, bool aNotify) { if (aNameSpaceID == kNameSpaceID_None && mForm && (aName == nsGkAtoms::name || aName == nsGkAtoms::id) && aValue && !aValue->IsEmptyString()) { // add the image to the hashtable as needed NS_ABORT_IF_FALSE(aValue->Type() == nsAttrValue::eAtom, "Expected atom value for name/id"); mForm->AddImageElementToTable(this, nsDependentAtomString(aValue->GetAtomValue())); } // Handle src/srcset/crossorigin updates. If aNotify is false, we are coming // from the parser or some such place; we'll get bound after all the // attributes have been set, so we'll do the image load from BindToTree. if (aName == nsGkAtoms::src && aNameSpaceID == kNameSpaceID_None) { // SetAttr handles setting src in the non-responsive case, so only handle it // for responsive mode or unsetting if (!aValue) { CancelImageRequests(aNotify); } else if (mResponsiveSelector) { mResponsiveSelector->SetDefaultSource(aValue ? aValue->GetStringValue() : EmptyString()); LoadSelectedImage(false, aNotify); } } else if (aName == nsGkAtoms::srcset && aNameSpaceID == kNameSpaceID_None && aNotify && AsContent()->IsInDoc() && IsSrcsetEnabled()) { // We currently don't handle responsive mode until BindToTree UpdateSourceSet(aValue->GetStringValue()); LoadSelectedImage(false, aNotify); } else if (aName == nsGkAtoms::crossorigin && aNameSpaceID == kNameSpaceID_None && aNotify) { // We want aForce == true in this LoadImage call, because we want to force // a new load of the image with the new cross origin policy. nsCOMPtr<nsIURI> currentURI; if (NS_SUCCEEDED(GetCurrentURI(getter_AddRefs(currentURI))) && currentURI) { LoadImage(currentURI, true, aNotify); } } return nsGenericHTMLElement::AfterSetAttr(aNameSpaceID, aName, aValue, aNotify); }
NS_IMETHODIMP nsSHistory::Reload(PRUint32 aReloadFlags) { nsresult rv; nsDocShellInfoLoadType loadType; if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY && aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE) { loadType = nsIDocShellLoadInfo::loadReloadBypassProxyAndCache; } else if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY) { loadType = nsIDocShellLoadInfo::loadReloadBypassProxy; } else if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE) { loadType = nsIDocShellLoadInfo::loadReloadBypassCache; } else if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE) { loadType = nsIDocShellLoadInfo::loadReloadCharsetChange; } else { loadType = nsIDocShellLoadInfo::loadReloadNormal; } // Notify listeners PRBool canNavigate = PR_TRUE; if (mListener) { nsCOMPtr<nsISHistoryListener> listener(do_QueryReferent(mListener)); // We are reloading. Send Reload notifications. // nsDocShellLoadFlagType is not public, where as nsIWebNavigation // is public. So send the reload notifications with the // nsIWebNavigation flags. if (listener) { nsCOMPtr<nsIURI> currentURI; rv = GetCurrentURI(getter_AddRefs(currentURI)); listener->OnHistoryReload(currentURI, aReloadFlags, &canNavigate); } } if (!canNavigate) return NS_OK; return LoadEntry(mIndex, loadType, HIST_CMD_RELOAD); }
nsresult nsImageLoadingContent::LoadImage(nsIURI* aNewURI, PRBool aForce, PRBool aNotify, nsIDocument* aDocument, nsLoadFlags aLoadFlags) { if (!mLoadingEnabled) { // XXX Why fire an error here? seems like the callers to SetLoadingEnabled // don't want/need it. FireEvent(NS_LITERAL_STRING("error")); return NS_OK; } NS_ASSERTION(!aDocument || aDocument == GetOurDocument(), "Bogus document passed in"); // First, get a document (needed for security checks and the like) if (!aDocument) { aDocument = GetOurDocument(); if (!aDocument) { // No reason to bother, I think... return NS_OK; } } // URI equality check. // // We skip the equality check if our current image was blocked, since in that // case we really do want to try loading again. if (!aForce && NS_CP_ACCEPTED(mImageBlockingStatus)) { nsCOMPtr<nsIURI> currentURI; GetCurrentURI(getter_AddRefs(currentURI)); PRBool equal; if (currentURI && NS_SUCCEEDED(currentURI->Equals(aNewURI, &equal)) && equal) { // Nothing to do here. return NS_OK; } } // From this point on, our image state could change. Watch it. AutoStateChanger changer(this, aNotify); // Sanity check. // // We use the principal of aDocument to avoid having to QI |this| an extra // time. It should always be the same as the principal of this node. #ifdef DEBUG nsCOMPtr<nsIContent> thisContent = do_QueryInterface(this); NS_ABORT_IF_FALSE(thisContent && thisContent->NodePrincipal() == aDocument->NodePrincipal(), "Principal mismatch?"); #endif // Are we blocked? PRInt16 cpDecision = nsIContentPolicy::REJECT_REQUEST; nsContentUtils::CanLoadImage(aNewURI, this, aDocument, aDocument->NodePrincipal(), &cpDecision); if (!NS_CP_ACCEPTED(cpDecision)) { FireEvent(NS_LITERAL_STRING("error")); SetBlockedRequest(aNewURI, cpDecision); return NS_OK; } // Not blocked. Do the load. nsCOMPtr<imgIRequest>& req = PrepareNextRequest(); nsresult rv; rv = nsContentUtils::LoadImage(aNewURI, aDocument, aDocument->NodePrincipal(), aDocument->GetDocumentURI(), this, aLoadFlags, getter_AddRefs(req)); if (NS_SUCCEEDED(rv)) { TrackImage(req); } else { // If we don't have a current URI, we might as well store this URI so people // know what we tried (and failed) to load. if (!mCurrentRequest) mCurrentURI = aNewURI; FireEvent(NS_LITERAL_STRING("error")); return NS_OK; } return NS_OK; }