New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 727155 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner:
Closed: Oct 2017
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: All
Pri: 2
Type: Bug-Regression



Sign in to add a comment

Scrollbar in iframe child div "overflow-x: auto" not painted initially after post-load iframe resize.

Reported by eugene.b...@gmail.com, May 28 2017

Issue description

UserAgent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

Steps to reproduce the problem:
1. Save attached HTML documents
2. Open parent.html

What is the expected behavior?
There should always be a horizontal scrollbar below the green rectangle.

This problem seems to only happen when:
1. iframe content has an element with overflow-x="scroll" or "auto"
2. iframe scrolling="no"
3. Initial iframe height is shorter that its content.

What went wrong?
Element's horizontal scrollbar is not visible when hosted in iframe.

Did this work before? N/A 

Chrome version: 61.0.3114.0  Channel: canary
OS Version: 6.1 (Windows 7, Windows Server 2008 R2)
Flash Version: 

Works in Firefox 51.0.1 and IE11
 
parent.html
411 bytes View Download
Attached is the iframe content
child.html
324 bytes View Download
Cc: jbanavatu@chromium.org
Components: Blink>Scroll
Labels: Needs-Feedback
Tested the issue on Windows 7 & 10 using chrome stable version #58.0.3029.110 and Latest canary #60.0.3114.0. Unable able to repro this issue. 

Following are the steps followed to reproduce the issue.
------------
1. Downloaded both attachments(Parent.html and Child.hmtl)
2. Opened parent.html and Observed that Horizontal scrollbar is seen.
3. Also opened child.html and Observed that Horizontal scrollbar is seen.

Attaching screen cast for reference.

eugene.brain.ong@ - Could you please verify the screen-cast and let us know if anything is missed from our side.If possible please provide an expected behavior screen cast explaining about the issue.

Thanks...!!
727155.webm
1.8 MB View Download

Comment 3 Deleted

Expected behavior is the scrollbar should always be visible.

Jump to 0:14 of your screen-cast and notice that scrollbar is hidden and only becomes visible when your mouse is on top of where the scrollbar should be.

Please also see attached screenshot
sceenshot.png
109 KB View Download
Project Member

Comment 5 by sheriffbot@chromium.org, May 31 2017

Labels: -Needs-Feedback
Thank you for providing more feedback. Adding requester "jbanavatu@chromium.org" to the cc list and removing "Needs-Feedback" label.

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
Labels: -Type-Bug hasbisect-per-revision M-60 OS-Linux OS-Mac Type-Bug-Regression
Owner: wkorman@chromium.org
Status: Assigned (was: Unconfirmed)
Able to reproduce on Windows-10 & 7, Ubuntu 14.04 and Mac OS 10.12 using chrome stable M58-58.0.3029.110 and latest M60-61.0.3115.0 
Following are the steps followed to reproduce the issue.
------------
1. Downloaded both attachments(Parent.html and Child.hmtl)
2. Opened parent.html and Observed that Horizontal scrollbar is seen only after mouse hover.

Bisect Information:
=====================
Good build:54.0.2816.0 
Bad Build :54.0.2817.0

You are probably looking for a change made after 409290 (known good), but no later than 409291 (first known bad).

CHANGELOG URL:
https://chromium.googlesource.com/chromium/src/+log/f0c034ea05c19080c63bf73afb5200c49f203db1..ccb9e13712b1632b889960d1d85d556c0139fd51

From the above change log suspecting below change
Review-Url: https://codereview.chromium.org/1484163002

wkorman@ - Could you please check whether this is caused with respect to your change, if not please help us in assigning it to the right owner.

Thanks!
Labels: -M-60 M-61
Components: -UI -Blink>Scroll Blink>Paint
Labels: -OS-Linux -OS-Windows -OS-Mac OS-All
I can repro on Linux at ToT. It looks like a visual rect/paint invalidation issue. The scroller is not composited.

The last display item list horizontal scrollbar visual rects before paint is stable, and when horizontal scrollbar is still not visible, shows empty visual rects for the scrollbar parts:


                "index": 6,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"BeginTransform\", transform: [1.000000,0.000000,0.000000,1.000000,8.000000,8.000000]"
              },
              {
                "index": 7,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"DrawingScrollbarBackButtonStart\", rect: [0.000000,210.000000 15.000000x15.000000]"
              },
              {
                "index": 8,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"DrawingScrollbarForwardButtonEnd\", rect: [289.000000,210.000000 15.000000x15.000000]"
              },
              {
                "index": 9,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"DrawingScrollbarBackTrack\", rect: [15.000000,210.000000 67.000000x15.000000]"
              },
              {
                "index": 10,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"DrawingScrollbarForwardTrack\", rect: [82.000000,210.000000 207.000000x15.000000]"
              },
              {
                "index": 11,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"DrawingScrollbarThumb\", rect: [15.000000,210.000000 135.000000x15.000000]"
              },
              {
                "index": 12,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"0,0 0x0\", type: \"EndTransform\""
              },

Once we hover over the scrollbar prompting it to paint properly the visual rects for the scrollbar parts are non-empty:

              {
                "index": 6,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"BeginTransform\", transform: [1.000000,0.000000,0.000000,1.000000,8.000000,8.000000]"
              },
              {
                "index": 7,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"DrawingScrollbarBackButtonStart\", rect: [0.000000,210.000000 15.000000x15.000000]"
              },
              {
                "index": 8,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"DrawingScrollbarForwardButtonEnd\", rect: [289.000000,210.000000 15.000000x15.000000]"
              },
              {
                "index": 9,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"DrawingScrollbarBackTrack\", rect: [15.000000,210.000000 67.000000x15.000000]"
              },
              {
                "index": 10,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"DrawingScrollbarForwardTrack\", rect: [82.000000,210.000000 207.000000x15.000000]"
              },
              {
                "index": 11,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"DrawingScrollbarThumb\", rect: [15.000000,210.000000 135.000000x15.000000]"
              },
              {
                "index": 12,
                "properties": "client: \"0x12a167c24150 HorizontalScrollbar\", visualRect: \"18,228 304x15\", type: \"EndTransform\""
              },


Labels: BugSource-User PaintTeamTriaged-20170807
Cc: wangxianzhu@chromium.org
TL;DR = it looks like we are either computing an incorrect clip for this case, or we need to force another invalidation of the scrollbars once layout is complete.

In PaintInvalidationCapableScrollableArea we mark the horizontal scrollbar for invalidation, but when we compute the invalidation rect we start with scrollbar->FrameRect() = (0,210 304x15) and then in ScrollControlVisualRect(), MapLocalRectToVisualRectInBacking() turns it into an empty rect.

Within MapLocalRectToVisualRectInBacking(), GeometryMapper::LocalToAncestorVisualRect() is called with an input rect that looks about right, (8,218 304x15) but produces an empty rect.

GeometryMapper::LocalToAncestorVisualRectInternal() calls SlowLocalToAncestorVisualRectWithEffects() due to local effect node being null and ancestor effect node non-null (it's the root effect node). This computes a new local and ancestor state and calls GeometryMapper::LocalToAncestorVisualRectInternal() recursively.

We then build a transform matrix, map the rect, and:

  mapped_rect = (18,228 304x15).
  clip_rect = (10,10 320x50)
  rect_to_map.Intersect(mapped_rect) = empty rect

In LocalToAncestorClipRectInternal() we hit the first precomputed clip cache while loop and retrieve a cached clip of (10,10 320x50) which we don't further modify before returning. Visually at this point when paused in cgdb the iframe is shown in content shell as a small box 50px high.

So these values actually may be correct, and perhaps we just need to invalidate the scrollbars again subsequently once another layout that incorporates the full size of the iframe is complete, and that's not happening for some reason.
LocalFrameView::UpdateScrollbarGeometry() is called subsequently with the updated frame rect (10,10 320x240) but we don't invalidate the scrollbars on the div within the frame. The cached clip following this is correct as (10,10 320x240) and so I think we're missing an invalidation.
Cc: -wangxianzhu@chromium.org wkorman@chromium.org
Owner: wangxianzhu@chromium.org
Summary: Scrollbar in iframe child div "overflow-x: auto" not painted initially after post-load iframe resize. (was: Scrollbar in overflow element disappears when iframe scrolling="no")
I can repro the horizontal scrollbar issue even without "scrolling='no'" on the iframe tag. Removing that attribute just produces an additional vertical scrollbar that would otherwise be hidden. Also, in some cases adding logging changes timing such that we do paint scrollbars correctly on initial render without mouse hover.

For some reason when the iframe is resized by the setTimeout-delayed height mutation we aren't invalidating the overflowed div. We do invalidate its parent but I'm not seeing why we skip invalidating the child 'target' initially, but we do invalidate it on mouse hover.

Passing to wangxianzhu@ who is more familiar with this area for input.

Adding slightly modified parent/child html without 'scrolling="no"' and with ids added to make it easier to see.
Attaching files intended to be in last comment.
child.html
356 bytes View Download
parent.html
398 bytes View Download
Project Member

Comment 14 by bugdroid1@chromium.org, Oct 18 2017

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/6dfcf90347222e60d56fd65231a2819d0f908c3d

commit 6dfcf90347222e60d56fd65231a2819d0f908c3d
Author: Xianzhu Wang <wangxianzhu@chromium.org>
Date: Wed Oct 18 01:41:54 2017

Ensure update of scrollbar and caret visual rects on ancestor clip change

When an ancestor clip changes, we set kSubtreeVisualRectUpdate to update
descendant visual rects which may be affected by the clip change.
Previously we early returned in PaintInvalidator::InvalidatePaint() for
descendants that had only kSubtreeVisualRectUpdate flag set. This caused
other visual rects (of e.g. scrollbars, carets) that are updated during
LayoutObject::InvalidatePaint() not updated.

Now move the early return from PaintInvalidator::InvalidatePaint() into
ObjectPaintInvalidator::ComputePaintInvalidationReason() to ensure the
visual rects are updated.

Bug:  727155 
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Change-Id: I28f92281363c693b16121f48d21ab4f808990f14
Reviewed-on: https://chromium-review.googlesource.com/719716
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#509648}
[modify] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v2/paint/invalidation/caret-ancestor-clip-change-expected.txt
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/paint/invalidation/caret-ancestor-clip-change-expected.html
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/paint/invalidation/caret-ancestor-clip-change-expected.txt
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/paint/invalidation/caret-ancestor-clip-change.html
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/paint/invalidation/scrollbar-ancestor-clip-change-expected.html
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/paint/invalidation/scrollbar-ancestor-clip-change-expected.txt
[add] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/LayoutTests/paint/invalidation/scrollbar-ancestor-clip-change.html
[modify] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/Source/core/paint/BoxPaintInvalidatorTest.cpp
[modify] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/Source/core/paint/ObjectPaintInvalidator.cpp
[modify] https://crrev.com/6dfcf90347222e60d56fd65231a2819d0f908c3d/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp

Labels: Merge-Request-63
Project Member

Comment 16 by sheriffbot@chromium.org, Oct 19 2017

Labels: -Merge-Request-63 Hotlist-Merge-Approved Merge-Approved-63
Your change meets the bar and is auto-approved for M63. Please go ahead and merge the CL to branch 3239 manually. Please contact milestone owner if you have questions.
Owners: cmasso@(Android), cmasso@(iOS), gkihumba@(ChromeOS), govind@(Desktop)

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
Status: Fixed (was: Assigned)
Project Member

Comment 18 by bugdroid1@chromium.org, Oct 19 2017

Labels: -merge-approved-63 merge-merged-3239
The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/470d6c4b534703585e010cf3db7db1559e573ca6

commit 470d6c4b534703585e010cf3db7db1559e573ca6
Author: Xianzhu Wang <wangxianzhu@chromium.org>
Date: Thu Oct 19 16:18:20 2017

Ensure update of scrollbar and caret visual rects on ancestor clip change

When an ancestor clip changes, we set kSubtreeVisualRectUpdate to update
descendant visual rects which may be affected by the clip change.
Previously we early returned in PaintInvalidator::InvalidatePaint() for
descendants that had only kSubtreeVisualRectUpdate flag set. This caused
other visual rects (of e.g. scrollbars, carets) that are updated during
LayoutObject::InvalidatePaint() not updated.

Now move the early return from PaintInvalidator::InvalidatePaint() into
ObjectPaintInvalidator::ComputePaintInvalidationReason() to ensure the
visual rects are updated.

TBR=wangxianzhu@chromium.org

(cherry picked from commit 6dfcf90347222e60d56fd65231a2819d0f908c3d)

Bug:  727155 
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Change-Id: I28f92281363c693b16121f48d21ab4f808990f14
Reviewed-on: https://chromium-review.googlesource.com/719716
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#509648}
Reviewed-on: https://chromium-review.googlesource.com/728300
Reviewed-by: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/branch-heads/3239@{#66}
Cr-Branched-From: adb61db19020ed8ecee5e91b1a0ea4c924ae2988-refs/heads/master@{#508578}
[modify] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/flag-specific/enable-slimming-paint-v2/paint/invalidation/caret-ancestor-clip-change-expected.txt
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/paint/invalidation/caret-ancestor-clip-change-expected.html
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/paint/invalidation/caret-ancestor-clip-change-expected.txt
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/paint/invalidation/caret-ancestor-clip-change.html
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/paint/invalidation/scrollbar-ancestor-clip-change-expected.html
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/paint/invalidation/scrollbar-ancestor-clip-change-expected.txt
[add] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/LayoutTests/paint/invalidation/scrollbar-ancestor-clip-change.html
[modify] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/Source/core/paint/BoxPaintInvalidatorTest.cpp
[modify] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/Source/core/paint/ObjectPaintInvalidator.cpp
[modify] https://crrev.com/470d6c4b534703585e010cf3db7db1559e573ca6/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp

Sign in to add a comment