New issue
Advanced search Search tips

Issue 804051 link

Starred by 3 users

Issue metadata

Status: WontFix
Owner:
Closed: Feb 2018
Components:
EstimatedDays: ----
NextAction: ----
OS: Mac
Pri: 3
Type: Bug



Sign in to add a comment

Scroll indicators always visible on high-dpi Mac display when set to show/hide automatically

Reported by g...@rstudio.com, Jan 20 2018

Issue description

UserAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

Steps to reproduce the problem:
1. On Mac obtain an application built with Qt 5.10 using QtWebEngine (uses Chromium)
2. You can use the sample Qt app "Quick Nano Browser" as an example
3. Set Mac to "Show scroll bars: Automatically based on mouse or trackpad"
4. Use a high-dpi display such as a 5K iMac or a Macbook Pro Retina; this does not repro on a regular display.
5. Use the trackpad on a Macbook or an Apple mouse on a iMac (some reports that using an external mouse without scroll-wheel-like functionality changes this behavior).
5. Launch the app and load a page that is long enough to require scrollbars

What is the expected behavior?
The scrollbar/scroll-indicator should initially be hidden. If you start scrolling with trackpad/mouse-wheel, the scroll-indicator appears (this is a slightly narrowed version of the scrollbar that is non-interactive). Move the mouse over that, and it gets wider and becomes an interactive scrollbar. Move the mouse out of the window and the scrollbar fades back to invisible.

What went wrong?
On the QtWebEngine-based browser, the scrollbar indicator(s) are always visible. They do not turn into scrollbars if you move the mouse over them, you must first initiate scrolling via mouse-wheel/trackpad.

This is both a functional and cosmetic problem. Our product, as shown in the attached GIF animation, has multiple panes which can be scrollable and it gets ugly having all those scroll-indicators showing.

Did this work before? N/A 

Does this work in other browsers? Yes

Chrome version: 61.0.3163.140  Channel: stable
OS Version: OS X 10.13.2
Flash Version: 

I opened a bug against Qt as well, as I'm unsure if this is their bug or a Chromium bug: https://bugreports.qt.io/browse/QTBUG-65745
 
2018-01-19_16-13-56.gif
5.2 MB View Download

Comment 1 by meh...@chromium.org, Jan 20 2018

Cc: bokan@chromium.org
Labels: Needs-Milestone

Comment 3 by bokan@chromium.org, Jan 25 2018

Cc: -bokan@chromium.org
Labels: -Pri-2 Pri-3
Owner: bokan@chromium.org
Status: Assigned (was: Unconfirmed)
I don't have a Mac handy to try, but could you see if the same issue occurs in another Chromium based browser like Opera or Vivaldi? If not, that would indicate the problem is in Qt's embedding.

I noticed in the qt bug report the comment pointing to src/qtwebengine/src/3rdparty/chromium/cc/input/scrollbar_animation_controller.cc. That isn't used on Mac - you should instead look at ScrollAnimatorMac.mm which is at third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm. The fade out and painting are driven by the OS - I'd wager there's some missing plumbing in Qt's implementation hooking up the two. 

Comment 4 by g...@rstudio.com, Jan 25 2018

Just tried latest Opera: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 OPR/50.0.2762.67

At first, Opera was failing to show the scroll indicator or scrollbar at all when I loaded a long page (cnn.com) and used mousewheel. That is, I was scrolling and nothing was appearing where scrollbars should be. I then tried in Chrome 63.0.3239.132, and was able to repro the same behavior.

when I quit and relaunched Opera, it came to cnn.com automatically, and now scrollbars work. It is quite inconsistent. Sometimes the scrollbars start working eventually, sometimes never. Too many variables, including if the mouse goes into the vicinity of the scrollbar region, and maybe even if the page is done loading, and I don't know if this is related at all to the issue I'm seeing with Qt (other than automatic scrollbars appearing to have some issues on Mac Chromium).

Some more context on the issue, at least how we at RStudio are experiencing it (scrollbars + scroll indicators are stuck on the screen, and never hide, except on low DPI screens).

With Chromium + QtWebEngine, if the window is sitting on a high DPI screen, I'm seeing that 'RegisterScrollbar()' is being constantly called, even when the window is sitting idle.

A stack trace, in case it provides any clues. This is with Qt 5.10 (built locally):

(lldb) bt
* thread #1, name = 'CrRendererMain', queue = 'com.apple.main-thread', stop reason = breakpoint 1.3
  * frame #0: 0x000000010d781a20 libQt5WebEngineCore.5.dylib`blink::ScrollbarThemeMac::RegisterScrollbar(blink::ScrollbarThemeClient&)
    frame #1: 0x000000010d646a07 libQt5WebEngineCore.5.dylib`blink::WebScrollbarThemeGeometryNative::TrackRect(blink::WebScrollbar*) + 39
    frame #2: 0x000000010d354122 libQt5WebEngineCore.5.dylib`cc_blink::ScrollbarImpl::TrackRect() const + 18
    frame #3: 0x000000010c49fe86 libQt5WebEngineCore.5.dylib`cc::PaintedScrollbarLayer::UpdateThumbAndTrackGeometry() + 22
    frame #4: 0x000000010c4a01f2 libQt5WebEngineCore.5.dylib`cc::PaintedScrollbarLayer::Update() + 66
    frame #5: 0x000000010c558e39 libQt5WebEngineCore.5.dylib`cc::LayerTreeHost::DoUpdateLayers(cc::Layer*) + 1145
    frame #6: 0x000000010c5588d6 libQt5WebEngineCore.5.dylib`cc::LayerTreeHost::UpdateLayers() + 54
    frame #7: 0x000000010c59d976 libQt5WebEngineCore.5.dylib`cc::ProxyMain::BeginMainFrame(std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> >) + 1046
    frame #8: 0x000000010c59c985 libQt5WebEngineCore.5.dylib`void base::internal::Invoker<base::internal::BindState<void (cc::ProxyMain::*)(std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> >), base::WeakPtr<cc::ProxyMain>, base::internal::PassedWrapper<std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> > > >, void ()>::RunImpl<void (cc::ProxyMain::*)(std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> >), std::__1::tuple<base::WeakPtr<cc::ProxyMain>, base::internal::PassedWrapper<std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> > > >, 0ul, 1ul>(void (cc::ProxyMain::*&&)(std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> >), std::__1::tuple<base::WeakPtr<cc::ProxyMain>, base::internal::PassedWrapper<std::__1::unique_ptr<cc::BeginMainFrameAndCommitState, std::__1::default_delete<cc::BeginMainFrameAndCommitState> > > >&&, base::IndexSequence<0ul, 1ul>) + 165
    frame #9: 0x000000010b7360e2 libQt5WebEngineCore.5.dylib`base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) + 242
    frame #10: 0x000000010d7591e2 libQt5WebEngineCore.5.dylib`blink::scheduler::TaskQueueManager::ProcessTaskFromWorkQueue(blink::scheduler::internal::WorkQueue*, bool, blink::scheduler::LazyNow, base::TimeTicks*) + 1218
    frame #11: 0x000000010d757612 libQt5WebEngineCore.5.dylib`blink::scheduler::TaskQueueManager::DoWork(bool) + 498
    frame #12: 0x000000010b7360e2 libQt5WebEngineCore.5.dylib`base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) + 242
    frame #13: 0x000000010b761dd6 libQt5WebEngineCore.5.dylib`base::MessageLoop::RunTask(base::PendingTask*) + 374
    frame #14: 0x000000010b762155 libQt5WebEngineCore.5.dylib`base::MessageLoop::DeferOrRunPendingTask(base::PendingTask) + 213
    frame #15: 0x000000010b76270d libQt5WebEngineCore.5.dylib`base::MessageLoop::DoDelayedWork(base::TimeTicks*) + 381
    frame #16: 0x000000010b765f63 libQt5WebEngineCore.5.dylib`base::MessagePumpCFRunLoopBase::RunWork() + 67
    frame #17: 0x000000010b75458a libQt5WebEngineCore.5.dylib`base::mac::CallWithEHFrame(void () block_pointer) + 10
    frame #18: 0x000000010b765864 libQt5WebEngineCore.5.dylib`base::MessagePumpCFRunLoopBase::RunWorkSource(void*) + 68
    frame #19: 0x00007fff37c795a1 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    frame #20: 0x00007fff37d3335c CoreFoundation`__CFRunLoopDoSource0 + 108
    frame #21: 0x00007fff37c5c040 CoreFoundation`__CFRunLoopDoSources0 + 208
    frame #22: 0x00007fff37c5b4bd CoreFoundation`__CFRunLoopRun + 1293
    frame #23: 0x00007fff37c5ad23 CoreFoundation`CFRunLoopRunSpecific + 483
    frame #24: 0x00007fff39d3ab76 Foundation`-[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 277
    frame #25: 0x000000010b7666ae libQt5WebEngineCore.5.dylib`base::MessagePumpNSRunLoop::DoRun(base::MessagePump::Delegate*) + 126
    frame #26: 0x000000010b7650ac libQt5WebEngineCore.5.dylib`base::MessagePumpCFRunLoopBase::Run(base::MessagePump::Delegate*) + 92
    frame #27: 0x000000010b78b5a3 libQt5WebEngineCore.5.dylib`base::RunLoop::Run() + 51
    frame #28: 0x000000010e96c501 libQt5WebEngineCore.5.dylib`content::RendererMain(content::MainFunctionParams const&) + 641
    frame #29: 0x000000010b6b2e57 libQt5WebEngineCore.5.dylib`content::ContentMainRunnerImpl::Run() + 375
    frame #30: 0x000000010cd6c418 libQt5WebEngineCore.5.dylib`service_manager::Main(service_manager::MainParams const&) + 2376
    frame #31: 0x000000010b6b23a4 libQt5WebEngineCore.5.dylib`content::ContentMain(content::ContentMainParams const&) + 68
    frame #32: 0x000000010a097d2a libQt5WebEngineCore.5.dylib`QtWebEngine::processMain(int, char const**) + 74
    frame #33: 0x00000001040bbcb4 QtWebEngineProcess`main + 52
    frame #34: 0x00007fff5f55e115 libdyld.dylib`start + 1
    frame #35: 0x00007fff5f55e115 libdyld.dylib`start + 1

Any idea what could lead Chromium into believing that the scrollbars need to be re-registered? IIUC this is something that should only happen once when the scrollbar is generated?

FWIW the calls indicated in the stack trace above begin as soon as the window has focus, and are repeatedly emitted while the window retains focus. If the window loses focus the calls subside, but the scroll indicator remains visible and mostly opaque.

Comment 7 by bokan@chromium.org, Jan 29 2018

Thanks. That looks suspect but perusing the code it seems that might be expected? I'll have to take a look on a real Mac device so it'll have to wait until Wednesday at least.

Comment 8 by bokan@chromium.org, Feb 1 2018

I took a look and it seems we call RegisterScrollbar in Chromium only when the scrollbar needs repainting. i.e. When it's moving or fading out. That on it's own sounds like a bug (I wouldn't expect us to keep reregistering a scrollbar) but I don't think that's the source of your issue. It seems you might not be getting the scrollbar timer to tell the scrollbar the opacity is changing.

Here's the stack trace for how the opacity gets changed in chrome:

0   libbase.dylib                       0x000000010891347e base::debug::StackTrace::StackTrace(unsigned long) + 174
1   libbase.dylib                       0x000000010891353d base::debug::StackTrace::StackTrace(unsigned long) + 29
2   libbase.dylib                       0x00000001089119bc base::debug::StackTrace::StackTrace() + 28
3   libblink_platform.dylib             0x0000000145a89100 -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:] + 384
4   Foundation                          0x00007fff467b2769 NSKeyValueNotifyObserver + 350
5   Foundation                          0x00007fff467b201d NSKeyValueDidChange + 475
6   Foundation                          0x00007fff468ef076 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKeys:count:maybeOldValuesDict:usingBlock:] + 769
7   Foundation                          0x00007fff4677d7c5 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:] + 61
8   Foundation                          0x00007fff467dac5c _NSSetDoubleValueAndNotify + 267
9   libblink_platform.dylib             0x0000000145a1940a -[BlinkScrollbarPartAnimation setCurrentProgress:] + 522
10  libblink_platform.dylib             0x0000000145a1e5db blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase*) + 203
11  libblink_platform.dylib             0x0000000145a1e901 blink::TaskRunnerTimer<blink::BlinkScrollbarPartAnimationTimer>::Fired() + 113
12  libblink_platform.dylib             0x00000001454153d8 blink::TimerBase::RunInternal() + 936
13  libblink_platform.dylib             0x000000014541688f void base::internal::FunctorTraits<void (blink::TimerBase::*)(), void>::Invoke<base::WeakPtr<blink::TimerBase> >(void (blink::TimerBase::*)(), base::WeakPtr<blink::TimerBase>&&) + 127
14  libblink_platform.dylib             0x00000001454167aa void base::internal::InvokeHelper<true, void>::MakeItSo<void (blink::TimerBase::*)(), base::WeakPtr<blink::TimerBase> >(void (blink::TimerBase::*&&)(), base::WeakPtr<blink::TimerBase>&&) + 90
15  libblink_platform.dylib             0x0000000145416740 void base::internal::Invoker<base::internal::BindState<void (blink::TimerBase::*)(), base::WeakPtr<blink::TimerBase> >, void ()>::RunImpl<void (blink::TimerBase::*)(), std::__1::tuple<base::WeakPtr<blink::TimerBase> >, 0ul>(void (blink::TimerBase::*&&)(), std::__1::tuple<base::WeakPtr<blink::TimerBase> >&&, std::__1::integer_sequence<unsigned long, 0ul>) + 80
16  libblink_platform.dylib             0x0000000145416669 base::internal::Invoker<base::internal::BindState<void (blink::TimerBase::*)(), base::WeakPtr<blink::TimerBase> >, void ()>::RunOnce(base::internal::BindStateBase*) + 57
17  libblink_platform.dylib             0x000000014541796f base::OnceCallback<void ()>::Run() && + 95
18  libblink_platform.dylib             0x00000001454178fd WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::RunInternal(base::OnceCallback<void ()>*) + 29
19  libblink_platform.dylib             0x00000001454165be WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::Run() + 206
20  libblink_platform.dylib             0x0000000145417185 void base::internal::FunctorTraits<void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*)(), void>::Invoke<std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > > >(void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*)(), std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > >&&) + 149
21  libblink_platform.dylib             0x00000001454170b4 void base::internal::InvokeHelper<false, void>::MakeItSo<void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*)(), std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > > >(void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*&&)(), std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > >&&) + 68
22  libblink_platform.dylib             0x0000000145417060 void base::internal::Invoker<base::internal::BindState<void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*)(), std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > > >, void ()>::RunImpl<void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*)(), std::__1::tuple<std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > > >, 0ul>(void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*&&)(), std::__1::tuple<std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > > >&&, std::__1::integer_sequence<unsigned long, 0ul>) + 80
23  libblink_platform.dylib             0x0000000145416fb9 base::internal::Invoker<base::internal::BindState<void (WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>::*)(), std::__1::unique_ptr<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()>, std::__1::default_delete<WTF::ThreadCheckingCallbackWrapper<base::OnceCallback<void ()>, void ()> > > >, void ()>::RunOnce(base::internal::BindStateBase*) + 57
24  libbase.dylib                       0x00000001088b587f base::OnceCallback<void ()>::Run() && + 95
25  libbase.dylib                       0x0000000108915ad4 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) + 884
26  libblink_platform.dylib             0x0000000145c984ea blink::scheduler::TaskQueueManager::ProcessTaskFromWorkQueue(blink::scheduler::internal::WorkQueue*, blink::scheduler::LazyNow, base::TimeTicks*) + 1770
27  libblink_platform.dylib             0x0000000145c97550 blink::scheduler::TaskQueueManager::DoWork(blink::scheduler::internal::Sequence::WorkType) + 2192
28  libblink_platform.dylib             0x0000000145cb2981 void base::internal::FunctorTraits<void (blink::scheduler::TaskQueueManager::*)(blink::scheduler::internal::Sequence::WorkType), void>::Invoke<base::WeakPtr<blink::scheduler::TaskQueueManager> const&, blink::scheduler::internal::Sequence::WorkType const&>(void (blink::scheduler::TaskQueueManager::*)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::TaskQueueManager> const&&&, blink::scheduler::internal::Sequence::WorkType const&&&) + 145
29  libblink_platform.dylib             0x0000000145cb2885 void base::internal::InvokeHelper<true, void>::MakeItSo<void (blink::scheduler::TaskQueueManager::* const&)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::TaskQueueManager> const&, blink::scheduler::internal::Sequence::WorkType const&>(void (blink::scheduler::TaskQueueManager::* const&&&)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::TaskQueueManager> const&&&, blink::scheduler::internal::Sequence::WorkType const&&&) + 117
30  libblink_platform.dylib             0x0000000145cb27fd void base::internal::Invoker<base::internal::BindState<void (blink::scheduler::TaskQueueManager::*)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::TaskQueueManager>, blink::scheduler::internal::Sequence::WorkType>, void ()>::RunImpl<void (blink::scheduler::TaskQueueManager::* const&)(blink::scheduler::internal::Sequence::WorkType), std::__1::tuple<base::WeakPtr<blink::scheduler::TaskQueueManager>, blink::scheduler::internal::Sequence::WorkType> const&, 0ul, 1ul>(void (blink::scheduler::TaskQueueManager::* const&&&)(blink::scheduler::internal::Sequence::WorkType), std::__1::tuple<base::WeakPtr<blink::scheduler::TaskQueueManager>, blink::scheduler::internal::Sequence::WorkType> const&&&, std::__1::integer_sequence<unsigned long, 0ul, 1ul>) + 125
31  libblink_platform.dylib             0x0000000145cb270c base::internal::Invoker<base::internal::BindState<void (blink::scheduler::TaskQueueManager::*)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::TaskQueueManager>, blink::scheduler::internal::Sequence::WorkType>, void ()>::Run(base::internal::BindStateBase*) + 44
32  libbase.dylib                       0x00000001088b587f base::OnceCallback<void ()>::Run() && + 95
33  libbase.dylib                       0x0000000108915ad4 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) + 884
34  libblink_platform.dylib             0x0000000145cb6805 blink::scheduler::internal::ThreadControllerImpl::DoWork(blink::scheduler::internal::Sequence::WorkType) + 517
35  libblink_platform.dylib             0x0000000145cb8271 void base::internal::FunctorTraits<void (blink::scheduler::internal::ThreadControllerImpl::*)(blink::scheduler::internal::Sequence::WorkType), void>::Invoke<base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl> const&, blink::scheduler::internal::Sequence::WorkType const&>(void (blink::scheduler::internal::ThreadControllerImpl::*)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl> const&&&, blink::scheduler::internal::Sequence::WorkType const&&&) + 145
36  libblink_platform.dylib             0x0000000145cb81a5 void base::internal::InvokeHelper<true, void>::MakeItSo<void (blink::scheduler::internal::ThreadControllerImpl::* const&)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl> const&, blink::scheduler::internal::Sequence::WorkType const&>(void (blink::scheduler::internal::ThreadControllerImpl::* const&&&)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl> const&&&, blink::scheduler::internal::Sequence::WorkType const&&&) + 117
37  libblink_platform.dylib             0x0000000145cb811d void base::internal::Invoker<base::internal::BindState<void (blink::scheduler::internal::ThreadControllerImpl::*)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl>, blink::scheduler::internal::Sequence::WorkType>, void ()>::RunImpl<void (blink::scheduler::internal::ThreadControllerImpl::* const&)(blink::scheduler::internal::Sequence::WorkType), std::__1::tuple<base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl>, blink::scheduler::internal::Sequence::WorkType> const&, 0ul, 1ul>(void (blink::scheduler::internal::ThreadControllerImpl::* const&&&)(blink::scheduler::internal::Sequence::WorkType), std::__1::tuple<base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl>, blink::scheduler::internal::Sequence::WorkType> const&&&, std::__1::integer_sequence<unsigned long, 0ul, 1ul>) + 125
38  libblink_platform.dylib             0x0000000145cb802c base::internal::Invoker<base::internal::BindState<void (blink::scheduler::internal::ThreadControllerImpl::*)(blink::scheduler::internal::Sequence::WorkType), base::WeakPtr<blink::scheduler::internal::ThreadControllerImpl>, blink::scheduler::internal::Sequence::WorkType>, void ()>::Run(base::internal::BindStateBase*) + 44
39  libbase.dylib                       0x00000001088b587f base::OnceCallback<void ()>::Run() && + 95
40  libbase.dylib                       0x0000000108915ad4 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) + 884
41  libbase.dylib                       0x00000001089f22fa base::internal::IncomingTaskQueue::RunTask(base::PendingTask*) + 234
42  libbase.dylib                       0x00000001089fefcf base::MessageLoop::RunTask(base::PendingTask*) + 911
43  libbase.dylib                       0x00000001089ff5b9 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask) + 89
44  libbase.dylib                       0x00000001089ff8e9 base::MessageLoop::DoWork() + 569
45  libbase.dylib                       0x0000000108a0de12 base::MessagePumpCFRunLoopBase::RunWork() + 98
46  libbase.dylib                       0x0000000108a0dd9c ___ZN4base24MessagePumpCFRunLoopBase13RunWorkSourceEPv_block_invoke + 28
47  libbase.dylib                       0x00000001089aff4a base::mac::CallWithEHFrame(void () block_pointer) + 10
48  libbase.dylib                       0x0000000108a0cc45 base::MessagePumpCFRunLoopBase::RunWorkSource(void*) + 101
49  CoreFoundation                      0x00007fff446c9a21 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
50  CoreFoundation                      0x00007fff4478126c __CFRunLoopDoSource0 + 108
51  CoreFoundation                      0x00007fff446acab0 __CFRunLoopDoSources0 + 208
52  CoreFoundation                      0x00007fff446abf2d __CFRunLoopRun + 1293
53  CoreFoundation                      0x00007fff446ab787 CFRunLoopRunSpecific + 487
54  Foundation                          0x00007fff46797c16 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 277
55  libbase.dylib                       0x0000000108a0e8fc base::MessagePumpNSRunLoop::DoRun(base::MessagePump::Delegate*) + 188
56  libbase.dylib                       0x0000000108a0c2e4 base::MessagePumpCFRunLoopBase::Run(base::MessagePump::Delegate*) + 116
57  libbase.dylib                       0x00000001089fe783 base::MessageLoop::Run(bool) + 579
58  libbase.dylib                       0x0000000108aff9d1 base::RunLoop::Run() + 593
59  libcontent.dylib                    0x000000012c501b16 content::RendererMain(content::MainFunctionParams const&) + 3990
60  libcontent.dylib                    0x000000012cbffc5b content::RunNamedProcessTypeMain(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, content::MainFunctionParams const&, content::ContentMainDelegate*) + 603
61  libcontent.dylib                    0x000000012cc014d6 content::ContentMainRunnerImpl::Run() + 1334


If you're able to insert some logging, I'd try adding a print to ScrollbarThemeMac.mm [BlinkScrollbarObserver observeValueForKeyPath]. That should get called to change the opacity on scrollbars as they fade out.

I'd also add something to BlinkScrollbarPartAnimationTimer::Start, Stop and TimerFired in ScrollAnimatorMac.mm. Start should be called only when the scrollbars are about to fade out and then you should get repeating calls to TimerFired (which eventually lead up through the stack frame above. The Start() on fadeout should be called from MacOS libraries so it's possible the scroller may not be getting properly registered with the system? Hopefully you can narrow down where things are going wrong from this. 
Thanks for taking the time to dig in and provide the extra context!

Is it expected that the BlinkScrollbarObserver is constantly created and destructed while scrolling? Because I'm also seeing that with QtWebEngine. Here's a dump of some of the routines logged during a tiny (2px) scroll on a page:

2018-02-01 15:39:43.689 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::Stop():317
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] blink::BlinkScrollbarPartAnimationTimer::~BlinkScrollbarPartAnimationTimer():307
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] blink::BlinkScrollbarPartAnimationTimer::BlinkScrollbarPartAnimationTimer(BlinkScrollbarPartAnimation *, CFTimeInterval):305
2018-02-01 15:39:43.690 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::Start():310
2018-02-01 15:39:43.706 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.706 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.706 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.706 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:43.707 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:43.725 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.331 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::Stop():317
2018-02-01 15:39:44.331 QtWebEngineProcess[33824:5211414] blink::BlinkScrollbarPartAnimationTimer::~BlinkScrollbarPartAnimationTimer():307
2018-02-01 15:39:44.331 QtWebEngineProcess[33824:5211414] blink::BlinkScrollbarPartAnimationTimer::BlinkScrollbarPartAnimationTimer(BlinkScrollbarPartAnimation *, CFTimeInterval):305
2018-02-01 15:39:44.331 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::Start():310
2018-02-01 15:39:44.351 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.351 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.351 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.352 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.365 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.365 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.366 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.381 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.381 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.381 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.382 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.399 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.399 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.399 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.399 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.399 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.399 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.400 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.414 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.415 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.432 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.432 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.432 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.433 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.448 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.449 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.465 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.466 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.482 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.498 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.499 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.499 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.517 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.532 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.533 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.533 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.533 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.548 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.549 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] Visible? YES
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.566 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.567 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.584 QtWebEngineProcess[33824:5211414] void blink::BlinkScrollbarPartAnimationTimer::TimerFired(blink::TimerBase *):323
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver observeValueForKeyPath:ofObject:change:context:]:95
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] Visible? NO
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver initWithScrollbar:painter:]:69
2018-02-01 15:39:44.585 QtWebEngineProcess[33824:5211414] -[BlinkScrollbarObserver dealloc]:86

It really seems like something is causing Chromium to over-aggressively create and destruct the scrollbar during scroll. Can you think of what might prompt Chromium to register or create a new scrollbar? Perhaps there's something Qt is doing with the event loop that makes Chromium believe a new scrollbar needs to be (continuously) constructed?
(Nonetheless it really does appear that this is not a Chromium bug per-se and instead is either in QtWebEngine, the glue between Qt and Chromium, or the set of patches Qt is applying to Chromium itself, so please feel free to close this if appropriate.)
Status: WontFix (was: Assigned)
> Is it expected that the BlinkScrollbarObserver is constantly created and destructed while scrolling

This code is quite dated and I don't think anyone in Chromium understands it well (it was written by Apple engineers pre-WebKit split). That said, I think the BlinkScrollbarObserver being constantly recreated is a result of calling registerScrollbars repeatedly - which feels wrong - but happens in Chromium as well so I don't think that's the issue.

You should see the timer starting and these register calls as you scroll. Question is, do you see the timer start and fire after you've stopped scrolling? i.e. is it that the timer and animation never starts? Or that it keeps firing but we seem to clobber the opacity by some kind of destroy/recreate.

I'll WontFix this bug since I don't think there's an issue with Chromium itself. But we can continue in this bug and I can try help diagnose the issue as time permits. I also only have access to a Mac intermittently so replies might be delayed :)
Some happy news -- we found a workaround for this issue; by ensuring that Qt launches Chromium with '--disable-prefer-compositing-to-lcd-text', the scrollbar issue no longer occurs in our case. Hurray!

Jonathan took a closer look and shared some details at https://bugreports.qt.io/browse/QTBUG-65745; I'll copy those here just for color in case this sounds like something Chromium could / should be aware of:

---

Kai Köhne, we have found a workaround for this issue. In particular, it looks like this happens only when Chromium uses the compositor for rendering. Consequently, the issue doesn't reproduce when using the --disable-prefer-compositing-to-lcd-text parameter.

The actual cause of the issue is still somewhat mysterious. All of the overlay scrollbar animations which adjust the scroll knob's alpha to fade it in/out are firing and running correctly; the problem is that the scrollbar is not being redrawn with the new alpha. This in turn seems to happen because the scrollbar animations are only drawn in a 2nd paint pass that doesn't happen when using the compositor. This is where the left turn occurs:

https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp#287

    GraphicsLayer* PaintLayerScrollableArea::LayerForVerticalScrollbar() const {
      // See  crbug.com/343132 .
      DisableCompositingQueryAsserts disabler;
      return Layer()->HasCompositedLayerMapping()
                 ? Layer()->GetCompositedLayerMapping()->LayerForVerticalScrollbar()
                 : nullptr;
   }
The layer mapping used by the compositor has a special layer for the vertical scrollbar; it's this layer which prevents the second paint pass from occurring. The second paint pass is described here in the Chromium sources:

  // Overlay scrollbars paint in a second pass through the layer tree so that
  // they will paint on top of everything else. If this is the normal painting
  // pass, paintingOverlayControls will be false, and we should just tell the
  // root layer that there are overlay scrollbars that need to be painted. That
  // will cause the second pass through the layer tree to run, and we'll paint
  // the scrollbars then. In the meantime, cache tx and ty so that the second
  // pass doesn't need to re-enter the LayoutTree to get it right.
 

This second pass is triggered via SetContainsDirtyOverlayScrollbars(true), but that call never happens if there's a LayerForVerticalScrollbar().

So turning off compositing causes Layer()->HasCompositedLayerMapping() to be false, which gets us the 2nd pass we need in order for the scrollbars to be properly hidden. The real issue, though, is that it looks like scrollbar alpha animations just don't work when using the compositor.

Comment 13 by bokan@chromium.org, Mar 14 2018

Yeah, you're using a different path for rendering scrollbars so I suppose it's not surprising that'll work. I didn't suggest it since, in general, disabling compositor driven scrolling is a bad idea since it makes scrolling susceptible to jank on the main thread. But, in a desktop app that's well tuned this may not be as much of an issue. (Just realize scrolling may be a little less smooth).

Sign in to add a comment