WebView on Android ICS, iframe problems with android_assets

2,439 views
Skip to first unread message

Alexandre Almeida

unread,
Apr 18, 2012, 9:21:28 AM4/18/12
to phonegap
http://stackoverflow.com/questions/9050949/webview-on-android-ics-iframe-problems-with-android-assets/10210172#10210172

Is there anything that can be done from your development team?

Problem:
--------------

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


How I solved it
----------------------

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

Simon MacDonald

unread,
Apr 27, 2012, 12:58:46 PM4/27/12
to phon...@googlegroups.com
Not at the moment. We are struggling with this issue as there is no way to tell when the request is received by the WebView if it is for the iFrame or the full app.

Simon Mac Donald
http://hi.im/simonmacdonald



Alexandre Almeida

--
You received this message because you are subscribed to the Google
Groups "phonegap" group.
To post to this group, send email to phon...@googlegroups.com
To unsubscribe from this group, send email to
phonegap+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/phonegap?hl=en?hl=en

For more info on PhoneGap or to download the code go to www.phonegap.com

Reply all
Reply to author
Forward
0 new messages