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

Issue 640195 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner:
Android MediaRouter only (left Chro...
Closed: Oct 2016
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: All
Pri: 2
Type: Bug

Blocking:
issue 617681



Sign in to add a comment

IntersectionObserver/ElementVisibilityObserver is leaking in AutoplayUmaHelper

Project Member Reported by zqzh...@chromium.org, Aug 23 2016

Issue description

A recent patch for AutoplayUmaHelper was reverted since some leaks are detected.

commit 36d7422fbb9f27d2a931e91edcabe473a2d55772
Author: megjablon <megjablon@chromium.org>
Date: Tue Aug 23 02:12:37 2016

Revert "Record the offscreen playing duration of autoplaying muted videos"

This reverts commit cc74c3a6422be9a25c635021a57f7f0950c0381c.

Tests failing on https://build.chromium.org/p/chromium.webkit/builders/WebKit%20Linux%20Leak:
media/autoplay-muted.html
media/autoplay-unmute-offscreen.html
media/autoplay-when-visible.html

15:30:48.155 15954 worker/3 media/autoplay-unmute-offscreen.html leaked
15:30:48.155 15954   Xlib:  extension "RANDR" missing on display ":9".
15:30:48.155 15954   Xlib:  extension "RANDR" missing on display ":9".
15:30:48.155 15954   [4:4:0822/153047:2028208541:WARNING:webmediaplayer_impl.cc(372)] Using MultibufferDataSource
15:30:48.155 15954   [4:4:0822/153047:2028209045:WARNING:webmediaplayer_impl.cc(372)] Using MultibufferDataSource
15:30:48.158 18115 [35/36] media/autoplay-unmute-offscreen.html failed unexpectedly (leak detected: ({"numberOfLiveActiveDOMObjects":[2,3]}))
15:30:48.157 15954 worker/3 media/autoplay-unmute-offscreen.html failed:
15:30:48.157 15954 worker/3  leak detected: ({"numberOfLiveActiveDOMObjects":[2,3]})

TBR=isherman@chromium.org, mlamouri@chromium.org
BUG= 617681 

Review-Url: https://codereview.chromium.org/2266253002
Cr-Commit-Position: refs/heads/master@{#413635}

[modify] https://crrev.com/36d7422fbb9f27d2a931e91edcabe473a2d55772/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes-expected.txt
[modify] https://crrev.com/36d7422fbb9f27d2a931e91edcabe473a2d55772/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp
[modify] https://crrev.com/36d7422fbb9f27d2a931e91edcabe473a2d55772/third_party/WebKit/Source/core/html/AutoplayUmaHelper.h
[modify] https://crrev.com/36d7422fbb9f27d2a931e91edcabe473a2d55772/tools/metrics/histograms/histograms.xml

The leaks are flaky on debug build but 100% reproducible on release build.

To my best knowledge the leak should be IntersectionObserver/ElementVisibilityObserver.

Did some tracing, and found that each ElementVisibilityObserver->start() has a matching stop() call.
 
haraken@, is it OK to reland that patch (updating LeakExpectations) and fix the leak later?

Also, is there a way to see what are the leaking ActiveDOMObjects? If there are some verbose logging, it would help a lot debugging the issue.
I think we should revert the CL and reland with the fix.

> is there a way to see what are the leaking ActiveDOMObjects?

There's no easy way, unfortunately :/ However, I guess the leaking ActiveDOMObject is HTMLMediaElement.


> There's no easy way, unfortunately :/ However, I guess the leaking ActiveDOMObject is HTMLMediaElement.

I think so, too. But the info is not enough to debug the leak.

I suspect the leak is because that some persistent reference in the graph is preventing the HTMLMediaElement to be GC'ed, event if the document is unloaded. Does this sound reasonable? Is there other possible reasons?

Comment 4 by e...@chromium.org, Aug 26 2016

Owner: zqzh...@chromium.org
Status: Assigned (was: Available)
Did some more logging. Seems like we can exclude the following classes:
- Document
- HTMLMediaElement
- ElementVisibilityObserver
- IntersectionObserver
- IntersectionObservation
- IntersectionObservationController

Looking into more.

[1:1:0831/174904:112999682081:INFO:Document.cpp(458)] Document::Document()
[1:1:0831/174904:112999682425:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999682561:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999701153:INFO:Document.cpp(458)] Document::Document()
[1:1:0831/174904:112999701278:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999701351:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999719550:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999721507:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999728844:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999728943:INFO:AutoplayUmaHelper.cpp(40)] AutoplayUmaHelper::AutoplayUmaHelper()
[1:1:0831/174904:112999728996:INFO:HTMLMediaElement.cpp(448)] HTMLMediaElement::HTMLMediaElement()
[1:1:0831/174904:112999729538:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:112999729619:INFO:AutoplayUmaHelper.cpp(40)] AutoplayUmaHelper::AutoplayUmaHelper()
[1:1:0831/174904:112999729670:INFO:HTMLMediaElement.cpp(448)] HTMLMediaElement::HTMLMediaElement()
[57943:57964:0831/174904:113000094278:INFO:audio_manager_pulse.cc(204)] Not implemented!
[57943:57964:0831/174904:113000096964:INFO:audio_manager_pulse.cc(204)] Not implemented!
[1:1:0831/174904:113000102571:INFO:ElementVisibilityObserver.cpp(28)] ElementVisibilityObserver::ElementVisibilityObserver()
[1:1:0831/174904:113000102737:INFO:IntersectionObserver.cpp(188)] IntersectionObserver::IntersectionObserver()
[1:1:0831/174904:113000102816:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:113000102878:INFO:IntersectionObserverController.cpp(25)] IntersectionObserverController::IntersectionObserverController()
[1:1:0831/174904:113000102954:INFO:IntersectionObservation.cpp(23)] IntersectionObservation::IntersectionObservation()
[1:1:0831/174904:113000105443:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:113000212944:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:113000213207:INFO:ElementVisibilityObserver.cpp(28)] ElementVisibilityObserver::ElementVisibilityObserver()
[1:1:0831/174904:113000213262:INFO:IntersectionObserver.cpp(188)] IntersectionObserver::IntersectionObserver()
[1:1:0831/174904:113000213323:INFO:IntersectionObservation.cpp(23)] IntersectionObservation::IntersectionObservation()
[1:1:0831/174904:113000218940:INFO:Document.cpp(458)] Document::Document()
[1:1:0831/174904:113000219035:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:113000219090:INFO:ActiveDOMObject.cpp(40)] ActiveDOMObject::ActiveDOMObject()
[1:1:0831/174904:113000231243:INFO:HTMLMediaElement.cpp(478)] HTMLMediaElement::dispose()
[1:1:0831/174904:113000231337:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000231391:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000231438:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000231483:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000231577:INFO:ElementVisibilityObserver.cpp(33)] ElementVisibilityObserver::~ElementVisibilityObserver()
[1:1:0831/174904:113000231632:INFO:IntersectionObservation.cpp(28)] IntersectionObservation::~IntersectionObservation()
[1:1:0831/174904:113000231672:INFO:ElementVisibilityObserver.cpp(33)] ElementVisibilityObserver::~ElementVisibilityObserver()
[1:1:0831/174904:113000231713:INFO:IntersectionObservation.cpp(28)] IntersectionObservation::~IntersectionObservation()
[1:1:0831/174904:113000231773:INFO:AutoplayUmaHelper.cpp(45)] AutoplayUmaHelper::~AutoplayUmaHelper()
[1:1:0831/174904:113000231873:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000231982:INFO:IntersectionObserver.cpp(218)] IntersectionObserver::~IntersectionObserver()
[1:1:0831/174904:113000232096:INFO:Document.cpp(516)] Document::~Document()
[1:1:0831/174904:113000232151:INFO:HTMLMediaElement.cpp(466)] HTMLMediaElement::~HTMLMediaElement()
[1:1:0831/174904:113000232204:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000235349:INFO:HTMLMediaElement.cpp(478)] HTMLMediaElement::dispose()
[1:1:0831/174904:113000235415:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000235499:INFO:AutoplayUmaHelper.cpp(45)] AutoplayUmaHelper::~AutoplayUmaHelper()
[1:1:0831/174904:113000235551:INFO:IntersectionObserverController.cpp(30)] IntersectionObserverController::~IntersectionObserverController()
[1:1:0831/174904:113000235594:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000235643:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
[1:1:0831/174904:113000235701:INFO:IntersectionObserver.cpp(218)] IntersectionObserver::~IntersectionObserver()
[1:1:0831/174904:113000235755:INFO:Document.cpp(516)] Document::~Document()
[1:1:0831/174904:113000235814:INFO:HTMLMediaElement.cpp(466)] HTMLMediaElement::~HTMLMediaElement()
[1:1:0831/174904:113000235857:INFO:ActiveDOMObject.cpp(47)] ActiveDOMObject::~ActiveDOMObject()
Labels: -M-54 M-55
Steps to repro:

1. Set up and make a release build

2. third_party/WebKit/Tools/Scripts/run-webkit-tests -t LinuxRel media/autoplay-muted.html --enable-leak-detection

Also, you can minimize autoplay-muted.html by removing all other tests except for the first one.
Steps to repro:

0. Apply patch https://codereview.chromium.org/2331893003/
The leak is no longer repro on ToT. Seems it has been fixed somewhere. I'll land the patch again and see if the bots are still reporting leaks.
It sounds like this is fixed. Somehow.
Status: Fixed (was: Assigned)

Sign in to add a comment