diff options
Diffstat (limited to 'src/com/android/browser/UrlHandler.java')
-rw-r--r-- | src/com/android/browser/UrlHandler.java | 133 |
1 files changed, 132 insertions, 1 deletions
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java index b23dc7d..02a080f 100644 --- a/src/com/android/browser/UrlHandler.java +++ b/src/com/android/browser/UrlHandler.java @@ -22,7 +22,9 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.database.Cursor; import android.net.Uri; +import android.os.AsyncTask; import android.util.Log; import android.webkit.WebView; @@ -35,6 +37,9 @@ import java.util.regex.Matcher; */ public class UrlHandler { + static final String RLZ_PROVIDER = "com.google.android.partnersetup.rlzappprovider"; + static final Uri RLZ_PROVIDER_URI = Uri.parse("content://" + RLZ_PROVIDER + "/"); + // Use in overrideUrlLoading /* package */ final static String SCHEME_WTAI = "wtai://wp/"; /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; @@ -44,6 +49,9 @@ public class UrlHandler { Controller mController; Activity mActivity; + private Boolean mIsProviderPresent = null; + private Uri mRlzUri = null; + public UrlHandler(Controller controller) { mController = controller; mActivity = mController.getActivity(); @@ -92,6 +100,20 @@ public class UrlHandler { return false; } + // If this is a Google search, attempt to add an RLZ string + // (if one isn't already present). + if (rlzProviderPresent()) { + Uri siteUri = Uri.parse(url); + if (needsRlzString(siteUri)) { + // Need to look up the RLZ info from a database, so do it in an + // AsyncTask. Although we are not overriding the URL load synchronously, + // we guarantee that we will handle this URL load after the task executes, + // so it's safe to just return true to WebCore now to stop its own loading. + new RLZTask(tab, siteUri, view).execute(); + return true; + } + } + if (startActivityForUrl(url)) { return true; } @@ -192,11 +214,120 @@ public class UrlHandler { // depressed by opening in a new tab boolean handleMenuClick(Tab tab, String url) { if (mController.isMenuDown()) { - mController.openTab(tab, url, false); + mController.openTab(url, + (tab != null) && tab.isPrivateBrowsingEnabled(), + !BrowserSettings.getInstance().openInBackground(), true); mActivity.closeOptionsMenu(); return true; } return false; } + + // TODO: Move this class into Tab, where it can be properly stopped upon + // closure of the tab + private class RLZTask extends AsyncTask<Void, Void, String> { + private Tab mTab; + private Uri mSiteUri; + private WebView mWebView; + + public RLZTask(Tab tab, Uri uri, WebView webView) { + mTab = tab; + mSiteUri = uri; + mWebView = webView; + } + + protected String doInBackground(Void... unused) { + String result = mSiteUri.toString(); + Cursor cur = null; + try { + cur = mActivity.getContentResolver() + .query(getRlzUri(), null, null, null, null); + if (cur != null && cur.moveToFirst() && !cur.isNull(0)) { + result = mSiteUri.buildUpon() + .appendQueryParameter("rlz", cur.getString(0)) + .build().toString(); + } + } finally { + if (cur != null) { + cur.close(); + } + } + return result; + } + + protected void onPostExecute(String result) { + // Make sure the Tab was not closed while handling the task + if (mController.getTabControl().getTabPosition(mTab) != -1) { + // If the Activity Manager is not invoked, load the URL directly + if (!startActivityForUrl(result)) { + if (!handleMenuClick(mTab, result)) { + mController.loadUrl(mWebView, result); + } + } + } + } + } + + // Determine whether the RLZ provider is present on the system. + private boolean rlzProviderPresent() { + if (mIsProviderPresent == null) { + PackageManager pm = mActivity.getPackageManager(); + mIsProviderPresent = pm.resolveContentProvider(RLZ_PROVIDER, 0) != null; + } + return mIsProviderPresent; + } + + // Retrieve the RLZ access point string and cache the URI used to + // retrieve RLZ values. + private Uri getRlzUri() { + if (mRlzUri == null) { + String ap = mActivity.getResources() + .getString(R.string.rlz_access_point); + mRlzUri = Uri.withAppendedPath(RLZ_PROVIDER_URI, ap); + } + return mRlzUri; + } + + // Determine if this URI appears to be for a Google search + // and does not have an RLZ parameter. + // Taken largely from Chrome source, src/chrome/browser/google_url_tracker.cc + private static boolean needsRlzString(Uri uri) { + String scheme = uri.getScheme(); + if (("http".equals(scheme) || "https".equals(scheme)) && + (uri.getQueryParameter("q") != null) && + (uri.getQueryParameter("rlz") == null)) { + String host = uri.getHost(); + if (host == null) { + return false; + } + String[] hostComponents = host.split("\\."); + + if (hostComponents.length < 2) { + return false; + } + int googleComponent = hostComponents.length - 2; + String component = hostComponents[googleComponent]; + if (!"google".equals(component)) { + if (hostComponents.length < 3 || + (!"co".equals(component) && !"com".equals(component))) { + return false; + } + googleComponent = hostComponents.length - 3; + if (!"google".equals(hostComponents[googleComponent])) { + return false; + } + } + + // Google corp network handling. + if (googleComponent > 0 && "corp".equals( + hostComponents[googleComponent - 1])) { + return false; + } + + return true; + } + return false; + } + } |