RESOLVED FIXED 42840
image element with src attribute can't be replaced by content: url() style
https://bugs.webkit.org/show_bug.cgi?id=42840
Summary image element with src attribute can't be replaced by content: url() style
Leo Yang
Reported 2010-07-22 11:59:01 PDT
Image element with src attribute and content: url() style can't be rendered correctly. For example: <image src="http://domain-which-does-not-exist.com/not-exist.jpg" style="content: url(url-for-image-exist.jpg)" /> webkit renders it as blank page. Even if src points to an exist image, a blank page renders also. If you use debug build, when reload the page, there is an ASSERT failure in CachedResource::removeClient().
Attachments
Patch (5.69 KB, patch)
2010-07-22 12:34 PDT, Leo Yang
abarth: review-
Revised patch (6.76 KB, patch)
2010-07-27 15:54 PDT, Leo Yang
darin: review-
darin: commit-queue-
Rebased patch (10.79 KB, patch)
2010-09-06 20:31 PDT, Leo Yang
no flags
Removed extra space from change log (10.78 KB, patch)
2010-09-06 21:03 PDT, Leo Yang
no flags
Change boolean to enum (10.93 KB, patch)
2010-12-23 21:52 PST, Leo Yang
darin: review-
darin: commit-queue-
Patch v5 (9.09 KB, patch)
2011-09-26 01:11 PDT, Leo Yang
no flags
Patch for landing (7.50 KB, patch)
2011-12-01 20:37 PST, Leo Yang
no flags
Leo Yang
Comment 1 2010-07-22 12:34:01 PDT
Ojan Vafai
Comment 2 2010-07-22 13:02:57 PDT
Comment on attachment 62327 [details] Patch I tried <image src="http://google.com/images/logo.gif" style="content: url(http://www.google.com/intl/en_ALL/images/logos/images_logo_lg.gif)" /> This renders the src image in Firefox 3.6 and the generated image in Opera 10.6 and WebKit nightly. So, this patch changes WebKit to match the Firefox behavior, right? Is there a spec that covers this behavior that one of us is violating?
Leo Yang
Comment 3 2010-07-22 13:26:56 PDT
(In reply to comment #2) > (From update of attachment 62327 [details]) > I tried <image src="http://google.com/images/logo.gif" style="content: url(http://www.google.com/intl/en_ALL/images/logos/images_logo_lg.gif)" /> > > This renders the src image in Firefox 3.6 and the generated image in Opera 10.6 and WebKit nightly. So, this patch changes WebKit to match the Firefox behavior, right? Is there a spec that covers this behavior that one of us is violating? I am using latest code (on the top of commit 6255afb56f275ef6bb3ebe6d5484ad65a01e2529), webkit renders nothing. This patch doesn't change behavior to match Firfox, instead, just renders generated image.
Ojan Vafai
Comment 4 2010-07-22 13:42:55 PDT
> I am using latest code (on the top of commit 6255afb56f275ef6bb3ebe6d5484ad65a01e2529), webkit renders nothing. This patch doesn't change behavior to match Firfox, instead, just renders generated image. Oh, interesting, nothing renders in Safari 5, but the generated image renders in WebKit nightly on Mac at r63854. Looks like this is fixed already or did this regress since r63854?
Adam Barth
Comment 5 2010-07-27 08:38:46 PDT
Comment on attachment 62327 [details] Patch Why is this a manual test? Can't we see this with a render tree dump or a pixel test? WebCore/loader/ImageLoader.cpp:5 + * Copyright (C) Research In Motion Limited 2010. All rights reserved. Please don't add your copyright when changing < 10 lines. WebCore/rendering/RenderImage.h:7 + * Copyright (C) Research In Motion Limited 2010. All rights reserved. ditto
Leo Yang
Comment 6 2010-07-27 15:54:41 PDT
Created attachment 62762 [details] Revised patch
Eric Seidel (no email)
Comment 7 2010-08-06 13:53:48 PDT
Comment on attachment 62762 [details] Revised patch What if the generated context is invalid?
Leo Yang
Comment 8 2010-08-09 07:16:06 PDT
(In reply to comment #7) > (From update of attachment 62762 [details]) > What if the generated context is invalid? I think it should behave as if this is an invalid image. Google Chrome 5.0 on Windows and Safari 5.0.1 on Windows behave as there is a broken image. Just as above discussion, this feature is broken in recently webkit trunk.
Darin Adler
Comment 9 2010-08-29 13:20:16 PDT
Comment on attachment 62762 [details] Revised patch This is a good catch. That code in ImageLoader is indeed wrong. But this patch will no longer apply, due to changes to ImageLoader.cpp that happened since it was posted. > + // If RenderImage is generated content we don't update the renderer either. The above is not a helpful comment. It says what the code does, but not why. As I understand the issue here, we want to change the image if this is a renderer we created, but not if it's a renderer that was created by other code. The fix should probably go in ImageLoader::renderImageResource, which can return 0 if the renderer is not for the loaded image, but rather some other renderer. Special casing the generated content version of RenderImage seems a little bit roundabout. Unfortunately, there is no longer a RenderImageGeneratedContent class to add a virtual function to, so we need a new approach to figuring out if this is an image renderer that the image loader should be overriding, or one it should not be. Somehow we have to distinguish the renderer created in RenderObject::createObject for generated content.
Leo Yang
Comment 10 2010-09-06 20:31:07 PDT
Created attachment 66680 [details] Rebased patch
Leo Yang
Comment 11 2010-09-06 21:03:05 PDT
Created attachment 66682 [details] Removed extra space from change log
Adam Barth
Comment 12 2010-12-23 00:30:20 PST
Comment on attachment 66682 [details] Removed extra space from change log View in context: https://bugs.webkit.org/attachment.cgi?id=66682&action=review I wanted to R+ this patch, but I didn't understand it. > WebCore/rendering/RenderImageResource.h:71 > - RenderImageResource(); > + RenderImageResource(bool isGenerated); I'd use an enum instead of a bool so we can understand the call-sites better.
Leo Yang
Comment 13 2010-12-23 21:52:21 PST
Created attachment 77401 [details] Change boolean to enum It makes sense to change boolean to enumeration for RenderImageResource.
Adam Barth
Comment 14 2011-01-04 10:49:24 PST
Comment on attachment 77401 [details] Change boolean to enum This patch looks fine to me, but, as a rule, I don't review patches in "WebCore/rendering" because I don't understand rendering.
Darin Adler
Comment 15 2011-01-04 13:17:19 PST
Comment on attachment 77401 [details] Change boolean to enum View in context: https://bugs.webkit.org/attachment.cgi?id=77401&action=review I don't think it’s right to make a special RenderImageResource. The real issue here is that RenderObject::createObject creates a RenderImage, but classes like HTMLImageElement assume that if the renderer is a RenderImage it’s the one they created. I think we should make a different renderer class, or add a flag to RenderImage, not RenderImageResource. I think the different class is probably the best way to handle it. I looked and found functions that make the incorrect assumption that an image is one created by the element and these are the ones I found: ImageLoader::renderImageResource HTMLImageElement::parseMappedAttribute HTMLImageElement::attach HitTestResult::absoluteImageURL absoluteURL functions generated by CodeGeneratorObjC.pm Those should probably use a function that returns false for the images that were created based on style, rather than the isImage function, which returns true for those. > WebCore/rendering/RenderImageResource.h:47 > + static PassOwnPtr<RenderImageResource> create(Type type = Normal) In the context of RenderImageResource, I don’t think “generated” is a clear enough term to be used. In this patch it means generated content, in other words, the CSS content attribute. But we also have a class named GeneratedImage in WebCore/platform/graphics, and this refers to images that are created by an algorithm, such as gradient, rather than with image data.
Darin Adler
Comment 16 2011-01-04 13:17:52 PST
Thanks for tackling this. I’m sorry I didn’t spot this bigger issue earlier.
Daniel Bates
Comment 17 2011-09-22 18:41:48 PDT
*** Bug 67721 has been marked as a duplicate of this bug. ***
Adam Roben (:aroben)
Comment 18 2011-09-22 20:03:05 PDT
As noted in bug 67721, sometimes things work just fine in Release builds.
Radar WebKit Bug Importer
Comment 19 2011-09-23 10:15:45 PDT
Leo Yang
Comment 20 2011-09-26 01:11:51 PDT
Created attachment 108642 [details] Patch v5
Darin Adler
Comment 21 2011-12-01 11:38:30 PST
Comment on attachment 108642 [details] Patch v5 View in context: https://bugs.webkit.org/attachment.cgi?id=108642&action=review Patch is OK, but not great. I’d like to look at cleaner ways to do this in the future, but it seems fine to land this now. > Source/WebCore/loader/ImageLoader.cpp:257 > - if (renderer->isImage()) > + if (renderer->isImage() && !static_cast<RenderImage*>(renderer)->isGeneratedContent()) This is a non-obvious check, and it needs a comment to make clear why this is correct. We might even want to later rename renderImageResource longer term to make it clearer what the function returns. It seems that given we already use a different class for the generated content image, the bit could be on RenderImageResource instead of on RenderImage. We could even use a virtual function instead of a bit.
Leo Yang
Comment 22 2011-12-01 20:37:10 PST
Created attachment 117555 [details] Patch for landing
WebKit Review Bot
Comment 23 2011-12-02 00:05:27 PST
Comment on attachment 117555 [details] Patch for landing Clearing flags on attachment: 117555 Committed r101753: <http://trac.webkit.org/changeset/101753>
WebKit Review Bot
Comment 24 2011-12-02 00:05:34 PST
All reviewed patches have been landed. Closing bug.
Note You need to log in before you can comment on or make changes to this bug.