1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.content.browser;
7 import org.chromium.base.CalledByNative;
8 import org.chromium.base.JNINamespace;
13 * Holds parameters for ContentViewCore.LoadUrl. Parameters should match
14 * counterparts in NavigationController::LoadURLParams, including default
17 @JNINamespace("content")
18 public class LoadUrlParams {
19 // Should match NavigationController::LoadUrlType exactly. See comments
20 // there for proper usage. Values are initialized in initializeConstants.
21 public static int LOAD_TYPE_DEFAULT;
22 public static int LOAD_TYPE_BROWSER_INITIATED_HTTP_POST;
23 public static int LOAD_TYPE_DATA;
25 // Should match NavigationController::UserAgentOverrideOption exactly.
26 // See comments there for proper usage. Values are initialized in
27 // initializeConstants.
28 public static int UA_OVERRIDE_INHERIT;
29 public static int UA_OVERRIDE_FALSE;
30 public static int UA_OVERRIDE_TRUE;
32 // Fields with counterparts in NavigationController::LoadURLParams.
33 // Package private so that ContentViewCore.loadUrl can pass them down to
34 // native code. Should not be accessed directly anywhere else outside of
39 int mUaOverrideOption;
40 private Map<String, String> mExtraHeaders;
42 String mBaseUrlForDataUrl;
43 String mVirtualUrlForDataUrl;
44 boolean mCanLoadLocalResources;
46 public LoadUrlParams(String url) {
47 // Check initializeConstants was called.
48 assert LOAD_TYPE_DEFAULT != LOAD_TYPE_BROWSER_INITIATED_HTTP_POST;
51 mLoadUrlType = LOAD_TYPE_DEFAULT;
52 mTransitionType = PageTransitionTypes.PAGE_TRANSITION_LINK;
53 mUaOverrideOption = UA_OVERRIDE_INHERIT;
55 mBaseUrlForDataUrl = null;
56 mVirtualUrlForDataUrl = null;
60 * Helper method to create a LoadUrlParams object for data url.
61 * @param data Data to be loaded.
62 * @param mimeType Mime type of the data.
63 * @param isBase64Encoded True if the data is encoded in Base 64 format.
65 public static LoadUrlParams createLoadDataParams(
66 String data, String mimeType, boolean isBase64Encoded) {
67 return createLoadDataParams(data, mimeType, isBase64Encoded, null);
71 * Helper method to create a LoadUrlParams object for data url.
72 * @param data Data to be loaded.
73 * @param mimeType Mime type of the data.
74 * @param isBase64Encoded True if the data is encoded in Base 64 format.
75 * @param charset The character set for the data. Pass null if the mime type
76 * does not require a special charset.
78 public static LoadUrlParams createLoadDataParams(
79 String data, String mimeType, boolean isBase64Encoded, String charset) {
80 StringBuilder dataUrl = new StringBuilder("data:");
81 dataUrl.append(mimeType);
82 if (charset != null && !charset.isEmpty()) {
83 dataUrl.append(";charset=" + charset);
85 if (isBase64Encoded) {
86 dataUrl.append(";base64");
91 LoadUrlParams params = new LoadUrlParams(dataUrl.toString());
92 params.setLoadType(LoadUrlParams.LOAD_TYPE_DATA);
93 params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
98 * Helper method to create a LoadUrlParams object for data url with base
100 * @param data Data to be loaded.
101 * @param mimeType Mime type of the data.
102 * @param isBase64Encoded True if the data is encoded in Base 64 format.
103 * @param baseUrl Base url of this data load. Note that for WebView compatibility,
104 * baseUrl and historyUrl are ignored if this is a data: url.
105 * Defaults to about:blank if null.
106 * @param historyUrl History url for this data load. Note that for WebView compatibility,
107 * this is ignored if baseUrl is a data: url. Defaults to about:blank
110 public static LoadUrlParams createLoadDataParamsWithBaseUrl(
111 String data, String mimeType, boolean isBase64Encoded,
112 String baseUrl, String historyUrl) {
113 return createLoadDataParamsWithBaseUrl(data, mimeType, isBase64Encoded,
114 baseUrl, historyUrl, null);
118 * Helper method to create a LoadUrlParams object for data url with base
120 * @param data Data to be loaded.
121 * @param mimeType Mime type of the data.
122 * @param isBase64Encoded True if the data is encoded in Base 64 format.
123 * @param baseUrl Base url of this data load. Note that for WebView compatibility,
124 * baseUrl and historyUrl are ignored if this is a data: url.
125 * Defaults to about:blank if null.
126 * @param historyUrl History url for this data load. Note that for WebView compatibility,
127 * this is ignored if baseUrl is a data: url. Defaults to about:blank
129 * @param charset The character set for the data. Pass null if the mime type
130 * does not require a special charset.
132 public static LoadUrlParams createLoadDataParamsWithBaseUrl(
133 String data, String mimeType, boolean isBase64Encoded,
134 String baseUrl, String historyUrl, String charset) {
135 LoadUrlParams params = createLoadDataParams(data, mimeType, isBase64Encoded, charset);
136 // For WebView compatibility, when the base URL has the 'data:'
137 // scheme, we treat it as a regular data URL load and skip setting
138 // baseUrl and historyUrl.
139 // TODO(joth): we should just append baseURL and historyURL here, and move the
140 // WebView specific transform up to a wrapper factory function in android_webview/.
141 if (baseUrl == null || !baseUrl.toLowerCase().startsWith("data:")) {
142 params.setBaseUrlForDataUrl(baseUrl != null ? baseUrl : "about:blank");
143 params.setVirtualUrlForDataUrl(historyUrl != null ? historyUrl : "about:blank");
149 * Helper method to create a LoadUrlParams object for an HTTP POST load.
150 * @param url URL of the load.
151 * @param postData Post data of the load. Can be null.
153 public static LoadUrlParams createLoadHttpPostParams(
154 String url, byte[] postData) {
155 LoadUrlParams params = new LoadUrlParams(url);
156 params.setLoadType(LOAD_TYPE_BROWSER_INITIATED_HTTP_POST);
157 params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
158 params.setPostData(postData);
165 public String getUrl() {
170 * Return the base url for a data url, otherwise null.
172 public String getBaseUrl() {
173 return mBaseUrlForDataUrl;
177 * Set load type of this load. Defaults to LOAD_TYPE_DEFAULT.
178 * @param loadType One of LOAD_TYPE static constants above.
180 public void setLoadType(int loadType) {
181 mLoadUrlType = loadType;
185 * Set transition type of this load. Defaults to PAGE_TRANSITION_LINK.
186 * @param transitionType One of PAGE_TRANSITION static constants in ContentView.
188 public void setTransitionType(int transitionType) {
189 mTransitionType = transitionType;
193 * Return the transition type.
195 public int getTransitionType() {
196 return mTransitionType;
200 * Set user agent override option of this load. Defaults to UA_OVERRIDE_INHERIT.
201 * @param uaOption One of UA_OVERRIDE static constants above.
203 public void setOverrideUserAgent(int uaOption) {
204 mUaOverrideOption = uaOption;
208 * Set extra headers for this load.
209 * @param extraHeaders Extra HTTP headers for this load. Note that these
210 * headers will never overwrite existing ones set by Chromium.
212 public void setExtraHeaders(Map<String, String> extraHeaders) {
213 mExtraHeaders = extraHeaders;
217 * Return the extra headers as a single String separated by "\n", or null if no extra header
218 * is set. This form is suitable for passing to native
219 * NavigationController::LoadUrlParams::extra_headers.
221 String getExtraHeadersString() {
222 if (mExtraHeaders == null) return null;
224 StringBuilder headerBuilder = new StringBuilder();
225 for (Map.Entry<String, String> header : mExtraHeaders.entrySet()) {
226 if (headerBuilder.length() > 0) headerBuilder.append("\n");
228 // Header name should be lower case.
229 headerBuilder.append(header.getKey().toLowerCase());
230 headerBuilder.append(":");
231 headerBuilder.append(header.getValue());
234 return headerBuilder.toString();
238 * Set the post data of this load. This field is ignored unless load type is
239 * LOAD_TYPE_BROWSER_INITIATED_HTTP_POST.
240 * @param postData Post data for this http post load.
242 public void setPostData(byte[] postData) {
243 mPostData = postData;
247 * Set the base url for data load. It is used both to resolve relative URLs
248 * and when applying JavaScript's same origin policy. It is ignored unless
249 * load type is LOAD_TYPE_DATA.
250 * @param baseUrl The base url for this data load.
252 public void setBaseUrlForDataUrl(String baseUrl) {
253 mBaseUrlForDataUrl = baseUrl;
257 * Set the virtual url for data load. It is the url displayed to the user.
258 * It is ignored unless load type is LOAD_TYPE_DATA.
259 * @param virtualUrl The virtual url for this data load.
261 public void setVirtualUrlForDataUrl(String virtualUrl) {
262 mVirtualUrlForDataUrl = virtualUrl;
266 * Set whether the load should be able to access local resources. This
269 public void setCanLoadLocalResources(boolean canLoad) {
270 mCanLoadLocalResources = canLoad;
273 public int getLoadUrlType() {
277 public boolean isBaseUrlDataScheme() {
278 // If there's no base url set, but this is a data load then
279 // treat the scheme as data:.
280 if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) {
283 return nativeIsDataScheme(mBaseUrlForDataUrl);
286 @SuppressWarnings("unused")
288 private static void initializeConstants(
289 int load_type_default,
290 int load_type_browser_initiated_http_post,
292 int ua_override_inherit,
293 int ua_override_false,
294 int ua_override_true) {
295 LOAD_TYPE_DEFAULT = load_type_default;
296 LOAD_TYPE_BROWSER_INITIATED_HTTP_POST = load_type_browser_initiated_http_post;
297 LOAD_TYPE_DATA = load_type_data;
298 UA_OVERRIDE_INHERIT = ua_override_inherit;
299 UA_OVERRIDE_FALSE = ua_override_false;
300 UA_OVERRIDE_TRUE = ua_override_true;
304 * Parses |url| as a GURL on the native side, and
305 * returns true if it's scheme is data:.
307 private static native boolean nativeIsDataScheme(String url);