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

Issue 627835 link

Starred by 4 users

Issue metadata

Status: Assigned
Owner:
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Android
Pri: 3
Type: Bug



Sign in to add a comment

Rotating Gmail when selecting text leaks PopupWindow

Project Member Reported by gsennton@chromium.org, Jul 13 2016

Issue description

1. Start gmail, open some email (opens a WebView) and select some text.
2. Rotate the device
3. Observe logcat output:

07-13 15:07:24.267   853  2767 W WindowManager: Force-removing child win Window{ece122b u0 PopupWindow:54cf09} from container Window{e84cb3f u0 com.google.android.gm/com.google.android.gm.ConversationListActivityGmail}
07-13 15:07:24.268   853  2767 I WindowManager: Destroying surface Surface(name=PopupWindow:54cf09) called by com.android.server.wm.WindowStateAnimator.destroySurface:2014 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.removeLocked:1449 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2478 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2457 com.android.server.wm.WindowManagerService.removeWindowLocked:2436 com.android.server.wm.WindowManagerService.removeWindowLocked:2305 com.android.server.wm.WindowManagerService.removeWindow:2300 
07-13 15:07:24.272   853  2767 W WindowManager: Force-removing child win Window{79606a5 u0 PopupWindow:e31a567} from container Window{e84cb3f u0 com.google.android.gm/com.google.android.gm.ConversationListActivityGmail}
07-13 15:07:24.273   853  2767 I WindowManager: Destroying surface Surface(name=PopupWindow:e31a567) called by com.android.server.wm.WindowStateAnimator.destroySurface:2014 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.removeLocked:1449 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2478 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2457 com.android.server.wm.WindowManagerService.removeWindowLocked:2436 com.android.server.wm.WindowManagerService.removeWindowLocked:2305 com.android.server.wm.WindowManagerService.removeWindow:2300 
07-13 15:07:24.275   853  2767 W WindowManager: Force-removing child win Window{5d7440f u0 PopupWindow:2527526} from container Window{e84cb3f u0 com.google.android.gm/com.google.android.gm.ConversationListActivityGmail}
07-13 15:07:24.276   853  2767 I WindowManager: Destroying surface Surface(name=PopupWindow:2527526) called by com.android.server.wm.WindowStateAnimator.destroySurface:2014 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.removeLocked:1449 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2478 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2457 com.android.server.wm.WindowManagerService.removeWindowLocked:2436 com.android.server.wm.WindowManagerService.removeWindowLocked:2305 com.android.server.wm.WindowManagerService.removeWindow:2300 
07-13 15:07:24.278   853  2767 I WindowManager: Destroying surface Surface(name=com.google.android.gm/com.google.android.gm.ConversationListActivityGmail) called by com.android.server.wm.WindowStateAnimator.destroySurface:2014 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.removeLocked:1449 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2478 com.android.server.wm.WindowManagerService.removeWindowLocked:2436 com.android.server.wm.WindowManagerService.removeWindowLocked:2305 com.android.server.wm.WindowManagerService.removeWindow:2300 com.android.server.wm.Session.remove:193 
07-13 15:07:24.283 21123 21123 E WindowManager: 
07-13 15:07:24.283 21123 21123 E WindowManager: android.view.WindowLeaked: Activity com.google.android.gm.ui.MailActivityGmail has leaked window android.widget.PopupWindow$PopupDecorView{908ddbe V.E...... ......ID 0,0-154,77} that was originally added here
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewRootImpl.<init>(ViewRootImpl.java:417)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.widget.PopupWindow.invokePopup(PopupWindow.java:1380)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1156)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1119)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at org.chromium.content.browser.input.PopupTouchHandleDrawable.show(PopupTouchHandleDrawable.java:431)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at org.chromium.android_webview.AwContents.nativeOnDraw(Native Method)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at org.chromium.android_webview.AwContents.access$4600(AwContents.java:97)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDraw(AwContents.java:2921)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at org.chromium.android_webview.AwContents.onDraw(AwContents.java:1253)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at com.android.webview.chromium.WebViewChromium.onDraw(WebViewChromium.java:1695)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.webkit.WebView.onDraw(WebView.java:2534)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at com.android.mail.browse.ConversationWebView.onDraw(SourceFile:62)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.draw(View.java:17067)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16049)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.View.updateDisplayListIfDirty(View.java:16012)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:656)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:662)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:770)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewRootImpl.draw(ViewRootImpl.java:2796)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2604)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2211)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.Choreographer.doCallbacks(Choreographer.java:683)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.Choreographer.doFrame(Choreographer.java:619)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.os.Handler.handleCallback(Handler.java:751)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.os.Handler.dispatchMessage(Handler.java:95)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.os.Looper.loop(Looper.java:154)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at android.app.ActivityThread.main(ActivityThread.java:6077)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at java.lang.reflect.Method.invoke(Native Method)
07-13 15:07:24.283 21123 21123 E WindowManager: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)


This repros on WebView 44, 51, 52 and ToT, so it is not a regression (and both Android M and N).
This looks similar to  crbug.com/606783  which was only fixed in chrome/ :/, cc'ing the ppl from that bug
 

Comment 1 by boliu@chromium.org, Jul 13 2016

to do this reliably in webview, need to dismiss the window in ContentViewCore.onDetachedFromWindow, should work just fine for chrome as well, so can unify that path a bit if possible
Cc: mdjones@chromium.org
Comment in ContentViewCore.onDetachedFromWindow:

// WebView uses PopupWindows for handle rendering, which may remain
// unintentionally visible even after the WebView has been detached.
// Override the handle visibility explicitly to address this, but
// preserve the underlying selection for detachment cases like screen
// locking and app switching.
updateTextSelectionUI(false);

Comment 3 by ajit...@samsung.com, Jul 23 2016

Cc: ajit...@samsung.com

Comment 4 by hush@chromium.org, Aug 1 2016

Bo: is this fixed by https://codereview.chromium.org/2188593002/?

Comment 5 by boliu@chromium.org, Aug 1 2016

no, but I'm willing to ignore this indefinitely

Comment 6 by ti...@chromium.org, Aug 11 2016

Cc: boliu@chromium.org
c#5: Bo, shall I mark it WontFix then?

Comment 7 by boliu@chromium.org, Aug 11 2016

the error is harmless, but we should look at why PopupTouchHandleDrawable is not detached when webview is detached

Comment 8 by ti...@chromium.org, Aug 11 2016

Owner: gsennton@chromium.org
Status: Assigned (was: Untriaged)
Gustav, please help triage, assign back to me if you think someone else would be better at it.

Comment 9 by aluo@chromium.org, Sep 6 2016

I'm seeing this in inbox, buzzfeed, gmail on 53.0.2785.97 using Nexus 7 device.
We actually seem to be leaking both the ActionMode popupwindow and the text selection popup windows (I'm not sure why the ActionMode popupwindow is being leaked - we are calling mActionMode.finish() in CVC.onDetachedFromWindow()).

I'm a bit confused about the way we handle detachment + actionmode and selection handles, when exactly is a WebView supposed to be detached from its window? When I'm using gmail the only time I see a call to onDetachedFromWindow (in CVC) is when rotating the device. When locking the screen all I see is a call to CVC.onHide() which is caused by WebView.onPause().

To me it looks like there are 3 different cases we should be considering (instead of just the two hidePopupsAndPreserveSelection and hidePopupsAndClearSelection):
1. hide popups and temporarily hide selection handles (not sure what the temporary hiding is for but if we need it it should be one state), and keep selection
2. hide popups, hide (=dismiss) selection handles, and keep selection - called when CVC.onDetachedFromWindow
3. hide popups, dismiss selection handles and clear selection - should be called when we currently call hidePopupsAndClearSelection (e.g. selection reset)

The CL from where we no longer dismissed text selection handles in CVC.onDetachedFromWindow is
https://codereview.chromium.org/516523003
Owner: ----
Status: Available (was: Assigned)
Project Member

Comment 12 by sheriffbot@chromium.org, May 10 2018

Labels: Hotlist-Recharge-Cold
Status: Untriaged (was: Available)
This issue has been Available for over a year. If it's no longer important or seems unlikely to be fixed, please consider closing it out. If it is important, please re-triage the issue.

Sorry for the inconvenience if the bug really should have been left as Available.

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot

Comment 13 by ctzsm@chromium.org, May 10 2018

Owner: ctzsm@chromium.org
Status: Assigned (was: Untriaged)
I think I am still seeing this recently; I am looking at PopupTouchHandleDrawable these days, assigning this to me to take a further look.

Sign in to add a comment