Back out 3a06964c6a52 (bug 1174923) for box-decoration-break-first-letter.html failures

This commit is contained in:
Phil Ringnalda 2015-06-18 22:04:12 -07:00
parent e0b8e47c2d
commit 8311ff50b5
7 changed files with 99 additions and 38 deletions

View File

@ -87,6 +87,7 @@ nsImageLoadingContent::nsImageLoadingContent()
mBroken(true), mBroken(true),
mUserDisabled(false), mUserDisabled(false),
mSuppressed(false), mSuppressed(false),
mFireEventsOnDecode(false),
mNewRequestsWillNeedAnimationReset(false), mNewRequestsWillNeedAnimationReset(false),
mStateChangerDepth(0), mStateChangerDepth(0),
mCurrentRequestRegistered(false), mCurrentRequestRegistered(false),
@ -185,6 +186,18 @@ nsImageLoadingContent::Notify(imgIRequest* aRequest,
} }
if (aType == imgINotificationObserver::DECODE_COMPLETE) { if (aType == imgINotificationObserver::DECODE_COMPLETE) {
if (mFireEventsOnDecode) {
mFireEventsOnDecode = false;
uint32_t reqStatus;
aRequest->GetImageStatus(&reqStatus);
if (reqStatus & imgIRequest::STATUS_ERROR) {
FireEvent(NS_LITERAL_STRING("error"));
} else {
FireEvent(NS_LITERAL_STRING("load"));
}
}
UpdateImageState(true); UpdateImageState(true);
} }
@ -264,11 +277,23 @@ nsImageLoadingContent::OnLoadComplete(imgIRequest* aRequest, nsresult aStatus)
} }
} }
// Fire the appropriate DOM event. // We want to give the decoder a chance to find errors. If we haven't found
if (NS_SUCCEEDED(aStatus)) { // an error yet and we've started decoding, either from the above
FireEvent(NS_LITERAL_STRING("load")); // StartDecoding or from some other place, we must only fire these events
// after we finish decoding.
uint32_t reqStatus;
aRequest->GetImageStatus(&reqStatus);
if (NS_SUCCEEDED(aStatus) && !(reqStatus & imgIRequest::STATUS_ERROR) &&
(reqStatus & imgIRequest::STATUS_DECODE_STARTED) &&
!(reqStatus & imgIRequest::STATUS_DECODE_COMPLETE)) {
mFireEventsOnDecode = true;
} else { } else {
FireEvent(NS_LITERAL_STRING("error")); // Fire the appropriate DOM event.
if (NS_SUCCEEDED(aStatus)) {
FireEvent(NS_LITERAL_STRING("load"));
} else {
FireEvent(NS_LITERAL_STRING("error"));
}
} }
nsCOMPtr<nsINode> thisNode = do_QueryInterface(static_cast<nsIImageLoadingContent*>(this)); nsCOMPtr<nsINode> thisNode = do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));

View File

@ -410,6 +410,7 @@ private:
bool mBroken : 1; bool mBroken : 1;
bool mUserDisabled : 1; bool mUserDisabled : 1;
bool mSuppressed : 1; bool mSuppressed : 1;
bool mFireEventsOnDecode : 1;
protected: protected:
/** /**

View File

@ -83,8 +83,9 @@ Decoder::Init()
// No re-initializing // No re-initializing
MOZ_ASSERT(!mInitialized, "Can't re-initialize a decoder!"); MOZ_ASSERT(!mInitialized, "Can't re-initialize a decoder!");
// Fire OnStartDecode at init time to support bug 512435.
if (!IsSizeDecode()) { if (!IsSizeDecode()) {
mProgress |= FLAG_DECODE_STARTED; mProgress |= FLAG_DECODE_STARTED | FLAG_ONLOAD_BLOCKED;
} }
// Implementation-specific initialization // Implementation-specific initialization
@ -272,7 +273,7 @@ Decoder::CompleteDecode()
} else { } else {
// We're not usable. Record some final progress indicating the error. // We're not usable. Record some final progress indicating the error.
if (!IsSizeDecode()) { if (!IsSizeDecode()) {
mProgress |= FLAG_DECODE_COMPLETE; mProgress |= FLAG_DECODE_COMPLETE | FLAG_ONLOAD_UNBLOCKED;
} }
mProgress |= FLAG_HAS_ERROR; mProgress |= FLAG_HAS_ERROR;
} }
@ -623,7 +624,7 @@ Decoder::PostFrameStop(Opacity aFrameOpacity /* = Opacity::TRANSPARENT */,
mCurrentFrame->Finish(aFrameOpacity, aDisposalMethod, aTimeout, aBlendMethod); mCurrentFrame->Finish(aFrameOpacity, aDisposalMethod, aTimeout, aBlendMethod);
mProgress |= FLAG_FRAME_COMPLETE; mProgress |= FLAG_FRAME_COMPLETE | FLAG_ONLOAD_UNBLOCKED;
// If we're not sending partial invalidations, then we send an invalidation // If we're not sending partial invalidations, then we send an invalidation
// here when the first frame is complete. // here when the first frame is complete.

View File

@ -1211,9 +1211,11 @@ RasterImage::OnImageDataComplete(nsIRequest*, nsISupports*, nsresult aStatus,
// to draw. (We may have already sent some of these notifications from // to draw. (We may have already sent some of these notifications from
// NotifyForDecodeOnlyOnDraw(), but ProgressTracker will ensure no duplicate // NotifyForDecodeOnlyOnDraw(), but ProgressTracker will ensure no duplicate
// notifications get sent.) // notifications get sent.)
loadProgress |= FLAG_DECODE_STARTED | loadProgress |= FLAG_ONLOAD_BLOCKED |
FLAG_DECODE_STARTED |
FLAG_FRAME_COMPLETE | FLAG_FRAME_COMPLETE |
FLAG_DECODE_COMPLETE; FLAG_DECODE_COMPLETE |
FLAG_ONLOAD_UNBLOCKED;
} }
// Notify our listeners, which will fire this image's load event. // Notify our listeners, which will fire this image's load event.
@ -1232,7 +1234,7 @@ RasterImage::NotifyForDecodeOnlyOnDraw()
return; return;
} }
NotifyProgress(FLAG_DECODE_STARTED); NotifyProgress(FLAG_DECODE_STARTED | FLAG_ONLOAD_BLOCKED);
} }
nsresult nsresult

View File

@ -41,23 +41,6 @@ function forceDecodeImg() {
ctx.drawImage(img, 0, 0); ctx.drawImage(img, 0, 0);
} }
function runAfterAsyncEvents(aCallback) {
function handlePostMessage(aEvent) {
if (aEvent.data == 'next') {
window.removeEventListener('message', handlePostMessage, false);
aCallback();
}
}
window.addEventListener('message', handlePostMessage, false);
// We'll receive the 'message' event after everything else that's currently in
// the event queue (which is a stronger guarantee than setTimeout, because
// setTimeout events may be coalesced). This lets us ensure that we run
// aCallback *after* any asynchronous events are delivered.
window.postMessage('next', '*');
}
function test() { function test() {
// Enable the discarding pref. // Enable the discarding pref.
oldDiscardingPref = prefBranch.getBoolPref('discardable'); oldDiscardingPref = prefBranch.getBoolPref('discardable');
@ -89,13 +72,6 @@ function step2() {
// Check that the image is decoded. // Check that the image is decoded.
forceDecodeImg(); forceDecodeImg();
// The FRAME_COMPLETE notification is delivered asynchronously, so continue
// after we're sure it has been delivered.
runAfterAsyncEvents(() => step3(result, scriptedObserver, clonedRequest));
}
function step3(result, scriptedObserver, clonedRequest) {
ok(isImgDecoded(), 'Image should initially be decoded.'); ok(isImgDecoded(), 'Image should initially be decoded.');
// Focus the old tab, then fire a memory-pressure notification. This should // Focus the old tab, then fire a memory-pressure notification. This should
@ -105,12 +81,18 @@ function step3(result, scriptedObserver, clonedRequest) {
.getService(Ci.nsIObserverService); .getService(Ci.nsIObserverService);
os.notifyObservers(null, 'memory-pressure', 'heap-minimize'); os.notifyObservers(null, 'memory-pressure', 'heap-minimize');
// The DISCARD notification is delivered asynchronously, so continue after // The discard notification is delivered asynchronously, so pump the event
// we're sure it has been delivered. // loop before checking.
runAfterAsyncEvents(() => step4(result, scriptedObserver, clonedRequest)); window.addEventListener('message', function (event) {
if (event.data == 'step3') {
step3(result, scriptedObserver, clonedRequest);
}
}, false);
window.postMessage('step3', '*');
} }
function step4(result, scriptedObserver, clonedRequest) { function step3(result, scriptedObserver, clonedRequest) {
ok(result.wasDiscarded, 'Image should be discarded.'); ok(result.wasDiscarded, 'Image should be discarded.');
// And we're done. // And we're done.

View File

@ -70,6 +70,7 @@ skip-if = (toolkit == 'android' && processor == 'x86') #x86 only
[test_bug496292.html] [test_bug496292.html]
[test_bug497665.html] [test_bug497665.html]
skip-if = (toolkit == 'android' && processor == 'x86') #x86 only skip-if = (toolkit == 'android' && processor == 'x86') #x86 only
[test_bug512435.html]
[test_bug552605-1.html] [test_bug552605-1.html]
[test_bug552605-2.html] [test_bug552605-2.html]
[test_bug553982.html] [test_bug553982.html]

View File

@ -0,0 +1,49 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=512435
-->
<head>
<title>Test for Bug 512435</title>
<script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/image/test/mochitest/imgutils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=512435">Mozilla Bug 512435</a>
<img id="img_a">
<img id="img_b">
</div>
<pre id="test">
<script type="application/javascript">
// Boilerplate
const Ci = SpecialPowers.Ci;
const Cc = SpecialPowers.Cc;
SimpleTest.waitForExplicitFinish();
// We're relying on very particular behavior for certain images - clear the
// image cache, _then_ set src
clearImageCache();
document.getElementById("img_a").src = "damon.jpg";
document.getElementById("img_b").src = "shaver.png";
// Our handler
function loadHandler() {
// The two images should be decoded
ok(isFrameDecoded("img_a"), "img_a should be decoded before onload fires");
ok(isFrameDecoded("img_b"), "img_b should be decoded before onload fires");
// All done
SimpleTest.finish();
}
// Set our onload handler
window.onload = loadHandler;
</script>
</pre>
</body>
</html>