Bug 147773

Summary: Make RenderElement the CachedImageClient, rather than RenderObject
Product: WebKit Reporter: Simon Fraser (smfr) <simon.fraser>
Component: New BugsAssignee: Simon Fraser (smfr) <simon.fraser>
Status: NEW ---    
Severity: Normal CC: darin, kling, koivisto, simon.fraser, zalan
Priority: P2    
Version: 528+ (Nightly build)   
Hardware: Unspecified   
OS: Unspecified   
Attachments:
Description Flags
Patch for EWS
none
Patch none

Description Simon Fraser (smfr) 2015-08-06 23:26:18 PDT
Make RenderElement the CachedImageClient, rather than RenderObject
Comment 1 Simon Fraser (smfr) 2015-08-06 23:27:05 PDT
Created attachment 258463 [details]
Patch for EWS
Comment 2 Andreas Kling 2015-08-06 23:29:38 PDT
Does this regress the sizeof(RenderElement) due to extra vtable ptr?
Comment 3 Simon Fraser (smfr) 2015-08-08 12:20:05 PDT
Created attachment 258571 [details]
Patch
Comment 4 Simon Fraser (smfr) 2015-08-08 12:54:03 PDT
Before:

sizeof RenderObject is 48
sizeof RenderText is 88
sizeof RenderElement is 72
sizeof RenderBoxModelObject is 80
sizeof RenderBox is 136

After:

sizeof RenderObject is 48
sizeof RenderText is 88
sizeof RenderElement is 88
sizeof RenderBoxModelObject is 96
sizeof RenderBox is 152

Hrmm, maybe we can improve packing into RenderObject to eliminate this change.
Comment 5 Darin Adler 2015-08-08 17:51:31 PDT
Comment on attachment 258571 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=258571&action=review

Not saying review+ yet because of the question in HTMLImageElement::width.

> Source/WebCore/html/HTMLImageElement.cpp:290
> -            return m_imageLoader.image()->imageSizeForRenderer(renderer(), 1.0f).width();
> +            return m_imageLoader.image()->imageSizeForRenderer(nullptr, 1.0f).width();

Change log doesn’t make clear why we want to pass nullptr here instead of renderer.

> Source/WebCore/page/EventHandler.cpp:1446
> +        RenderElement* renderElement = is<RenderElement>(renderer) ? downcast<RenderElement>(renderer) : (renderer->isText() ? renderer->parent() : nullptr);

Why is the isText check needed? Which non-RenderElement, non-text RenderObject has a requirement that we use null instead of a pointer to the object’s parent?
Comment 6 Darin Adler 2015-08-08 17:53:01 PDT
(In reply to comment #4)
> Before:
> 
> sizeof RenderObject is 48
> sizeof RenderText is 88
> sizeof RenderElement is 72
> sizeof RenderBoxModelObject is 80
> sizeof RenderBox is 136
> 
> After:
> 
> sizeof RenderObject is 48
> sizeof RenderText is 88
> sizeof RenderElement is 88
> sizeof RenderBoxModelObject is 96
> sizeof RenderBox is 152
> 
> Hrmm, maybe we can improve packing into RenderObject to eliminate this
> change.

That’s bizarre. Why on earth do we see that big increase in RenderBox? I suspect the problem is that this makes it multiple inheritance and before it was single inheritance.
Comment 7 Antti Koivisto 2015-08-10 08:24:03 PDT
This adds vptr to RenderElement, the results are exactly as expected.
Comment 8 Antti Koivisto 2015-08-10 08:29:53 PDT
A good strategy might be to have a separate non-renderer object that is a CachedImageClient and keep those in a global RenderElement->ImageClient map. The client object would only be constructed when needed. Most renderers don't load any images.
Comment 9 Antti Koivisto 2015-08-10 08:31:21 PDT
RenderElementImageLoader or something.
Comment 10 zalan 2015-08-10 08:32:36 PDT
(In reply to comment #8)
> A good strategy might be to have a separate non-renderer object that is a
> CachedImageClient and keep those in a global RenderElement->ImageClient map.
> The client object would only be constructed when needed. Most renderers
> don't load any images.
I'd like to see something like that!
Comment 11 Simon Fraser (smfr) 2015-08-10 09:11:09 PDT
Comment on attachment 258571 [details]
Patch

Sounds like a plan.
Comment 12 Antti Koivisto 2015-08-10 09:16:25 PDT
I thought we already had static_asserts against growth of common renderers. We should add some!