This is a well-known issue. Ideally outline size would be factored into visual 
overflow, but that’s a bit tricky because outline is weird and crosses between 
RenderObjects.

https://bugs.webkit.org/show_bug.cgi?id=106397 
<https://bugs.webkit.org/show_bug.cgi?id=106397>


> On Jul 6, 2015, at 9:26 PM, Kim, NamHoon <na...@ea.com> wrote:
> 
> Hi experts,
>  
> While hacking composited layer in WebKit, I realized CSS outline style 
> inflate size of all RenderLayers. Since WebKit has default css of 5px outline 
> for focused element, focusing input in the below sample inflate the cyan box. 
> This can reproduced in WK2 OSX port in r186227.
>  
> <style>
> .box {
>   position: fixed;
>   top: 50px;
>   width: 100px;
>   height: 30px;
>   border-radius: 10%;
>   background-color: cyan;
> }
> </style>
>  
> <input type='text'>
> <div class='box'></div>
>  
> Through investigation, I found `RenderView::m_maximalOutlineSize` value is 
> set in the RenderElement::setStyle() function. And this cause inflation of 
> layers in RenderLayer::localBoundingBox() function. Since setter of 
> `m_maximalOutlineSize` scheduled rebuild of the whole composited layers, all 
> layers inflated by the value.
>  
> Honestly, I don’t know about this value’s purpose. But it seems weird to me 
> that this value does not cleared in the RenderView even after outline style 
> cleared. (i.e. loose focus of the input)
>  
> And this behavior makes several problem in our ports, [EAWebKit][1]. Since we 
> uses composited layers backed by DirectX, this makes paint call requests 
> larger size than texture itself in TextureMapperTile::paint() function. This 
> cause rendering of corrupted memory. Steps follow,
>  
> a. layer inflated by maximalOutlineSize. Let 100x100 layer increased to 
> 110x110.
> b. texture increased in the 
> TextureMapperTiledBackingStore::createOrDestroyTilesIfNeeded() to 110x110.
> c. layer’s texture destroyed then reconstructed by display style change.
> d. while reconstruct of the layer’s texture, this time texture created with 
> the size of 100x100 instead of 110x110.
> e. then painting this texture in TextureMapperTile::paint() request 110x110 
> rect for 100x100 texture.

This sounds like a bug in your port.

> While step d. GraphicsLayerTextureMapper::m_needsDisplayRect intersected with 
> TextureMapperTile::m_rect, makes texture smaller then layer’s size. On the 
> other hand, TextureMapperTile::paint() call in the step e. request whole 
> TextureMapperTile::m_rect for draw request.
>  
> To escape this problem, I overridden default style of :focus to `outline: 
> none`. I wonder better solution for this. Is it some bug of WebKit? Is there 
> some proper way to handle this? If inflation of the layers inevitable, it 
> seems reasonable shrunken back after outline style cleared.

Simon


_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to