Bug 1554847 - Improve cross-origin checks in canvas API - imgIRequest.hadCrossOriginRedirects, r=aosmond

Differential Revision: https://phabricator.services.mozilla.com/D32791

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andrea Marchesini 2019-06-03 09:54:14 +00:00
parent 8a32278bc9
commit 1fa1039026
3 changed files with 46 additions and 6 deletions

View File

@ -112,6 +112,11 @@ interface imgIRequest : nsIRequest
*/
readonly attribute nsIPrincipal imagePrincipal;
/**
* true if the loading of the image required cross-origin redirects.
*/
readonly attribute bool hadCrossOriginRedirects;
/**
* Whether the request is multipart (ie, multipart/x-mixed-replace)
*/

View File

@ -888,6 +888,22 @@ imgRequestProxy::GetImagePrincipal(nsIPrincipal** aPrincipal) {
return NS_OK;
}
NS_IMETHODIMP
imgRequestProxy::GetHadCrossOriginRedirects(bool* aHadCrossOriginRedirects) {
*aHadCrossOriginRedirects = false;
nsCOMPtr<nsITimedChannel> timedChannel = TimedChannel();
if (timedChannel) {
bool allRedirectsSameOrigin = false;
*aHadCrossOriginRedirects =
NS_SUCCEEDED(
timedChannel->GetAllRedirectsSameOrigin(&allRedirectsSameOrigin)) &&
!allRedirectsSameOrigin;
}
return NS_OK;
}
NS_IMETHODIMP
imgRequestProxy::GetMultipart(bool* aMultipart) {
if (!GetOwner()) {
@ -1102,8 +1118,10 @@ nsresult imgRequestProxy::GetStaticRequest(Document* aLoadingDocument,
// Create a static imgRequestProxy with our new extracted frame.
nsCOMPtr<nsIPrincipal> currentPrincipal;
GetImagePrincipal(getter_AddRefs(currentPrincipal));
RefPtr<imgRequestProxy> req =
new imgRequestProxyStatic(frozenImage, currentPrincipal);
bool hadCrossOriginRedirects = true;
GetHadCrossOriginRedirects(&hadCrossOriginRedirects);
RefPtr<imgRequestProxy> req = new imgRequestProxyStatic(
frozenImage, currentPrincipal, hadCrossOriginRedirects);
req->Init(nullptr, nullptr, aLoadingDocument, mURI, nullptr);
NS_ADDREF(*aReturn = req);
@ -1219,8 +1237,10 @@ class StaticBehaviour : public ProxyBehaviour {
};
imgRequestProxyStatic::imgRequestProxyStatic(mozilla::image::Image* aImage,
nsIPrincipal* aPrincipal)
: mPrincipal(aPrincipal) {
nsIPrincipal* aPrincipal,
bool aHadCrossOriginRedirects)
: mPrincipal(aPrincipal),
mHadCrossOriginRedirects(aHadCrossOriginRedirects) {
mBehaviour = mozilla::MakeUnique<StaticBehaviour>(aImage);
}
@ -1235,9 +1255,19 @@ imgRequestProxyStatic::GetImagePrincipal(nsIPrincipal** aPrincipal) {
return NS_OK;
}
NS_IMETHODIMP
imgRequestProxyStatic::GetHadCrossOriginRedirects(
bool* aHadCrossOriginRedirects) {
*aHadCrossOriginRedirects = mHadCrossOriginRedirects;
return NS_OK;
}
imgRequestProxy* imgRequestProxyStatic::NewClonedProxy() {
nsCOMPtr<nsIPrincipal> currentPrincipal;
GetImagePrincipal(getter_AddRefs(currentPrincipal));
bool hadCrossOriginRedirects = true;
GetHadCrossOriginRedirects(&hadCrossOriginRedirects);
RefPtr<mozilla::image::Image> image = GetImage();
return new imgRequestProxyStatic(image, currentPrincipal);
return new imgRequestProxyStatic(image, currentPrincipal,
hadCrossOriginRedirects);
}

View File

@ -237,16 +237,21 @@ class imgRequestProxy : public imgIRequest,
// certain behaviours must be overridden to compensate.
class imgRequestProxyStatic : public imgRequestProxy {
public:
imgRequestProxyStatic(Image* aImage, nsIPrincipal* aPrincipal);
imgRequestProxyStatic(Image* aImage, nsIPrincipal* aPrincipal,
bool hadCrossOriginRedirects);
NS_IMETHOD GetImagePrincipal(nsIPrincipal** aPrincipal) override;
NS_IMETHOD GetHadCrossOriginRedirects(
bool* aHadCrossOriginRedirects) override;
protected:
imgRequestProxy* NewClonedProxy() override;
// Our principal. We have to cache it, rather than accessing the underlying
// request on-demand, because static proxies don't have an underlying request.
nsCOMPtr<nsIPrincipal> mPrincipal;
const bool mHadCrossOriginRedirects;
};
#endif // mozilla_image_imgRequestProxy_h