From d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8e Mon Sep 17 00:00:00 2001 From: Grace Kloba Date: Tue, 26 Jan 2010 18:08:28 -0800 Subject: [PATCH] Add request header support for the Browser/WebView. QSB can use this instead of POST to send the location data. After QSB makes the switch, we should also remove the POST_DATA intent which is hidden. Add loadUrl(String url, HashMap extraHeaders) to WebView so that the caller can send the extra http headers. Remove "inline:" as no one is using it and it is a hidden feature. Part 1 of 3-project checkin. --- api/current.xml | 37 ++++++++++++++++++ core/java/android/provider/Browser.java | 45 ++++++++++------------ core/java/android/webkit/BrowserFrame.java | 13 ++++--- core/java/android/webkit/WebView.java | 20 ++++++++-- core/java/android/webkit/WebViewCore.java | 15 ++++++-- 5 files changed, 94 insertions(+), 36 deletions(-) diff --git a/api/current.xml b/api/current.xml index e8a8481ba056b..0d16f6769d348 100644 --- a/api/current.xml +++ b/api/current.xml @@ -119960,6 +119960,28 @@ visibility="public" > + + + + + + + + + + @@ -102,6 +78,27 @@ public class Browser { */ public static final String EXTRA_POST_DATA = "com.android.browser.post_data"; + /** + * The name of the extra data in the VIEW intent. The data is in the format + * of String array. This should be paired with EXTRA_HEADERS_VALUE. + *

+ * The keys will be combined with the values and sent in the HTTP request + * headers for the provided url. The keys can't be the standard HTTP headers + * as they are set by the WebView. The url's schema must be http(s). + *

+ */ + public static final String EXTRA_HEADERS_KEY = "com.android.browser.headers_key"; + + /** + * The name of the extra data in the VIEW intent. The data is in the format + * of String array. This should be paired with EXTRA_HEADERS_KEY. + *

+ * The values will be combined with the keys and sent in the HTTP request + * headers for the provided url. The url's schema must be http(s). + *

+ */ + public static final String EXTRA_HEADERS_VALUE = "com.android.browser.headers_value"; + /* if you change column order you must also change indices below */ public static final String[] HISTORY_PROJECTION = new String[] { diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index 1337beda70384..3f1672af29bf0 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -177,18 +177,21 @@ class BrowserFrame extends Handler { /** * Load a url from the network or the filesystem into the main frame. - * Following the same behaviour as Safari, javascript: URLs are not - * passed to the main frame, instead they are evaluated immediately. + * Following the same behaviour as Safari, javascript: URLs are not passed + * to the main frame, instead they are evaluated immediately. * @param url The url to load. + * @param extraHeaders The extra headers sent with this url. This should not + * include the common headers like "user-agent". If it does, it + * will be replaced by the intrinsic value of the WebView. */ - public void loadUrl(String url) { + public void loadUrl(String url, Map extraHeaders) { mLoadInitFromJava = true; if (URLUtil.isJavaScriptUrl(url)) { // strip off the scheme and evaluate the string stringByEvaluatingJavaScriptFromString( url.substring("javascript:".length())); } else { - nativeLoadUrl(url); + nativeLoadUrl(url, extraHeaders); } mLoadInitFromJava = false; } @@ -904,7 +907,7 @@ class BrowserFrame extends Handler { /** * Returns false if the url is bad. */ - private native void nativeLoadUrl(String url); + private native void nativeLoadUrl(String url, Map headers); private native void nativePostUrl(String url, byte[] postData); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 93e72ffd41b2d..ecea55fe4a9e9 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1375,6 +1375,22 @@ public class WebView extends AbsoluteLayout return returnList; } + /** + * Load the given url with the extra headers. + * @param url The url of the resource to load. + * @param extraHeaders The extra headers sent with this url. This should not + * include the common headers like "user-agent". If it does, it + * will be replaced by the intrinsic value of the WebView. + */ + public void loadUrl(String url, Map extraHeaders) { + switchOutDrawHistory(); + WebViewCore.GetUrlData arg = new WebViewCore.GetUrlData(); + arg.mUrl = url; + arg.mExtraHeaders = extraHeaders; + mWebViewCore.sendMessage(EventHub.LOAD_URL, arg); + clearTextEntry(); + } + /** * Load the given url. * @param url The url of the resource to load. @@ -1383,9 +1399,7 @@ public class WebView extends AbsoluteLayout if (url == null) { return; } - switchOutDrawHistory(); - mWebViewCore.sendMessage(EventHub.LOAD_URL, url); - clearTextEntry(); + loadUrl(url, null); } /** diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 6700d712cfb4f..1e21cb4ccaab4 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -686,6 +686,11 @@ final class WebViewCore { int mY; } + static class GetUrlData { + String mUrl; + Map mExtraHeaders; + } + static class PostUrlData { String mUrl; byte[] mPostData; @@ -958,9 +963,11 @@ final class WebViewCore { ((Float) msg.obj).floatValue(), msg.arg1); break; - case LOAD_URL: - loadUrl((String) msg.obj); + case LOAD_URL: { + GetUrlData param = (GetUrlData) msg.obj; + loadUrl(param.mUrl, param.mExtraHeaders); break; + } case POST_URL: { PostUrlData param = (PostUrlData) msg.obj; @@ -1545,9 +1552,9 @@ final class WebViewCore { } } - private void loadUrl(String url) { + private void loadUrl(String url, Map extraHeaders) { if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, " CORE loadUrl " + url); - mBrowserFrame.loadUrl(url); + mBrowserFrame.loadUrl(url, extraHeaders); } private void key(KeyEvent evt, boolean isDown) {