1 // Copyright 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;
9 import org.chromium.content_public.Referrer;
11 import java.util.Locale;
15 * Holds parameters for ContentViewCore.LoadUrl. Parameters should match
16 * counterparts in NavigationController::LoadURLParams, including default
19 @JNINamespace("content")
20 public class LoadUrlParams {
21 // Should match NavigationController::LoadUrlType exactly. See comments
22 // there for proper usage. initializeConstants() checks that the values
24 public static final int LOAD_TYPE_DEFAULT = 0;
25 public static final int LOAD_TYPE_BROWSER_INITIATED_HTTP_POST = 1;
26 public static final int LOAD_TYPE_DATA = 2;
28 // Should match NavigationController::UserAgentOverrideOption exactly.
29 // See comments there for proper usage. initializeConstants() checks that
30 // the values are correct.
31 public static final int UA_OVERRIDE_INHERIT = 0;
32 public static final int UA_OVERRIDE_FALSE = 1;
33 public static final int UA_OVERRIDE_TRUE = 2;
35 // Fields with counterparts in NavigationController::LoadURLParams.
36 // Package private so that ContentViewCore.loadUrl can pass them down to
37 // native code. Should not be accessed directly anywhere else outside of
43 private Map<String, String> mExtraHeaders;
44 private String mVerbatimHeaders;
45 int mUaOverrideOption;
47 String mBaseUrlForDataUrl;
48 String mVirtualUrlForDataUrl;
49 boolean mCanLoadLocalResources;
52 * Creates an instance with default page transition type.
53 * @param url the url to be loaded
55 public LoadUrlParams(String url) {
56 this(url, PageTransitionTypes.PAGE_TRANSITION_LINK);
60 * Creates an instance with the given page transition type.
61 * @param url the url to be loaded
62 * @param transitionType the PageTransitionType constant corresponding to the load
64 public LoadUrlParams(String url, int transitionType) {
66 mTransitionType = transitionType;
68 // Initialize other fields to defaults matching defaults of the native
69 // NavigationController::LoadUrlParams.
70 mLoadUrlType = LOAD_TYPE_DEFAULT;
71 mUaOverrideOption = UA_OVERRIDE_INHERIT;
73 mBaseUrlForDataUrl = null;
74 mVirtualUrlForDataUrl = null;
78 * Helper method to create a LoadUrlParams object for data url.
79 * @param data Data to be loaded.
80 * @param mimeType Mime type of the data.
81 * @param isBase64Encoded True if the data is encoded in Base 64 format.
83 public static LoadUrlParams createLoadDataParams(
84 String data, String mimeType, boolean isBase64Encoded) {
85 return createLoadDataParams(data, mimeType, isBase64Encoded, null);
89 * Helper method to create a LoadUrlParams object for data url.
90 * @param data Data to be loaded.
91 * @param mimeType Mime type of the data.
92 * @param isBase64Encoded True if the data is encoded in Base 64 format.
93 * @param charset The character set for the data. Pass null if the mime type
94 * does not require a special charset.
96 public static LoadUrlParams createLoadDataParams(
97 String data, String mimeType, boolean isBase64Encoded, String charset) {
98 StringBuilder dataUrl = new StringBuilder("data:");
99 dataUrl.append(mimeType);
100 if (charset != null && !charset.isEmpty()) {
101 dataUrl.append(";charset=" + charset);
103 if (isBase64Encoded) {
104 dataUrl.append(";base64");
107 dataUrl.append(data);
109 LoadUrlParams params = new LoadUrlParams(dataUrl.toString());
110 params.setLoadType(LoadUrlParams.LOAD_TYPE_DATA);
111 params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
116 * Helper method to create a LoadUrlParams object for data url with base
118 * @param data Data to be loaded.
119 * @param mimeType Mime type of the data.
120 * @param isBase64Encoded True if the data is encoded in Base 64 format.
121 * @param baseUrl Base url of this data load. Note that for WebView compatibility,
122 * baseUrl and historyUrl are ignored if this is a data: url.
123 * Defaults to about:blank if null.
124 * @param historyUrl History url for this data load. Note that for WebView compatibility,
125 * this is ignored if baseUrl is a data: url. Defaults to about:blank
128 public static LoadUrlParams createLoadDataParamsWithBaseUrl(
129 String data, String mimeType, boolean isBase64Encoded,
130 String baseUrl, String historyUrl) {
131 return createLoadDataParamsWithBaseUrl(data, mimeType, isBase64Encoded,
132 baseUrl, historyUrl, null);
136 * Helper method to create a LoadUrlParams object for data url with base
138 * @param data Data to be loaded.
139 * @param mimeType Mime type of the data.
140 * @param isBase64Encoded True if the data is encoded in Base 64 format.
141 * @param baseUrl Base url of this data load. Note that for WebView compatibility,
142 * baseUrl and historyUrl are ignored if this is a data: url.
143 * Defaults to about:blank if null.
144 * @param historyUrl History url for this data load. Note that for WebView compatibility,
145 * this is ignored if baseUrl is a data: url. Defaults to about:blank
147 * @param charset The character set for the data. Pass null if the mime type
148 * does not require a special charset.
150 public static LoadUrlParams createLoadDataParamsWithBaseUrl(
151 String data, String mimeType, boolean isBase64Encoded,
152 String baseUrl, String historyUrl, String charset) {
153 LoadUrlParams params = createLoadDataParams(data, mimeType, isBase64Encoded, charset);
154 // For WebView compatibility, when the base URL has the 'data:'
155 // scheme, we treat it as a regular data URL load and skip setting
156 // baseUrl and historyUrl.
157 // TODO(joth): we should just append baseURL and historyURL here, and move the
158 // WebView specific transform up to a wrapper factory function in android_webview/.
159 if (baseUrl == null || !baseUrl.toLowerCase(Locale.US).startsWith("data:")) {
160 params.setBaseUrlForDataUrl(baseUrl != null ? baseUrl : "about:blank");
161 params.setVirtualUrlForDataUrl(historyUrl != null ? historyUrl : "about:blank");
167 * Helper method to create a LoadUrlParams object for an HTTP POST load.
168 * @param url URL of the load.
169 * @param postData Post data of the load. Can be null.
171 public static LoadUrlParams createLoadHttpPostParams(
172 String url, byte[] postData) {
173 LoadUrlParams params = new LoadUrlParams(url);
174 params.setLoadType(LOAD_TYPE_BROWSER_INITIATED_HTTP_POST);
175 params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
176 params.setPostData(postData);
183 public void setUrl(String url) {
190 public String getUrl() {
195 * Return the base url for a data url, otherwise null.
197 public String getBaseUrl() {
198 return mBaseUrlForDataUrl;
202 * Set load type of this load. Defaults to LOAD_TYPE_DEFAULT.
203 * @param loadType One of LOAD_TYPE static constants above.
205 public void setLoadType(int loadType) {
206 mLoadUrlType = loadType;
210 * Set transition type of this load. Defaults to PAGE_TRANSITION_LINK.
211 * @param transitionType One of PAGE_TRANSITION static constants in ContentView.
213 public void setTransitionType(int transitionType) {
214 mTransitionType = transitionType;
218 * Return the transition type.
220 public int getTransitionType() {
221 return mTransitionType;
225 * @return the referrer of this load
227 public void setReferrer(Referrer referrer) {
228 mReferrer = referrer;
232 * Sets the referrer of this load.
234 public Referrer getReferrer() {
239 * Set extra headers for this load.
240 * @param extraHeaders Extra HTTP headers for this load. Note that these
241 * headers will never overwrite existing ones set by Chromium.
243 public void setExtraHeaders(Map<String, String> extraHeaders) {
244 mExtraHeaders = extraHeaders;
248 * Return the extra headers as a map.
250 public Map<String, String> getExtraHeaders() {
251 return mExtraHeaders;
255 * Return the extra headers as a single String separated by "\n", or null if no extra header is
256 * set. This form is suitable for passing to native
257 * NavigationController::LoadUrlParams::extra_headers. This will return the headers set in an
258 * exploded form through setExtraHeaders(). Embedders that work with extra headers in opaque
259 * collapsed form can use the setVerbatimHeaders() / getVerbatimHeaders() instead.
261 String getExtraHeadersString() {
262 return getExtraHeadersString("\n", false);
266 * Return the extra headers as a single String separated by "\r\n", or null if no extra header
267 * is set. This form is suitable for passing to native
268 * net::HttpRequestHeaders::AddHeadersFromString.
270 public String getExtraHttpRequestHeadersString() {
271 return getExtraHeadersString("\r\n", true);
274 private String getExtraHeadersString(String delimiter, boolean addTerminator) {
275 if (mExtraHeaders == null) return null;
277 StringBuilder headerBuilder = new StringBuilder();
278 for (Map.Entry<String, String> header : mExtraHeaders.entrySet()) {
279 if (headerBuilder.length() > 0) headerBuilder.append(delimiter);
281 // Header name should be lower case.
282 headerBuilder.append(header.getKey().toLowerCase(Locale.US));
283 headerBuilder.append(":");
284 headerBuilder.append(header.getValue());
287 headerBuilder.append(delimiter);
289 return headerBuilder.toString();
293 * Sets the verbatim extra headers string. This is an alternative to storing the headers in
294 * a map (setExtraHeaders()) for the embedders that use collapsed headers strings.
296 public void setVerbatimHeaders(String headers) {
297 mVerbatimHeaders = headers;
301 * @return the verbatim extra headers string
303 public String getVerbatimHeaders() {
304 return mVerbatimHeaders;
308 * Set user agent override option of this load. Defaults to UA_OVERRIDE_INHERIT.
309 * @param uaOption One of UA_OVERRIDE static constants above.
311 public void setOverrideUserAgent(int uaOption) {
312 mUaOverrideOption = uaOption;
316 * Set the post data of this load. This field is ignored unless load type is
317 * LOAD_TYPE_BROWSER_INITIATED_HTTP_POST.
318 * @param postData Post data for this http post load.
320 public void setPostData(byte[] postData) {
321 mPostData = postData;
325 * @return the data to be sent through POST
327 public byte[] getPostData() {
332 * Set the base url for data load. It is used both to resolve relative URLs
333 * and when applying JavaScript's same origin policy. It is ignored unless
334 * load type is LOAD_TYPE_DATA.
335 * @param baseUrl The base url for this data load.
337 public void setBaseUrlForDataUrl(String baseUrl) {
338 mBaseUrlForDataUrl = baseUrl;
342 * Set the virtual url for data load. It is the url displayed to the user.
343 * It is ignored unless load type is LOAD_TYPE_DATA.
344 * @param virtualUrl The virtual url for this data load.
346 public void setVirtualUrlForDataUrl(String virtualUrl) {
347 mVirtualUrlForDataUrl = virtualUrl;
351 * Set whether the load should be able to access local resources. This
354 public void setCanLoadLocalResources(boolean canLoad) {
355 mCanLoadLocalResources = canLoad;
358 public int getLoadUrlType() {
362 public boolean isBaseUrlDataScheme() {
363 // If there's no base url set, but this is a data load then
364 // treat the scheme as data:.
365 if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) {
368 return nativeIsDataScheme(mBaseUrlForDataUrl);
371 @SuppressWarnings("unused")
373 private static void initializeConstants(
374 int load_type_default,
375 int load_type_browser_initiated_http_post,
377 int ua_override_inherit,
378 int ua_override_false,
379 int ua_override_true) {
380 assert LOAD_TYPE_DEFAULT == load_type_default;
381 assert LOAD_TYPE_BROWSER_INITIATED_HTTP_POST == load_type_browser_initiated_http_post;
382 assert LOAD_TYPE_DATA == load_type_data;
383 assert UA_OVERRIDE_INHERIT == ua_override_inherit;
384 assert UA_OVERRIDE_FALSE == ua_override_false;
385 assert UA_OVERRIDE_TRUE == ua_override_true;
389 * Parses |url| as a GURL on the native side, and
390 * returns true if it's scheme is data:.
392 private static native boolean nativeIsDataScheme(String url);