Marcus Pridham created CB-5756:
----------------------------------

             Summary: InAppBrowser example fails on Android 4.4
                 Key: CB-5756
                 URL: https://issues.apache.org/jira/browse/CB-5756
             Project: Apache Cordova
          Issue Type: Bug
          Components: Android, Plugin InAppBrowser
    Affects Versions: 3.3.0
         Environment: Android 4.4
            Reporter: Marcus Pridham


1.  Create cordova project and add InAppBrowser plugin
2.  Replace index.html contents with the Full Example for executeScript in the 
API docs at 
http://cordova.apache.org/docs/en/3.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser
3.  Build run the application.
4.  When the InAppBrowser loads the it displays the string 
http://cordova.apache.org/images/cordova_bot.png.

The example is suppose to load the Apache site and replace the logo with the 
cordova bot.  If you open the AndroidManifest.xml and change teh 
targetSdkVersion from 19 to 18 it works as expected.

The problems seems to be caused by a change in behaviour in 4.4 with using 
loadUrl("javascript:...").  See the loadUrl method in 
https://android.googlesource.com/platform/frameworks/webview/+/android-4.4_r1.1/chromium/java/com/android/webview/chromium/WebViewChromium.java.
  If the target sdk is kitkat or the result of the JS Url replaces the content 
of the current page...

The fix seems to be to use a new 4.4 method to the webview called 
evaluateJavaScript.
http://developer.android.com/reference/android/webkit/WebView.html#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback<java.lang.String>)

In InAppBrowser.java:

Change this:

{code}
final String finalScriptToInject = scriptToInject;
        // This action will have the side-effect of blurring the currently 
focused element
        this.cordova.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                inAppWebView.loadUrl("javascript:" + finalScriptToInject);
            }
        });
 {code}
 
 To:
 
 {code}
        final String finalScriptToInject = scriptToInject;
        
                // This action will have the side-effect of blurring the 
currently focused element
                this.cordova.getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                        if 
(cordova.getActivity().getApplicationInfo().targetSdkVersion < 
Build.VERSION_CODES.KITKAT)
                        {
                                inAppWebView.loadUrl("javascript:" + 
finalScriptToInject);
                        } else {
                                
inAppWebView.evaluateJavascript(finalScriptToInject, null);
                        }
                }
                });
{code}
 
 
I haven't tried any other plugins but it might be neccessary to change other 
plugins to use evaluateJavascript instead of loadUrl("javascript:..."). 



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to