Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebView on Android ICS, iframe problems with android_assets

My application engine runs inside a WebView. It spans different IFRAMES. Both the main application html and the iframes html are on android_assets. On Android 3.x no problems ever. Same on chrome browser, etc.

If I create an IFRAME (createElement -> appendChild) the iframe is created.

When I load stuff in it (iframe.src="url" <> iframe.contentWindow.location.href="url") ... IT REPLACES THE MAIN APPLICATION!! (instead of loading into iframe)

Already tried:

  • window.setTimeout to delay the loading... failed.
  • in webview, inject X-Frame-Options=SAME_ORIGIN as header into any loaded page -> failed
  • creating the iframe, setting sandbox=same_origin,allow_scripts -> failed

Anybody with similar problems? Or can someone help me find documentation about WebView ICS bugs vs Honeycomb?

Also found many other strange issues... is ICS really this buggy? :S :S

like image 641
rupps Avatar asked Jan 29 '12 04:01

rupps


People also ask

How to load files from asset directory into WebView in Android?

This example demonstrates how do I load files from asset directory into WebView in android. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main.xml. Step 3 − Add the following code to src/MainActivity.java

Are there any issues with WebView on Android?

There has recently been a series of issues that have cropped up on Android with the WebView that has broken thousands of applications. Google addressed this issue, but there are a host of other issues that Google has not addressed. These issues pertain to WebView being able to handle incoming HTTP requests.

How can I display JavaScript code in an Android WebView?

If you’ve designed web content specifically to display in an Android WebView, then once you’ve enabled JavaScript execution you may also want to create an interface between your JavaScript and Android code, using addJavascriptInterface.

Can I display web content inside my Android app?

When it comes to displaying content inside your Android apps, you’re spoilt for choice, as the Android platform supports a wide range of content – including content pulled straight from external web pages. There’s many reasons why you might want to display web content inside your latest Android project.


1 Answers

Sirs, I had the same problem when using Phonegap (Apache Cordova) and IFrames in Android Ice Cream Sandwich (4.0.3).

To solve this problem, I had to edit Apache Cordova Source Code. I changed the org.apache.cordova.CordovaWebViewClient.java file, and commented this part of the code, and included the last line (return false;).

So it now looks like this:

    // All else     //        else {     //     //            // If our app or file:, then load into a new Cordova webview container by starting a new instance of our activity.     //            // Our app continues to run.  When BACK is pressed, our app is redisplayed.     //            if (url.startsWith("file://") || url.indexOf(this.ctx.baseUrl) == 0 || ctx.isUrlWhiteListed(url)) {     //                this.ctx.loadUrl(url);     //            }     //     //            // If not our application, let default viewer handle     //            else {     //                try {     //                    Intent intent = new Intent(Intent.ACTION_VIEW);     //                    intent.setData(Uri.parse(url));     //                    ctx.startActivity(intent);     //                } catch (android.content.ActivityNotFoundException e) {     //                    LOG.e(TAG, "Error loading url "+url, e);     //                }     //            }     //        }     //        return true;     return false; 

This problem only happens on Android ICS, but I changed the code for all my apps. I'm still doing tests.

In my analysis, it seems that when you try to load a page inside a iFrame, the Android WebView on ICS interprets it as a new page request, and IT REPLACES THE MAIN APPLICATION!!, or in other words, it OPENS the requested page in the hole parent window.

I left the rest of the code untouched.

I hope it helps, like it did for me.

Best regards.

Alexandre Almeida

like image 93
Alexandre Almeida Avatar answered Sep 25 '22 15:09

Alexandre Almeida