Backed out changeset ade350a1d864 (bug 1818141) for causing multiple failures at RestyleManager.cpp

This commit is contained in:
Cristina Horotan
2023-05-18 01:49:46 +03:00
parent 9166a77934
commit 5c0a0ba1a1
3 changed files with 46 additions and 28 deletions

View File

@@ -1181,7 +1181,7 @@ nsresult nsImageLoadingContent::LoadImage(nsIURI* aNewURI, bool aForce,
"How could we not have a current request here?");
if (nsImageFrame* f = do_QueryFrame(GetOurPrimaryImageFrame())) {
f->UpdateImage(mCurrentRequest);
f->NotifyNewCurrentRequest(mCurrentRequest, NS_OK);
}
}
}

View File

@@ -688,7 +688,7 @@ void nsImageFrame::UpdateXULImage() {
}
if (!mOwnedRequest) {
UpdateImage(nullptr);
UpdateImage(nullptr, nullptr);
}
}
@@ -761,14 +761,18 @@ void nsImageFrame::SetupOwnedRequest() {
// need to add it to the image tracker manually.
PresContext()->Document()->ImageTracker()->Add(mOwnedRequest);
UpdateImage(mOwnedRequest);
uint32_t status = 0;
nsresult rv = mOwnedRequest->GetImageStatus(&status);
if (NS_FAILED(rv)) {
return;
}
if (status & imgIRequest::STATUS_SIZE_AVAILABLE) {
nsCOMPtr<imgIContainer> image;
mOwnedRequest->GetImage(getter_AddRefs(image));
OnSizeAvailable(mOwnedRequest, image);
}
if (status & imgIRequest::STATUS_FRAME_COMPLETE) {
mFirstFrameComplete = true;
}
@@ -1092,7 +1096,9 @@ auto nsImageFrame::ImageFrameTypeFor(const Element& aElement,
void nsImageFrame::Notify(imgIRequest* aRequest, int32_t aType,
const nsIntRect* aRect) {
if (aType == imgINotificationObserver::SIZE_AVAILABLE) {
return OnSizeAvailable(aRequest);
nsCOMPtr<imgIContainer> image;
aRequest->GetImage(getter_AddRefs(image));
return OnSizeAvailable(aRequest, image);
}
if (aType == imgINotificationObserver::FRAME_UPDATE) {
@@ -1110,31 +1116,33 @@ void nsImageFrame::Notify(imgIRequest* aRequest, int32_t aType,
}
if (aType == imgINotificationObserver::LOAD_COMPLETE) {
return OnLoadComplete(aRequest);
uint32_t imgStatus;
aRequest->GetImageStatus(&imgStatus);
nsresult status =
imgStatus & imgIRequest::STATUS_ERROR ? NS_ERROR_FAILURE : NS_OK;
return OnLoadComplete(aRequest, status);
}
}
void nsImageFrame::OnSizeAvailable(imgIRequest* aRequest) {
nsCOMPtr<imgIContainer> image;
aRequest->GetImage(getter_AddRefs(image));
if (!image) {
void nsImageFrame::OnSizeAvailable(imgIRequest* aRequest,
imgIContainer* aImage) {
if (!aImage) {
return;
}
/* Get requested animation policy from the pres context:
* normal = 0
* one frame = 1
* one loop = 2
*/
aImage->SetAnimationMode(PresContext()->ImageAnimationMode());
if (IsPendingLoad(aRequest)) {
// We don't care
return;
}
UpdateImage(aRequest, image);
}
void nsImageFrame::UpdateImage(imgIRequest* aRequest) {
nsCOMPtr<imgIContainer> image;
if (aRequest) {
aRequest->GetImage(getter_AddRefs(image));
}
UpdateImage(aRequest, image);
UpdateImage(aRequest, aImage);
}
void nsImageFrame::UpdateImage(imgIRequest* aRequest, imgIContainer* aImage) {
@@ -1145,8 +1153,6 @@ void nsImageFrame::UpdateImage(imgIRequest* aRequest, imgIContainer* aImage) {
// container, orienting according to our style.
mImage = nsLayoutUtils::OrientImage(aImage, orientation);
MOZ_ASSERT(mImage);
// Get requested animation policy from the pres context.
mImage->SetAnimationMode(PresContext()->ImageAnimationMode());
} else {
// We no longer have a valid image, so release our stored image container.
mImage = mPrevImage = nullptr;
@@ -1261,9 +1267,8 @@ void nsImageFrame::MaybeSendIntrinsicSizeAndRatioToEmbedder(
}
}
void nsImageFrame::OnLoadComplete(imgIRequest* aRequest) {
MOZ_ASSERT(aRequest);
UpdateImage(aRequest);
void nsImageFrame::OnLoadComplete(imgIRequest* aRequest, nsresult aStatus) {
NotifyNewCurrentRequest(aRequest, aStatus);
}
void nsImageFrame::ElementStateChanged(ElementState aStates) {
@@ -1274,7 +1279,7 @@ void nsImageFrame::ElementStateChanged(ElementState aStates) {
return;
}
if (!ImageOk(mContent->AsElement()->State())) {
UpdateImage(nullptr);
UpdateImage(nullptr, nullptr);
}
}
@@ -1315,6 +1320,15 @@ void nsImageFrame::UpdateIntrinsicSizeAndRatio() {
}
}
void nsImageFrame::NotifyNewCurrentRequest(imgIRequest* aRequest,
nsresult aStatus) {
nsCOMPtr<imgIContainer> image;
aRequest->GetImage(getter_AddRefs(image));
NS_ASSERTION(image || NS_FAILED(aStatus),
"Successful load with no container?");
UpdateImage(aRequest, image);
}
void nsImageFrame::MaybeDecodeForPredictedSize() {
// Check that we're ready to decode.
if (!mImage) {

View File

@@ -293,9 +293,14 @@ class nsImageFrame : public nsAtomicContainerFrame, public nsIReflowCallback {
friend class nsImageLoadingContent;
friend class mozilla::PresShell;
void OnSizeAvailable(imgIRequest* aRequest);
void OnSizeAvailable(imgIRequest* aRequest, imgIContainer* aImage);
void OnFrameUpdate(imgIRequest* aRequest, const nsIntRect* aRect);
void OnLoadComplete(imgIRequest* aRequest);
void OnLoadComplete(imgIRequest* aRequest, nsresult aStatus);
/**
* Notification that aRequest will now be the current request.
*/
void NotifyNewCurrentRequest(imgIRequest* aRequest, nsresult aStatus);
/// Always sync decode our image when painting if @aForce is true.
void SetForceSyncDecoding(bool aForce) { mForceSyncDecoding = aForce; }
@@ -352,7 +357,6 @@ class nsImageFrame : public nsAtomicContainerFrame, public nsIReflowCallback {
* (both can be null), and invalidate layout and paint as needed.
*/
void UpdateImage(imgIRequest*, imgIContainer*);
void UpdateImage(imgIRequest*);
/**
* Function to convert a dirty rect in the source image to a dirty