Issue
An android app I'm working on relies on a web page for most of its functionality. When a user clicks a link that would normally call window.open I would like it to instead call a custom function. That way it stops the app from opening a browser window, which destroys the illusion of using an app. I already have a JavaScriptInterface set up to replace all the instances of window.open it finds in the page. The issue I'm having now is the external javascript file. It has a function very similar to this one
function LoadItem(url,title)
{
window.open("/items.html?item=" + url + "&title=" + EncodeString(title), "song: " + title);
}
I would like to fix it up so it is this instead:
function LoadItem(url,title)
{
window.LinkFixer.openInNewTab("/items.html?item=" + url + "&title=" + EncodeString(title), "song: " + title);
}
This is the code I have thus far that should be doing this for me.
public String processPage(String html)//called once the page has been loaded
{
html = html.replace("window.open","window.LinkFixer.openInNewTab").replace("OpenSong","window.LinkFixer.openSong");
String[] lines = html.split("\n");
html = "";
for(int i=0;i<lines.length;i++)
{
if(lines[i].contains("<script")&&lines[i].contains("src="))
{
lines[i] = getJs(lines[i]);
}
html += lines[i];
}
return html;
}
private String getJs(String line)//gets the javascript, fixes it so it's safe for the app, then returns it as inline rather than embeded
{
String jsFileName = line.replace("\"","'").replace("<script type='text/javascript' ","").replace("src=","").replace(">","").replace("'","").trim();
//public static String makeGetRequest(String url,boolean oneLine)
System.out.println(jsFileName);
String targetUrl = "/BrowserControl/"+jsFileName;
System.out.println(targetUrl);
String jsFile = ShowWebInterface.makeGetRequest(targetUrl,false);
Log.d("OrigFile"+jsFileName,jsFile);
jsFile = jsFile.replace("window.open","window.LinkFixer.openInNewTab").replace("OpenSong","window.LinkFixer.openSong").replace("function window.LinkFixer.openSong(url, title)","window.LinkFixer.openSong");
Log.d("NewFile"+jsFileName,jsFile);
return "<script type=\"text/javascript\">\n"+jsFile;
}
For the first click, it works. For anything after that, it loads the page in a browser window outside of the control of my app. The page I'm having issues with does use ajax, so I'm fairly sure that is causing some kind of issue. I would think that the browser would still call the onProgressChanged method, but I could be wrong.
browser.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView webView, int newProgress)
{
super.onProgressChanged(webView,newProgress);
if(newProgress >= 100)
{
System.out.println("Done loading");
browser.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].innerHTML = window.LinkFixer.processPage((document.getElementsByTagName(\"html\")[0].innerHTML))");
}
}
});
Is there something I'm missing? Some way to hijack the callback function of the ajax? Or maybe something else that I've overlooked.
Solution
I believe you should be using shouldOverrideUrlLoading(...)
How to make links open within webview or open by default browser depending on domain name? appears to have a good example.
Answered By - Reed
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.