[ 
https://issues.apache.org/jira/browse/CB-6837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14141032#comment-14141032
 ] 

Ian Clelland commented on CB-6837:
----------------------------------

CordovaChromeClient seems like the right place to put this, on the master/3.x 
branch. That's the class that creates the dialogs; it should be the one to keep 
track of them, and eventually destroy them.

It's not appropriate for 4.0.x, but this is exactly the sort of code that needs 
to be modified for 4.0.x anyway.

(WebChromeClient (and CordovaChromeClient) is an implementation detail that is 
specific to the stock Android WebView. Crosswalk uses 
{{org.xwalk.core.internal.XWalkUIClient}}, and even that's subject to change. I 
have no idea what GeckoView does, but I suspect it's radically different again.

In fact, CordovaChromeClient is already gone from the 4.0.x; replaced by the 
hopefully-obviously-android-specific AndroidChromeClient class.)

The right thing to do is to have CordovaActivity tell its CordovaWebView, 
whatever class that happens to be, that it's about to be destroyed, and the 
various CordovaWebView subclasses will just know how to clean up. That looks 
like what this patch is now doing.

> Hitting Back button while alert being rendered causes leaked window
> -------------------------------------------------------------------
>
>                 Key: CB-6837
>                 URL: https://issues.apache.org/jira/browse/CB-6837
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android
>    Affects Versions: 3.5.0
>            Reporter: Marcel Kinard
>            Assignee: Martin Gonzalez
>         Attachments: index.html
>
>
> On master and using dialogs plugin. Using a trivial app that has a button to 
> create an alert dialog after 500ms timeout. If the Back button is hit at 
> approximately the same time as the timer expires and the alert is to be 
> shown, the following exception appears in logcat:
> D/CordovaWebView( 8178): The current URL is: 
> file:///android_asset/www/index.html
> D/CordovaWebView( 8178): The URL at item 0 is: 
> file:///android_asset/www/index.html
> D/dalvikvm(  513): GC_FOR_ALLOC freed 306K, 13% free 14164K/16240K, paused 
> 54ms, total 55ms
> D/CordovaActivity( 8178): Paused the application!
> D/CordovaWebView( 8178): Handle the pause
> W/IInputConnectionWrapper( 8178): showStatusIcon on inactive InputConnection
> W/InputMethodManagerService(  513): Starting input on non-focused client 
> com.android.internal.view.IInputMethodClient$Stub$Proxy@42396598 (uid=10050 
> pid=8178)
> D/CordovaActivity( 8178): CordovaActivity.onDestroy()
> D/CordovaWebView( 8178): >>> loadUrlNow()
> E/WindowManager( 8178): 
> E/WindowManager( 8178): android.view.WindowLeaked: Activity 
> com.example.Example has leaked window 
> com.android.internal.policy.impl.PhoneWindow$DecorView{41f0d8b8 V.E..... 
> R.....I. 0,0-465,256} that was originally added here
> E/WindowManager( 8178):       at 
> android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
> E/WindowManager( 8178):       at 
> android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
> E/WindowManager( 8178):       at 
> android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
> E/WindowManager( 8178):       at android.app.Dialog.show(Dialog.java:286)
> E/WindowManager( 8178):       at 
> android.app.AlertDialog$Builder.show(AlertDialog.java:951)
> E/WindowManager( 8178):       at 
> org.apache.cordova.CordovaChromeClient.onJsAlert(CordovaChromeClient.java:143)
> E/WindowManager( 8178):       at 
> com.android.webview.chromium.WebViewContentsClientAdapter.handleJsAlert(WebViewContentsClientAdapter.java:606)
> E/WindowManager( 8178):       at 
> com.android.org.chromium.android_webview.AwContentsClientBridge.handleJsAlert(AwContentsClientBridge.java:73)
> E/WindowManager( 8178):       at 
> com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native 
> Method)
> E/WindowManager( 8178):       at 
> com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
> E/WindowManager( 8178):       at 
> android.os.Handler.dispatchMessage(Handler.java:102)
> E/WindowManager( 8178):       at android.os.Looper.loop(Looper.java:136)
> E/WindowManager( 8178):       at 
> android.app.ActivityThread.main(ActivityThread.java:5017)
> E/WindowManager( 8178):       at java.lang.reflect.Method.invokeNative(Native 
> Method)
> E/WindowManager( 8178):       at 
> java.lang.reflect.Method.invoke(Method.java:515)
> E/WindowManager( 8178):       at 
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
> E/WindowManager( 8178):       at 
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
> E/WindowManager( 8178):       at dalvik.system.NativeStart.main(Native Method)
> D/CordovaWebViewClient( 8178): onPageFinished(about:blank)
> D/CordovaActivity( 8178): onMessage(onPageFinished,about:blank)
> D/CordovaActivity( 8178): onMessage(exit,null)
> It looks like there is an attempt to show the alert dialog after the 
> activity's onDestroy() method has been called.
> When resuming the app by clicking on it's icon in the home screen or using 
> the Multitask button, the webview doesn't render completely, I see only a 
> black screen with the usual status bar. The app must be killed, and then it 
> works fine after a restart. It appears that there is a pretty small time 
> window during the timeout in which this can be reproduced, something on the 
> order of 200ms.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to