From 3bb5aa25ecf37825ae8202664fdc145c00f46e21 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Thu, 3 Apr 2014 05:07:12 +0200 Subject: browser: allow to load browser internal assets The new webview classes avoid to load urls from local file schemes. Just replace the load of internal browser assets (most_visited) from loadUrl to loadData. Signed-off-by: Jorge Ruesga Change-Id: Iee633a1a3599a7e752e15452fa04e15baac2e256 Cherry-Picked: http://review.cyanogenmod.org/#/c/62126/3 --- src/com/android/browser/Tab.java | 43 +++++++++++++++++++++- .../android/browser/homepages/HomeProvider.java | 24 ++++++++---- .../android/browser/homepages/RequestHandler.java | 2 +- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java index 907f7a1..ceacd42 100644 --- a/src/com/android/browser/Tab.java +++ b/src/com/android/browser/Tab.java @@ -76,6 +76,7 @@ import com.android.browser.provider.SnapshotProvider.Snapshots; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.security.Principal; @@ -161,6 +162,8 @@ class Tab implements PictureListener { // before onPageFinsihed) private boolean mInPageLoad; private boolean mDisableOverrideUrlLoading; + // If true, the current page is the most visited page + private boolean mInMostVisitedPage; // The last reported progress of the current page private int mPageLoadProgress; // The time the load started, used to find load page time @@ -394,6 +397,16 @@ class Tab implements PictureListener { } syncCurrentState(view, url); mWebViewController.onPageFinished(Tab.this); + + if (view.getUrl().equals(HomeProvider.MOST_VISITED_URL)) { + if (!mInMostVisitedPage) { + loadUrl(HomeProvider.MOST_VISITED, null); + mInMostVisitedPage = true; + } + view.clearHistory(); + } else { + mInMostVisitedPage = false; + } } // return true if want to hijack the url to let another app to handle it @@ -1847,7 +1860,20 @@ class Tab implements PictureListener { mInPageLoad = true; mCurrentState = new PageState(mContext, false, url, null); mWebViewController.onPageStarted(this, mMainView, null); - mMainView.loadUrl(url, headers); + WebResourceResponse res = HomeProvider.shouldInterceptRequest(mContext, url); + if (res != null) { + try { + String data = readWebResource(res).toString(); + mInMostVisitedPage = true; + mMainView.loadDataWithBaseURL(url, data, res.getMimeType(), res.getEncoding(), + HomeProvider.MOST_VISITED_URL); + } catch (IOException io) { + // Fallback to default load handling + mMainView.loadUrl(url, headers); + } + } else { + mMainView.loadUrl(url, headers); + } } } @@ -2002,4 +2028,19 @@ class Tab implements PictureListener { if (mSubView != null) cookieManager.setAcceptThirdPartyCookies(mSubView, accept); } + + private StringBuilder readWebResource(WebResourceResponse response) throws IOException { + StringBuilder sb = new StringBuilder(); + InputStream is = response.getData(); + try { + byte[] data = new byte[512]; + int read = 0; + while ((read = is.read(data, 0, 512)) != -1) { + sb.append(new String(data, 0, read)); + } + } finally { + is.close(); + } + return sb; + } } diff --git a/src/com/android/browser/homepages/HomeProvider.java b/src/com/android/browser/homepages/HomeProvider.java index dc55944..a1c1d85 100644 --- a/src/com/android/browser/homepages/HomeProvider.java +++ b/src/com/android/browser/homepages/HomeProvider.java @@ -41,6 +41,7 @@ public class HomeProvider extends ContentProvider { private static final String TAG = "HomeProvider"; public static final String AUTHORITY = "com.android.browser.home"; public static final String MOST_VISITED = "content://" + AUTHORITY + "/"; + public static final String MOST_VISITED_URL = "about:most_visited"; @Override public int delete(Uri uri, String selection, String[] selectionArgs) { @@ -88,17 +89,24 @@ public class HomeProvider extends ContentProvider { } } + public static boolean isMostVisitedPage(String url) { + boolean useMostVisited = BrowserSettings.getInstance().useMostVisitedHomepage(); + if (useMostVisited && url.startsWith("content://")) { + Uri uri = Uri.parse(url); + if (AUTHORITY.equals(uri.getAuthority())) { + return true; + } + } + return false; + } + public static WebResourceResponse shouldInterceptRequest(Context context, String url) { try { - boolean useMostVisited = BrowserSettings.getInstance().useMostVisitedHomepage(); - if (useMostVisited && url.startsWith("content://")) { - Uri uri = Uri.parse(url); - if (AUTHORITY.equals(uri.getAuthority())) { - InputStream ins = context.getContentResolver() - .openInputStream(uri); - return new WebResourceResponse("text/html", "utf-8", ins); - } + if (isMostVisitedPage(url)) { + InputStream ins = context.getContentResolver() + .openInputStream(Uri.parse(url + "/home")); + return new WebResourceResponse("text/html", "utf-8", ins); } boolean listFiles = BrowserSettings.getInstance().isDebugEnabled(); if (listFiles && interceptFile(url)) { diff --git a/src/com/android/browser/homepages/RequestHandler.java b/src/com/android/browser/homepages/RequestHandler.java index 823935e..c73ec9a 100644 --- a/src/com/android/browser/homepages/RequestHandler.java +++ b/src/com/android/browser/homepages/RequestHandler.java @@ -54,7 +54,7 @@ public class RequestHandler extends Thread { OutputStream mOutput; static { - sUriMatcher.addURI(HomeProvider.AUTHORITY, "/", INDEX); + sUriMatcher.addURI(HomeProvider.AUTHORITY, "home", INDEX); sUriMatcher.addURI(HomeProvider.AUTHORITY, "res/*/*", RESOURCE); } -- cgit v1.1