|
|
Created:
4 years, 2 months ago by wkorman Modified:
4 years, 2 months ago CC:
blink-reviews, blink-reviews-layout_chromium.org, blink-reviews-paint_chromium.org, chromium-reviews, dshwang, eae+blinkwatch, jchaffraix+rendering, leviw+renderwatch, pdr+renderingwatchlist_chromium.org, szager+layoutwatch_chromium.org, zoltan1 Target Ref:
refs/pending/heads/master Project:
chromium Visibility:
Public. |
DescriptionUse table as display item client for painting composited collapsed table cell borders.
BUG=647809
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Committed: https://crrev.com/1bb139a99a8e140b56c3583cd5d133581a5ed906
Cr-Commit-Position: refs/heads/master@{#426428}
Patch Set 1 #
Total comments: 8
Patch Set 2 : Another test. #Patch Set 3 : Focus on borders. #Patch Set 4 : Add test baselines. #Messages
Total messages: 25 (11 generated)
Description was changed from ========== Use table visual rect when painting composited collapsed table cells. BUG=647809 ========== to ========== Use table visual rect when painting composited collapsed table cells. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 ==========
wkorman@chromium.org changed reviewers: + chrishtr@chromium.org, wangxianzhu@chromium.org
Seeking initial feedback. Notes: - fixes table borders not painting due to incorrect visual rects - does not yet fix partial missing background http://crbug.com/656148 likely due to TODO, see my comment below. - does not fix over-painting of collapsed borders which, for opacity borders like in the background test case (just attached to bug) we see painting 2x so darker than it should be, both with and without this change. I need to check M53 but I currently believe it did not behave this way. Perhaps they were previously clipped somehow? Haven't looked at overpainting at all yet. FF does not exhibit overpainting. https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/paint/TableCellPainter.cpp (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/paint/TableCellPainter.cpp:201: // attempting breaks caching for some reason. Thoughts on why attempting to use displayItemClient() produces caching exception as below when opening composited-background test case (am adding that test to bug as 'git cl upload' is currently down http://crbug.com/657216) and hovering over second row? current display item list: [{index: 0, validClient: false, originalDebugString: {client: "0x3d4051204018 LayoutView #document", type: "DrawingDocumentBackground", rect: [0.000000,0.000000 800.000000x600.000000]}, visualRect: [0,0 800x600]}, {index: 1, client: "0x3d4051214108 LayoutBlockFlow HTML", type: "Subsequence", cacheIsValid: false, visualRect: [0,0 800x151]}, {index: 2, validClient: false, originalDebugString: {client: "0x3d4051224018 LayoutTable TABLE", type: "DrawingBoxDecorationBackground"}, visualRect: [8,8 180x135]}, {index: 3, client: "0x3d4051240630 LayoutTableCell TD", type: "DrawingTableCollapsedBorderRight", rect: [128.000000,75.000000 60.000000x68.000000], cacheIsValid: false, visualRect: [128,75 60x68]}, {index: 4, client: "0x3d40512403c0 LayoutTableCell TD", type: "DrawingTableCollapsedBorderLeft", rect: [8.000000,75.000000 61.000000x68.000000], cacheIsValid: false, visualRect: [8,75 61x68]}, {index: 5, client: "0x3d4051240288 LayoutTableCell TD", type: "DrawingTableCollapsedBorderRight", rect: [128.000000,8.000000 60.000000x68.000000], cacheIsValid: true, visualRect: [128,8 60x68]}, {index: 6, client: "0x3d4051240018 LayoutTableCell TD", type: "DrawingTableCollapsedBorderLeft", rect: [8.000000,8.000000 61.000000x68.000000], cacheIsValid: true, visualRect: [8,8 61x68]}, {index: 7, client: "0x3d4051240630 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [128.000000,75.000000 60.000000x68.000000], cacheIsValid: false, visualRect: [128,75 60x68]}, {index: 8, client: "0x237615cea170 CollapsedBorderValues", type: "DrawingTableCollapsedBorderTopBottom", rect: [69.000000,75.000000 59.000000x68.000000], cacheIsValid: true, visualRect: [8,8 180x135]}, {index: 9, client: "0x3d40512403c0 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [8.000000,75.000000 61.000000x68.000000], cacheIsValid: false, visualRect: [8,75 61x68]}, {index: 10, client: "0x3d4051240288 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [128.000000,8.000000 60.000000x68.000000], cacheIsValid: true, visualRect: [128,8 60x68]}, {index: 11, client: "0x3d4051240150 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [69.000000,8.000000 59.000000x68.000000], cacheIsValid: true, visualRect: [69,8 59x68]}, {index: 12, client: "0x3d4051240018 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [8.000000,8.000000 61.000000x68.000000], cacheIsValid: true, visualRect: [8,8 61x68]}, {index: 13, client: "0x3d4051254010 InlineTextBox 'A'", type: "DrawingPaintPhaseForeground", rect: [33.000000,33.000000 12.000000x17.000000], cacheIsValid: true, visualRect: [33,33 12x17]}, {index: 14, client: "0x3d4051254088 InlineTextBox 'B'", type: "DrawingPaintPhaseForeground", rect: [93.000000,33.000000 11.000000x17.000000], cacheIsValid: true, visualRect: [93,33 11x17]}, {index: 15, client: "0x3d4051254100 InlineTextBox 'C'", type: "DrawingPaintPhaseForeground", rect: [152.000000,33.000000 11.000000x17.000000], cacheIsValid: true, visualRect: [152,33 11x17]}, {index: 16, client: "0x3d4051254178 InlineTextBox 'D'", type: "DrawingPaintPhaseForeground", rect: [33.000000,100.000000 12.000000x17.000000], cacheIsValid: true, visualRect: [33,100 12x17]}, {index: 17, client: "0x3d4051254268 InlineTextBox 'F'", type: "DrawingPaintPhaseForeground", rect: [152.000000,100.000000 9.000000x17.000000], cacheIsValid: true, visualRect: [152,100 9x17]}, {index: 18, client: "0x3d4051214108 LayoutBlockFlow HTML", type: "EndSubsequence", cacheIsValid: false, visualRect: [0,0 800x151]}] new display item list: [{index: 0, client: "0x3d4051204018 LayoutView #document", type: "DrawingDocumentBackground", rect: [0.000000,0.000000 800.000000x600.000000], cacheIsValid: true}, {index: 1, client: "0x3d4051214108 LayoutBlockFlow HTML", type: "Subsequence", cacheIsValid: false}, {index: 2, client: "0x3d4051224018 LayoutTable TABLE", type: "DrawingBoxDecorationBackground", cacheIsValid: true}, {index: 3, client: "0x3d40512403c0 LayoutTableCell TD", type: "DrawingTableCellBackgroundFromRow", rect: [8.000000,75.000000 61.000000x67.000000], cacheIsValid: false}] [1:1:1018/174030:2872274298387:ERROR:PaintController.cpp(382)] "CollapsedBorderValues":"DrawingTableCellBackgroundFromRow" [1:1:1018/174030:2872274298756:FATAL:PaintController.cpp(56)] Check failed: false. #0 0x7fea21ad6b3e base::debug::StackTrace::StackTrace() #1 0x7fea21b45e6f logging::LogMessage::~LogMessage() #2 0x7fea1c80d96a blink::PaintController::useCachedDrawingIfPossible() #3 0x7fea193d142b blink::DrawingRecorder::useCachedDrawingIfPossible() #4 0x7fea19ebaa22 blink::TableCellPainter::paintContainerBackgroundBehindCell() #5 0x7fea19ebcaf0 blink::TableRowPainter::paintBackgroundBehindCell() #6 0x7fea19ebdb2f blink::TableSectionPainter::paintObject() #7 0x7fea19ebd5e2 blink::TableSectionPainter::paintSection() #8 0x7fea19ebd6a7 blink::TableSectionPainter::paint() #9 0x7fea19c06155 blink::LayoutTableSection::paint() #10 0x7fea19ebbb40 blink::TablePainter::paintObject() #11 0x7fea19beb995 blink::LayoutTable::paintObject() #12 0x7fea19e12696 blink::BlockPainter::paint() #13 0x7fea19ad8995 blink::LayoutBlock::paint() #14 0x7fea19e12c2a blink::BlockPainter::paintChild() #15 0x7fea19e12b7b blink::BlockPainter::paintChildren() #16 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() #17 0x7fea19e137f1 blink::BlockPainter::paintContents() #18 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() #19 0x7fea19e13578 blink::BlockPainter::paintObject() #20 0x7fea19ad8a15 blink::LayoutBlock::paintObject() #21 0x7fea19e12696 blink::BlockPainter::paint() #22 0x7fea19ad8995 blink::LayoutBlock::paint() #23 0x7fea19e12c2a blink::BlockPainter::paintChild() #24 0x7fea19e12b7b blink::BlockPainter::paintChildren() #25 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() #26 0x7fea19e137f1 blink::BlockPainter::paintContents() #27 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() #28 0x7fea19e13578 blink::BlockPainter::paintObject() #29 0x7fea19ad8a15 blink::LayoutBlock::paintObject() #30 0x7fea19e12696 blink::BlockPainter::paint() #31 0x7fea19ad8995 blink::LayoutBlock::paint() #32 0x7fea19e7ad5c blink::PaintLayerPainter::paintFragmentWithPhase() #33 0x7fea19e7ae91 blink::PaintLayerPainter::paintForegroundForFragmentsWithPhase() #34 0x7fea19e79aa3 blink::PaintLayerPainter::paintForegroundForFragments() #35 0x7fea19e78c1f blink::PaintLayerPainter::paintLayerContents() #36 0x7fea19e77b06 blink::PaintLayerPainter::paintLayerContentsCompositingAllPhases() #37 0x7fea19e76f46 blink::PaintLayerPainter::paintLayer() #38 0x7fea19e796ae blink::PaintLayerPainter::paintChildren() #39 0x7fea19e78c84 blink::PaintLayerPainter::paintLayerContents() #40 0x7fea19c6cfec blink::CompositedLayerMapping::doPaintTask() #41 0x7fea19c6e292 blink::CompositedLayerMapping::paintContents() #42 0x7fea1c6d883d blink::GraphicsLayer::paintWithoutCommit() #43 0x7fea1c6d846f blink::GraphicsLayer::paint() #44 0x7fea19612fdd blink::FrameView::synchronizedPaintRecursively() #45 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #46 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #47 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #48 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #49 0x7fea19612648 blink::FrameView::synchronizedPaint() #50 0x7fea196110eb blink::FrameView::updateLifecyclePhasesInternal() #51 0x7fea196108f2 blink::FrameView::updateAllLifecyclePhases() #52 0x7fea19ddb21a blink::PageAnimator::updateAllLifecyclePhases() #53 0x7fea1c0d3bd5 blink::PageWidgetDelegate::updateAllLifecyclePhases() #54 0x7fea1c1c44b1 blink::WebViewImpl::updateAllLifecyclePhases() #55 0x7fea1c1bace1 blink::WebViewFrameWidget::updateAllLifecyclePhases() #56 0x7fea2463a5c7 content::RenderWidget::UpdateVisualState() #57 0x7fea2448806a content::RenderWidgetCompositor::UpdateLayerTreeHost() #58 0x7fea1e7195ca cc::LayerTreeHostInProcess::RequestMainFrameUpdate() #59 0x7fea1e794cec cc::ProxyMain::BeginMainFrame() #60 0x7fea1e7c1644 _ZN4base8internal13FunctorTraitsIMN2cc9ProxyMainEFvSt10unique_ptrINS2_28BeginMainFrameAndCommitStateESt14default_deleteIS5_EEEvE6InvokeIRKNS_7WeakPtrIS3_EEJS8_EEEvSA_OT_DpOT0_ #61 0x7fea1e7c150f _ZN4base8internal12InvokeHelperILb1EvE8MakeItSoIRKMN2cc9ProxyMainEFvSt10unique_ptrINS4_28BeginMainFrameAndCommitStateESt14default_deleteIS7_EEERKNS_7WeakPtrIS5_EEJSA_EEEvOT_OT0_DpOT1_ Received signal 6 #0 0x7fea21ad6b3e base::debug::StackTrace::StackTrace() #1 0x7fea21ad667f base::debug::(anonymous namespace)::StackDumpSignalHandler() #2 0x7fea2693f330 <unknown> #3 0x7fea1510ac37 gsignal #4 0x7fea1510e028 abort #5 0x7fea21ad3156 base::debug::(anonymous namespace)::DebugBreak() #6 0x7fea21ad3138 base::debug::BreakDebugger() #7 0x7fea21b461bd logging::LogMessage::~LogMessage() #8 0x7fea1c80d96a blink::PaintController::useCachedDrawingIfPossible() #9 0x7fea193d142b blink::DrawingRecorder::useCachedDrawingIfPossible() #10 0x7fea19ebaa22 blink::TableCellPainter::paintContainerBackgroundBehindCell() #11 0x7fea19ebcaf0 blink::TableRowPainter::paintBackgroundBehindCell() #12 0x7fea19ebdb2f blink::TableSectionPainter::paintObject() #13 0x7fea19ebd5e2 blink::TableSectionPainter::paintSection() #14 0x7fea19ebd6a7 blink::TableSectionPainter::paint() #15 0x7fea19c06155 blink::LayoutTableSection::paint() #16 0x7fea19ebbb40 blink::TablePainter::paintObject() #17 0x7fea19beb995 blink::LayoutTable::paintObject() #18 0x7fea19e12696 blink::BlockPainter::paint() #19 0x7fea19ad8995 blink::LayoutBlock::paint() #20 0x7fea19e12c2a blink::BlockPainter::paintChild() #21 0x7fea19e12b7b blink::BlockPainter::paintChildren() #22 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() #23 0x7fea19e137f1 blink::BlockPainter::paintContents() #24 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() #25 0x7fea19e13578 blink::BlockPainter::paintObject() #26 0x7fea19ad8a15 blink::LayoutBlock::paintObject() #27 0x7fea19e12696 blink::BlockPainter::paint() #28 0x7fea19ad8995 blink::LayoutBlock::paint() #29 0x7fea19e12c2a blink::BlockPainter::paintChild() #30 0x7fea19e12b7b blink::BlockPainter::paintChildren() #31 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() #32 0x7fea19e137f1 blink::BlockPainter::paintContents() #33 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() #34 0x7fea19e13578 blink::BlockPainter::paintObject() #35 0x7fea19ad8a15 blink::LayoutBlock::paintObject() #36 0x7fea19e12696 blink::BlockPainter::paint() #37 0x7fea19ad8995 blink::LayoutBlock::paint() #38 0x7fea19e7ad5c blink::PaintLayerPainter::paintFragmentWithPhase() #39 0x7fea19e7ae91 blink::PaintLayerPainter::paintForegroundForFragmentsWithPhase() #40 0x7fea19e79aa3 blink::PaintLayerPainter::paintForegroundForFragments() #41 0x7fea19e78c1f blink::PaintLayerPainter::paintLayerContents() #42 0x7fea19e77b06 blink::PaintLayerPainter::paintLayerContentsCompositingAllPhases() #43 0x7fea19e76f46 blink::PaintLayerPainter::paintLayer() #44 0x7fea19e796ae blink::PaintLayerPainter::paintChildren() #45 0x7fea19e78c84 blink::PaintLayerPainter::paintLayerContents() #46 0x7fea19c6cfec blink::CompositedLayerMapping::doPaintTask() #47 0x7fea19c6e292 blink::CompositedLayerMapping::paintContents() #48 0x7fea1c6d883d blink::GraphicsLayer::paintWithoutCommit() #49 0x7fea1c6d846f blink::GraphicsLayer::paint() #50 0x7fea19612fdd blink::FrameView::synchronizedPaintRecursively() #51 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #52 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #53 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #54 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() #55 0x7fea19612648 blink::FrameView::synchronizedPaint() #56 0x7fea196110eb blink::FrameView::updateLifecyclePhasesInternal() #57 0x7fea196108f2 blink::FrameView::updateAllLifecyclePhases() #58 0x7fea19ddb21a blink::PageAnimator::updateAllLifecyclePhases() #59 0x7fea1c0d3bd5 blink::PageWidgetDelegate::updateAllLifecyclePhases() #60 0x7fea1c1c44b1 blink::WebViewImpl::updateAllLifecyclePhases() #61 0x7fea1c1bace1 blink::WebViewFrameWidget::updateAllLifecyclePhases() r8: 00007ffc1ed56730 r9: 00007fea15224a00 r10: 0000000000000008 r11: 0000000000000202 r12: 0000000000486c1c r13: 00007ffc1ed5ecf0 r14: 0000000000000001 r15: 0000000000000000 di: 0000000000000001 si: 0000000000000001 bp: 00007ffc1ed56b00 bx: 00007ffc1ed59d78 dx: 0000000000000006 ax: 0000000000000000 cx: ffffffffffffffff sp: 00007ffc1ed569c8 ip: 00007fea1510ac37 efl: 0000000000000202 cgf: 0000000000000033 erf: 0000000000000000 trp: 0000000000000000 msk: 0000000000000000 cr2: 0000000000000000 [end of stack trace]
https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/layout/LayoutTableCell.cpp (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/layout/LayoutTableCell.cpp:1425: return (hasLayer() && layer()->compositingState() != NotComposited) || Add a note explaining this conditional. https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/layout/LayoutTableCell.h (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/layout/LayoutTableCell.h:320: bool usesTableAsDisplayItemClient() const; usesTableAsAdditionalDisplayItemClient() https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/paint/TableCellPainter.cpp (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/paint/TableCellPainter.cpp:72: const DisplayItemClient& TableCellPainter::displayItemClient() const { The collapsed border values should only be used as DisplayItemClient for DisplayItems used to paint collapsed borders. Perhaps your CL already does that, but this name doesn't clearly indicate it. https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/paint/TableCellPainter.cpp:201: // attempting breaks caching for some reason. On 2016/10/19 at 00:52:43, wkorman wrote: > Thoughts on why attempting to use displayItemClient() produces caching exception as below when opening composited-background test case (am adding that test to bug as 'git cl upload' is currently down http://crbug.com/657216) and hovering over second row? > > current display item list: [{index: 0, validClient: false, originalDebugString: {client: "0x3d4051204018 LayoutView #document", type: "DrawingDocumentBackground", rect: [0.000000,0.000000 800.000000x600.000000]}, visualRect: [0,0 800x600]}, > {index: 1, client: "0x3d4051214108 LayoutBlockFlow HTML", type: "Subsequence", cacheIsValid: false, visualRect: [0,0 800x151]}, > {index: 2, validClient: false, originalDebugString: {client: "0x3d4051224018 LayoutTable TABLE", type: "DrawingBoxDecorationBackground"}, visualRect: [8,8 180x135]}, > {index: 3, client: "0x3d4051240630 LayoutTableCell TD", type: "DrawingTableCollapsedBorderRight", rect: [128.000000,75.000000 60.000000x68.000000], cacheIsValid: false, visualRect: [128,75 60x68]}, > {index: 4, client: "0x3d40512403c0 LayoutTableCell TD", type: "DrawingTableCollapsedBorderLeft", rect: [8.000000,75.000000 61.000000x68.000000], cacheIsValid: false, visualRect: [8,75 61x68]}, > {index: 5, client: "0x3d4051240288 LayoutTableCell TD", type: "DrawingTableCollapsedBorderRight", rect: [128.000000,8.000000 60.000000x68.000000], cacheIsValid: true, visualRect: [128,8 60x68]}, > {index: 6, client: "0x3d4051240018 LayoutTableCell TD", type: "DrawingTableCollapsedBorderLeft", rect: [8.000000,8.000000 61.000000x68.000000], cacheIsValid: true, visualRect: [8,8 61x68]}, > {index: 7, client: "0x3d4051240630 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [128.000000,75.000000 60.000000x68.000000], cacheIsValid: false, visualRect: [128,75 60x68]}, > {index: 8, client: "0x237615cea170 CollapsedBorderValues", type: "DrawingTableCollapsedBorderTopBottom", rect: [69.000000,75.000000 59.000000x68.000000], cacheIsValid: true, visualRect: [8,8 180x135]}, > {index: 9, client: "0x3d40512403c0 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [8.000000,75.000000 61.000000x68.000000], cacheIsValid: false, visualRect: [8,75 61x68]}, > {index: 10, client: "0x3d4051240288 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [128.000000,8.000000 60.000000x68.000000], cacheIsValid: true, visualRect: [128,8 60x68]}, > {index: 11, client: "0x3d4051240150 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [69.000000,8.000000 59.000000x68.000000], cacheIsValid: true, visualRect: [69,8 59x68]}, > {index: 12, client: "0x3d4051240018 LayoutTableCell TD", type: "DrawingTableCollapsedBorderTopBottom", rect: [8.000000,8.000000 61.000000x68.000000], cacheIsValid: true, visualRect: [8,8 61x68]}, > {index: 13, client: "0x3d4051254010 InlineTextBox 'A'", type: "DrawingPaintPhaseForeground", rect: [33.000000,33.000000 12.000000x17.000000], cacheIsValid: true, visualRect: [33,33 12x17]}, > {index: 14, client: "0x3d4051254088 InlineTextBox 'B'", type: "DrawingPaintPhaseForeground", rect: [93.000000,33.000000 11.000000x17.000000], cacheIsValid: true, visualRect: [93,33 11x17]}, > {index: 15, client: "0x3d4051254100 InlineTextBox 'C'", type: "DrawingPaintPhaseForeground", rect: [152.000000,33.000000 11.000000x17.000000], cacheIsValid: true, visualRect: [152,33 11x17]}, > {index: 16, client: "0x3d4051254178 InlineTextBox 'D'", type: "DrawingPaintPhaseForeground", rect: [33.000000,100.000000 12.000000x17.000000], cacheIsValid: true, visualRect: [33,100 12x17]}, > {index: 17, client: "0x3d4051254268 InlineTextBox 'F'", type: "DrawingPaintPhaseForeground", rect: [152.000000,100.000000 9.000000x17.000000], cacheIsValid: true, visualRect: [152,100 9x17]}, > {index: 18, client: "0x3d4051214108 LayoutBlockFlow HTML", type: "EndSubsequence", cacheIsValid: false, visualRect: [0,0 800x151]}] > new display item list: [{index: 0, client: "0x3d4051204018 LayoutView #document", type: "DrawingDocumentBackground", rect: [0.000000,0.000000 800.000000x600.000000], cacheIsValid: true}, > {index: 1, client: "0x3d4051214108 LayoutBlockFlow HTML", type: "Subsequence", cacheIsValid: false}, > {index: 2, client: "0x3d4051224018 LayoutTable TABLE", type: "DrawingBoxDecorationBackground", cacheIsValid: true}, > {index: 3, client: "0x3d40512403c0 LayoutTableCell TD", type: "DrawingTableCellBackgroundFromRow", rect: [8.000000,75.000000 61.000000x67.000000], cacheIsValid: false}] > [1:1:1018/174030:2872274298387:ERROR:PaintController.cpp(382)] "CollapsedBorderValues":"DrawingTableCellBackgroundFromRow" > [1:1:1018/174030:2872274298756:FATAL:PaintController.cpp(56)] Check failed: false. > #0 0x7fea21ad6b3e base::debug::StackTrace::StackTrace() > #1 0x7fea21b45e6f logging::LogMessage::~LogMessage() > #2 0x7fea1c80d96a blink::PaintController::useCachedDrawingIfPossible() > #3 0x7fea193d142b blink::DrawingRecorder::useCachedDrawingIfPossible() > #4 0x7fea19ebaa22 blink::TableCellPainter::paintContainerBackgroundBehindCell() > #5 0x7fea19ebcaf0 blink::TableRowPainter::paintBackgroundBehindCell() > #6 0x7fea19ebdb2f blink::TableSectionPainter::paintObject() > #7 0x7fea19ebd5e2 blink::TableSectionPainter::paintSection() > #8 0x7fea19ebd6a7 blink::TableSectionPainter::paint() > #9 0x7fea19c06155 blink::LayoutTableSection::paint() > #10 0x7fea19ebbb40 blink::TablePainter::paintObject() > #11 0x7fea19beb995 blink::LayoutTable::paintObject() > #12 0x7fea19e12696 blink::BlockPainter::paint() > #13 0x7fea19ad8995 blink::LayoutBlock::paint() > #14 0x7fea19e12c2a blink::BlockPainter::paintChild() > #15 0x7fea19e12b7b blink::BlockPainter::paintChildren() > #16 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() > #17 0x7fea19e137f1 blink::BlockPainter::paintContents() > #18 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() > #19 0x7fea19e13578 blink::BlockPainter::paintObject() > #20 0x7fea19ad8a15 blink::LayoutBlock::paintObject() > #21 0x7fea19e12696 blink::BlockPainter::paint() > #22 0x7fea19ad8995 blink::LayoutBlock::paint() > #23 0x7fea19e12c2a blink::BlockPainter::paintChild() > #24 0x7fea19e12b7b blink::BlockPainter::paintChildren() > #25 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() > #26 0x7fea19e137f1 blink::BlockPainter::paintContents() > #27 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() > #28 0x7fea19e13578 blink::BlockPainter::paintObject() > #29 0x7fea19ad8a15 blink::LayoutBlock::paintObject() > #30 0x7fea19e12696 blink::BlockPainter::paint() > #31 0x7fea19ad8995 blink::LayoutBlock::paint() > #32 0x7fea19e7ad5c blink::PaintLayerPainter::paintFragmentWithPhase() > #33 0x7fea19e7ae91 blink::PaintLayerPainter::paintForegroundForFragmentsWithPhase() > #34 0x7fea19e79aa3 blink::PaintLayerPainter::paintForegroundForFragments() > #35 0x7fea19e78c1f blink::PaintLayerPainter::paintLayerContents() > #36 0x7fea19e77b06 blink::PaintLayerPainter::paintLayerContentsCompositingAllPhases() > #37 0x7fea19e76f46 blink::PaintLayerPainter::paintLayer() > #38 0x7fea19e796ae blink::PaintLayerPainter::paintChildren() > #39 0x7fea19e78c84 blink::PaintLayerPainter::paintLayerContents() > #40 0x7fea19c6cfec blink::CompositedLayerMapping::doPaintTask() > #41 0x7fea19c6e292 blink::CompositedLayerMapping::paintContents() > #42 0x7fea1c6d883d blink::GraphicsLayer::paintWithoutCommit() > #43 0x7fea1c6d846f blink::GraphicsLayer::paint() > #44 0x7fea19612fdd blink::FrameView::synchronizedPaintRecursively() > #45 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #46 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #47 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #48 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #49 0x7fea19612648 blink::FrameView::synchronizedPaint() > #50 0x7fea196110eb blink::FrameView::updateLifecyclePhasesInternal() > #51 0x7fea196108f2 blink::FrameView::updateAllLifecyclePhases() > #52 0x7fea19ddb21a blink::PageAnimator::updateAllLifecyclePhases() > #53 0x7fea1c0d3bd5 blink::PageWidgetDelegate::updateAllLifecyclePhases() > #54 0x7fea1c1c44b1 blink::WebViewImpl::updateAllLifecyclePhases() > #55 0x7fea1c1bace1 blink::WebViewFrameWidget::updateAllLifecyclePhases() > #56 0x7fea2463a5c7 content::RenderWidget::UpdateVisualState() > #57 0x7fea2448806a content::RenderWidgetCompositor::UpdateLayerTreeHost() > #58 0x7fea1e7195ca cc::LayerTreeHostInProcess::RequestMainFrameUpdate() > #59 0x7fea1e794cec cc::ProxyMain::BeginMainFrame() > #60 0x7fea1e7c1644 _ZN4base8internal13FunctorTraitsIMN2cc9ProxyMainEFvSt10unique_ptrINS2_28BeginMainFrameAndCommitStateESt14default_deleteIS5_EEEvE6InvokeIRKNS_7WeakPtrIS3_EEJS8_EEEvSA_OT_DpOT0_ > #61 0x7fea1e7c150f _ZN4base8internal12InvokeHelperILb1EvE8MakeItSoIRKMN2cc9ProxyMainEFvSt10unique_ptrINS4_28BeginMainFrameAndCommitStateESt14default_deleteIS7_EEERKNS_7WeakPtrIS5_EEJSA_EEEvOT_OT0_DpOT1_ > > Received signal 6 > #0 0x7fea21ad6b3e base::debug::StackTrace::StackTrace() > #1 0x7fea21ad667f base::debug::(anonymous namespace)::StackDumpSignalHandler() > #2 0x7fea2693f330 <unknown> > #3 0x7fea1510ac37 gsignal > #4 0x7fea1510e028 abort > #5 0x7fea21ad3156 base::debug::(anonymous namespace)::DebugBreak() > #6 0x7fea21ad3138 base::debug::BreakDebugger() > #7 0x7fea21b461bd logging::LogMessage::~LogMessage() > #8 0x7fea1c80d96a blink::PaintController::useCachedDrawingIfPossible() > #9 0x7fea193d142b blink::DrawingRecorder::useCachedDrawingIfPossible() > #10 0x7fea19ebaa22 blink::TableCellPainter::paintContainerBackgroundBehindCell() > #11 0x7fea19ebcaf0 blink::TableRowPainter::paintBackgroundBehindCell() > #12 0x7fea19ebdb2f blink::TableSectionPainter::paintObject() > #13 0x7fea19ebd5e2 blink::TableSectionPainter::paintSection() > #14 0x7fea19ebd6a7 blink::TableSectionPainter::paint() > #15 0x7fea19c06155 blink::LayoutTableSection::paint() > #16 0x7fea19ebbb40 blink::TablePainter::paintObject() > #17 0x7fea19beb995 blink::LayoutTable::paintObject() > #18 0x7fea19e12696 blink::BlockPainter::paint() > #19 0x7fea19ad8995 blink::LayoutBlock::paint() > #20 0x7fea19e12c2a blink::BlockPainter::paintChild() > #21 0x7fea19e12b7b blink::BlockPainter::paintChildren() > #22 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() > #23 0x7fea19e137f1 blink::BlockPainter::paintContents() > #24 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() > #25 0x7fea19e13578 blink::BlockPainter::paintObject() > #26 0x7fea19ad8a15 blink::LayoutBlock::paintObject() > #27 0x7fea19e12696 blink::BlockPainter::paint() > #28 0x7fea19ad8995 blink::LayoutBlock::paint() > #29 0x7fea19e12c2a blink::BlockPainter::paintChild() > #30 0x7fea19e12b7b blink::BlockPainter::paintChildren() > #31 0x7fea19ad89d5 blink::LayoutBlock::paintChildren() > #32 0x7fea19e137f1 blink::BlockPainter::paintContents() > #33 0x7fea19e11d83 blink::BlockFlowPainter::paintContents() > #34 0x7fea19e13578 blink::BlockPainter::paintObject() > #35 0x7fea19ad8a15 blink::LayoutBlock::paintObject() > #36 0x7fea19e12696 blink::BlockPainter::paint() > #37 0x7fea19ad8995 blink::LayoutBlock::paint() > #38 0x7fea19e7ad5c blink::PaintLayerPainter::paintFragmentWithPhase() > #39 0x7fea19e7ae91 blink::PaintLayerPainter::paintForegroundForFragmentsWithPhase() > #40 0x7fea19e79aa3 blink::PaintLayerPainter::paintForegroundForFragments() > #41 0x7fea19e78c1f blink::PaintLayerPainter::paintLayerContents() > #42 0x7fea19e77b06 blink::PaintLayerPainter::paintLayerContentsCompositingAllPhases() > #43 0x7fea19e76f46 blink::PaintLayerPainter::paintLayer() > #44 0x7fea19e796ae blink::PaintLayerPainter::paintChildren() > #45 0x7fea19e78c84 blink::PaintLayerPainter::paintLayerContents() > #46 0x7fea19c6cfec blink::CompositedLayerMapping::doPaintTask() > #47 0x7fea19c6e292 blink::CompositedLayerMapping::paintContents() > #48 0x7fea1c6d883d blink::GraphicsLayer::paintWithoutCommit() > #49 0x7fea1c6d846f blink::GraphicsLayer::paint() > #50 0x7fea19612fdd blink::FrameView::synchronizedPaintRecursively() > #51 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #52 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #53 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #54 0x7fea19613086 blink::FrameView::synchronizedPaintRecursively() > #55 0x7fea19612648 blink::FrameView::synchronizedPaint() > #56 0x7fea196110eb blink::FrameView::updateLifecyclePhasesInternal() > #57 0x7fea196108f2 blink::FrameView::updateAllLifecyclePhases() > #58 0x7fea19ddb21a blink::PageAnimator::updateAllLifecyclePhases() > #59 0x7fea1c0d3bd5 blink::PageWidgetDelegate::updateAllLifecyclePhases() > #60 0x7fea1c1c44b1 blink::WebViewImpl::updateAllLifecyclePhases() > #61 0x7fea1c1bace1 blink::WebViewFrameWidget::updateAllLifecyclePhases() > r8: 00007ffc1ed56730 r9: 00007fea15224a00 r10: 0000000000000008 r11: 0000000000000202 > r12: 0000000000486c1c r13: 00007ffc1ed5ecf0 r14: 0000000000000001 r15: 0000000000000000 > di: 0000000000000001 si: 0000000000000001 bp: 00007ffc1ed56b00 bx: 00007ffc1ed59d78 > dx: 0000000000000006 ax: 0000000000000000 cx: ffffffffffffffff sp: 00007ffc1ed569c8 > ip: 00007fea1510ac37 efl: 0000000000000202 cgf: 0000000000000033 erf: 0000000000000000 > trp: 0000000000000000 msk: 0000000000000000 cr2: 0000000000000000 > [end of stack trace] I think you might be accidentally painting into the incorrect GraphicsLayer. Each GraphicsLayer has its own PaintController. Maybe this is related to my other comment about using the right DisplayItemClient?
On 2016/10/19 00:52:43, wkorman wrote: > Seeking initial feedback. Notes: > - fixes table borders not painting due to incorrect visual rects > - does not yet fix partial missing background http://crbug.com/656148 likely due > to TODO, see my comment below. > - does not fix over-painting of collapsed borders which, for opacity borders > like in the background test case (just attached to bug) we see painting 2x so > darker than it should be, both with and without this change. I need to check M53 > but I currently believe it did not behave this way. Perhaps they were previously > clipped somehow? Haven't looked at overpainting at all yet. FF does not exhibit > overpainting. I believe this is our current behavior. We paint each shared collapsed border twice by both adjacent cells so translucent borders will look darker. > > https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... > File third_party/WebKit/Source/core/paint/TableCellPainter.cpp (right): > > https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... > third_party/WebKit/Source/core/paint/TableCellPainter.cpp:201: // attempting > breaks caching for some reason. > Thoughts on why attempting to use displayItemClient() produces caching exception > as below when opening composited-background test case (am adding that test to > bug as 'git cl upload' is currently down http://crbug.com/657216) and hovering > over second row? > Is this about the same test case attached in bug 647809?
About the CL: will we re-raster the whole table when a single cell changes border? If we accept this, I would suggest to output all collapsed borders of a table as one display item. I'm still testing this, and found that it actually improves performance in some cases because of much small number of display items. Sometimes repainting all collapsed borders cost less than caching all individual display items of collapsed borders and repaint only one of them. I also found that it causes high cost of cc solid color analysis. Discussing the issue with vmpstr. Will provide more performance data soon. On 2016/10/19 01:13:21, chrishtr wrote: > I think you might be accidentally painting into the incorrect GraphicsLayer. > Each GraphicsLayer has its own PaintController. > Maybe this is related to my other comment about using the right > DisplayItemClient? Now we use client-side flag for display item client invalidation, instead of invalidating it on a particular PaintController. Once a DisplayItemClient is invalidated, it is treated as invalidated on all PaintControllers. Also when a DisplayItemClient is validated by a PaintController, the client is valid for this PaintController only. This looks like a real under-invalidation of the DisplayItemClient. Based on code, we do invalidate cells when row background changes. We might miss it for some corner cases.
On 2016/10/19 01:39:54, Xianzhu wrote: > About the CL: will we re-raster the whole table when a single cell changes > border? If we accept this, I would suggest to output all collapsed borders of a > table as one display item. I'm still testing this, and found that it actually > improves performance in some cases because of much small number of display > items. Sometimes repainting all collapsed borders cost less than caching all > individual display items of collapsed borders and repaint only one of them. With this change I believe that if a composited collapsed-border table cell's border style changes then, yes, we would invalidate and re-raster the whole table. From discussion with chrishtr@ and considering alternate options noted in bug linked to this change we believe this would be an acceptable performance hit for now. In meantime we should continue exploring your change as it sounds promising. > This looks like a real under-invalidation of the DisplayItemClient. Based on > code, we do invalidate cells when row background changes. We might miss it for > some corner cases. I am going to refocus this current change on just fixing borders and will look at row background separately. It does look like we have an incorrect visual rect for same reason for painting row background, which happens via TableRowPainter::paint -> TableCellPainter::paintContainerBackgroundBehindCell.
https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/layout/LayoutTableCell.cpp (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/layout/LayoutTableCell.cpp:1425: return (hasLayer() && layer()->compositingState() != NotComposited) || On 2016/10/19 01:13:21, chrishtr wrote: > Add a note explaining this conditional. Done. https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/layout/LayoutTableCell.h (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/layout/LayoutTableCell.h:320: bool usesTableAsDisplayItemClient() const; On 2016/10/19 01:13:21, chrishtr wrote: > usesTableAsAdditionalDisplayItemClient() Done. https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... File third_party/WebKit/Source/core/paint/TableCellPainter.cpp (right): https://codereview.chromium.org/2432663002/diff/1/third_party/WebKit/Source/c... third_party/WebKit/Source/core/paint/TableCellPainter.cpp:72: const DisplayItemClient& TableCellPainter::displayItemClient() const { On 2016/10/19 01:13:21, chrishtr wrote: > The collapsed border values should only be used as DisplayItemClient for > DisplayItems used to paint collapsed borders. Perhaps your CL already does > that, but this name doesn't clearly indicate it. Done.
The CQ bit was checked by wkorman@chromium.org to run a CQ dry run
Description was changed from ========== Use table visual rect when painting composited collapsed table cells. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 ========== to ========== Use table as display item client for painting composited collapsed table cell borders. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 ==========
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
lgtm
On 2016/10/19 at 22:49:53, wkorman wrote: > On 2016/10/19 01:39:54, Xianzhu wrote: > > About the CL: will we re-raster the whole table when a single cell changes > > border? If we accept this, I would suggest to output all collapsed borders of a > > table as one display item. I'm still testing this, and found that it actually > > improves performance in some cases because of much small number of display > > items. Sometimes repainting all collapsed borders cost less than caching all > > individual display items of collapsed borders and repaint only one of them. > > With this change I believe that if a composited collapsed-border table cell's border style changes then, yes, we would invalidate and re-raster the whole table. > > From discussion with chrishtr@ and considering alternate options noted in bug linked to this change we believe this would be an acceptable performance hit for now. In meantime we should continue exploring your change as it sounds promising. What is the advantage over Xianzhu's alternate approach of using the table as the DIC then? > > > This looks like a real under-invalidation of the DisplayItemClient. Based on > > code, we do invalidate cells when row background changes. We might miss it for > > some corner cases. > > I am going to refocus this current change on just fixing borders and will look at row background separately. It does look like we have an incorrect visual rect for same reason for painting row background, which happens via TableRowPainter::paint -> TableCellPainter::paintContainerBackgroundBehindCell.
On 2016/10/19 23:09:54, chrishtr wrote: > On 2016/10/19 at 22:49:53, wkorman wrote: > > On 2016/10/19 01:39:54, Xianzhu wrote: > > > About the CL: will we re-raster the whole table when a single cell changes > > > border? If we accept this, I would suggest to output all collapsed borders > of a > > > table as one display item. I'm still testing this, and found that it > actually > > > improves performance in some cases because of much small number of display > > > items. Sometimes repainting all collapsed borders cost less than caching all > > > individual display items of collapsed borders and repaint only one of them. > > > > With this change I believe that if a composited collapsed-border table cell's > border style changes then, yes, we would invalidate and re-raster the whole > table. > > > > From discussion with chrishtr@ and considering alternate options noted in bug > linked to this change we believe this would be an acceptable performance hit for > now. In meantime we should continue exploring your change as it sounds > promising. > > What is the advantage over Xianzhu's alternate approach of using the table as > the DIC then? > What I think of: 1. This CL is much smaller than mine, and is easier and safer to merge; 2. This CL affects performance for tables containing composited cells only which is not a common case, so less risky for performance. > > > > > This looks like a real under-invalidation of the DisplayItemClient. Based on > > > code, we do invalidate cells when row background changes. We might miss it > for > > > some corner cases. > > > > I am going to refocus this current change on just fixing borders and will look > at row background separately. It does look like we have an incorrect visual rect > for same reason for painting row background, which happens via > TableRowPainter::paint -> TableCellPainter::paintContainerBackgroundBehindCell.
On 2016/10/19 23:09:54, chrishtr wrote: > On 2016/10/19 at 22:49:53, wkorman wrote: > > On 2016/10/19 01:39:54, Xianzhu wrote: > > > About the CL: will we re-raster the whole table when a single cell changes > > > border? If we accept this, I would suggest to output all collapsed borders > of a > > > table as one display item. I'm still testing this, and found that it > actually > > > improves performance in some cases because of much small number of display > > > items. Sometimes repainting all collapsed borders cost less than caching all > > > individual display items of collapsed borders and repaint only one of them. > > > > With this change I believe that if a composited collapsed-border table cell's > border style changes then, yes, we would invalidate and re-raster the whole > table. > > > > From discussion with chrishtr@ and considering alternate options noted in bug > linked to this change we believe this would be an acceptable performance hit for > now. In meantime we should continue exploring your change as it sounds > promising. > > What is the advantage over Xianzhu's alternate approach of using the table as > the DIC then? I assume you are referring to https://codereview.chromium.org/2430313004/, per separate email thread today Xianzhu is continuing to work on that but we thought worthwhile to land this smaller change ahead of that. It fixes the bug noted and it sounds like we are still exploring performance tradeoffs for the other change.
On 2016/10/19 at 23:15:47, wangxianzhu wrote: > 2. This CL affects performance for tables containing composited cells only which is not a common case, so less risky for performance. Oh right, had forgotten about that detail. This was the reason I liked this CL yesterday. :) LOL. > > > > > > > > This looks like a real under-invalidation of the DisplayItemClient. Based on > > > > code, we do invalidate cells when row background changes. We might miss it > > for > > > > some corner cases. > > > > > > I am going to refocus this current change on just fixing borders and will look > > at row background separately. It does look like we have an incorrect visual rect > > for same reason for painting row background, which happens via > > TableRowPainter::paint -> TableCellPainter::paintContainerBackgroundBehindCell.
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: mac_chromium_rel_ng on master.tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/mac_chromium_rel_...)
The CQ bit was checked by wkorman@chromium.org
The patchset sent to the CQ was uploaded after l-g-t-m from wangxianzhu@chromium.org Link to the patchset: https://codereview.chromium.org/2432663002/#ps60001 (title: "Add test baselines.")
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
Message was sent while issue was closed.
Description was changed from ========== Use table as display item client for painting composited collapsed table cell borders. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 ========== to ========== Use table as display item client for painting composited collapsed table cell borders. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 ==========
Message was sent while issue was closed.
Committed patchset #4 (id:60001)
Message was sent while issue was closed.
Description was changed from ========== Use table as display item client for painting composited collapsed table cell borders. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 ========== to ========== Use table as display item client for painting composited collapsed table cell borders. BUG=647809 CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2 Committed: https://crrev.com/1bb139a99a8e140b56c3583cd5d133581a5ed906 Cr-Commit-Position: refs/heads/master@{#426428} ==========
Message was sent while issue was closed.
Patchset 4 (id:??) landed as https://crrev.com/1bb139a99a8e140b56c3583cd5d133581a5ed906 Cr-Commit-Position: refs/heads/master@{#426428} |