// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.content.browser;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import java.util.Map;
/**
* Holds parameters for ContentViewCore.LoadUrl. Parameters should match
* counterparts in NavigationController::LoadURLParams, including default
* values.
*/
@JNINamespace("content")
public class LoadUrlParams {
// Should match NavigationController::LoadUrlType exactly. See comments
// there for proper usage. Values are initialized in initializeConstants.
public static int LOAD_TYPE_DEFAULT;
public static int LOAD_TYPE_BROWSER_INITIATED_HTTP_POST;
public static int LOAD_TYPE_DATA;
// Should match NavigationController::UserAgentOverrideOption exactly.
// See comments there for proper usage. Values are initialized in
// initializeConstants.
public static int UA_OVERRIDE_INHERIT;
public static int UA_OVERRIDE_FALSE;
public static int UA_OVERRIDE_TRUE;
// Fields with counterparts in NavigationController::LoadURLParams.
// Package private so that ContentViewCore.loadUrl can pass them down to
// native code. Should not be accessed directly anywhere else outside of
// this class.
final String mUrl;
int mLoadUrlType;
int mTransitionType;
int mUaOverrideOption;
private Map<String, String> mExtraHeaders;
byte[] mPostData;
String mBaseUrlForDataUrl;
String mVirtualUrlForDataUrl;
boolean mCanLoadLocalResources;
public LoadUrlParams(String url) {
// Check initializeConstants was called.
assert LOAD_TYPE_DEFAULT != LOAD_TYPE_BROWSER_INITIATED_HTTP_POST;
mUrl = url;
mLoadUrlType = LOAD_TYPE_DEFAULT;
mTransitionType = PageTransitionTypes.PAGE_TRANSITION_LINK;
mUaOverrideOption = UA_OVERRIDE_INHERIT;
mPostData = null;
mBaseUrlForDataUrl = null;
mVirtualUrlForDataUrl = null;
}
/**
* Helper method to create a LoadUrlParams object for data url.
* @param data Data to be loaded.
* @param mimeType Mime type of the data.
* @param isBase64Encoded True if the data is encoded in Base 64 format.
*/
public static LoadUrlParams createLoadDataParams(
String data, String mimeType, boolean isBase64Encoded) {
return createLoadDataParams(data, mimeType, isBase64Encoded, null);
}
/**
* Helper method to create a LoadUrlParams object for data url.
* @param data Data to be loaded.
* @param mimeType Mime type of the data.
* @param isBase64Encoded True if the data is encoded in Base 64 format.
* @param charset The character set for the data. Pass null if the mime type
* does not require a special charset.
*/
public static LoadUrlParams createLoadDataParams(
String data, String mimeType, boolean isBase64Encoded, String charset) {
StringBuilder dataUrl = new StringBuilder("data:");
dataUrl.append(mimeType);
if (charset != null && !charset.isEmpty()) {
dataUrl.append(";charset=" + charset);
}
if (isBase64Encoded) {
dataUrl.append(";base64");
}
dataUrl.append(",");
dataUrl.append(data);
LoadUrlParams params = new LoadUrlParams(dataUrl.toString());
params.setLoadType(LoadUrlParams.LOAD_TYPE_DATA);
params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
return params;
}
/**
* Helper method to create a LoadUrlParams object for data url with base
* and virtual url.
* @param data Data to be loaded.
* @param mimeType Mime type of the data.
* @param isBase64Encoded True if the data is encoded in Base 64 format.
* @param baseUrl Base url of this data load. Note that for WebView compatibility,
* baseUrl and historyUrl are ignored if this is a data: url.
* Defaults to about:blank if null.
* @param historyUrl History url for this data load. Note that for WebView compatibility,
* this is ignored if baseUrl is a data: url. Defaults to about:blank
* if null.
*/
public static LoadUrlParams createLoadDataParamsWithBaseUrl(
String data, String mimeType, boolean isBase64Encoded,
String baseUrl, String historyUrl) {
return createLoadDataParamsWithBaseUrl(data, mimeType, isBase64Encoded,
baseUrl, historyUrl, null);
}
/**
* Helper method to create a LoadUrlParams object for data url with base
* and virtual url.
* @param data Data to be loaded.
* @param mimeType Mime type of the data.
* @param isBase64Encoded True if the data is encoded in Base 64 format.
* @param baseUrl Base url of this data load. Note that for WebView compatibility,
* baseUrl and historyUrl are ignored if this is a data: url.
* Defaults to about:blank if null.
* @param historyUrl History url for this data load. Note that for WebView compatibility,
* this is ignored if baseUrl is a data: url. Defaults to about:blank
* if null.
* @param charset The character set for the data. Pass null if the mime type
* does not require a special charset.
*/
public static LoadUrlParams createLoadDataParamsWithBaseUrl(
String data, String mimeType, boolean isBase64Encoded,
String baseUrl, String historyUrl, String charset) {
LoadUrlParams params = createLoadDataParams(data, mimeType, isBase64Encoded, charset);
// For WebView compatibility, when the base URL has the 'data:'
// scheme, we treat it as a regular data URL load and skip setting
// baseUrl and historyUrl.
// TODO(joth): we should just append baseURL and historyURL here, and move the
// WebView specific transform up to a wrapper factory function in android_webview/.
if (baseUrl == null || !baseUrl.toLowerCase().startsWith("data:")) {
params.setBaseUrlForDataUrl(baseUrl != null ? baseUrl : "about:blank");
params.setVirtualUrlForDataUrl(historyUrl != null ? historyUrl : "about:blank");
}
return params;
}
/**
* Helper method to create a LoadUrlParams object for an HTTP POST load.
* @param url URL of the load.
* @param postData Post data of the load. Can be null.
*/
public static LoadUrlParams createLoadHttpPostParams(
String url, byte[] postData) {
LoadUrlParams params = new LoadUrlParams(url);
params.setLoadType(LOAD_TYPE_BROWSER_INITIATED_HTTP_POST);
params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
params.setPostData(postData);
return params;
}
/**
* Return the url.
*/
public String getUrl() {
return mUrl;
}
/**
* Return the base url for a data url, otherwise null.
*/
public String getBaseUrl() {
return mBaseUrlForDataUrl;
}
/**
* Set load type of this load. Defaults to LOAD_TYPE_DEFAULT.
* @param loadType One of LOAD_TYPE static constants above.
*/
public void setLoadType(int loadType) {
mLoadUrlType = loadType;
}
/**
* Set transition type of this load. Defaults to PAGE_TRANSITION_LINK.
* @param transitionType One of PAGE_TRANSITION static constants in ContentView.
*/
public void setTransitionType(int transitionType) {
mTransitionType = transitionType;
}
/**
* Return the transition type.
*/
public int getTransitionType() {
return mTransitionType;
}
/**
* Set user agent override option of this load. Defaults to UA_OVERRIDE_INHERIT.
* @param uaOption One of UA_OVERRIDE static constants above.
*/
public void setOverrideUserAgent(int uaOption) {
mUaOverrideOption = uaOption;
}
/**
* Set extra headers for this load.
* @param extraHeaders Extra HTTP headers for this load. Note that these
* headers will never overwrite existing ones set by Chromium.
*/
public void setExtraHeaders(Map<String, String> extraHeaders) {
mExtraHeaders = extraHeaders;
}
/**
* Return the extra headers as a single String separated by "\n", or null if no extra header
* is set. This form is suitable for passing to native
* NavigationController::LoadUrlParams::extra_headers.
*/
String getExtraHeadersString() {
return getExtraHeadersString("\n", false);
}
/**
* Return the extra headers as a single String separated by "\r\n", or null if no extra header
* is set. This form is suitable for passing to native
* net::HttpRequestHeaders::AddHeadersFromString.
*/
public String getExtraHttpRequestHeadersString() {
return getExtraHeadersString("\r\n", true);
}
private String getExtraHeadersString(String delimiter, boolean addTerminator) {
if (mExtraHeaders == null) return null;
StringBuilder headerBuilder = new StringBuilder();
for (Map.Entry<String, String> header : mExtraHeaders.entrySet()) {
if (headerBuilder.length() > 0) headerBuilder.append(delimiter);
// Header name should be lower case.
headerBuilder.append(header.getKey().toLowerCase());
headerBuilder.append(":");
headerBuilder.append(header.getValue());
}
if (addTerminator)
headerBuilder.append(delimiter);
return headerBuilder.toString();
}
/**
* Set the post data of this load. This field is ignored unless load type is
* LOAD_TYPE_BROWSER_INITIATED_HTTP_POST.
* @param postData Post data for this http post load.
*/
public void setPostData(byte[] postData) {
mPostData = postData;
}
/**
* Set the base url for data load. It is used both to resolve relative URLs
* and when applying JavaScript's same origin policy. It is ignored unless
* load type is LOAD_TYPE_DATA.
* @param baseUrl The base url for this data load.
*/
public void setBaseUrlForDataUrl(String baseUrl) {
mBaseUrlForDataUrl = baseUrl;
}
/**
* Set the virtual url for data load. It is the url displayed to the user.
* It is ignored unless load type is LOAD_TYPE_DATA.
* @param virtualUrl The virtual url for this data load.
*/
public void setVirtualUrlForDataUrl(String virtualUrl) {
mVirtualUrlForDataUrl = virtualUrl;
}
/**
* Set whether the load should be able to access local resources. This
* defaults to false.
*/
public void setCanLoadLocalResources(boolean canLoad) {
mCanLoadLocalResources = canLoad;
}
public int getLoadUrlType() {
return mLoadUrlType;
}
public boolean isBaseUrlDataScheme() {
// If there's no base url set, but this is a data load then
// treat the scheme as data:.
if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) {
return true;
}
return nativeIsDataScheme(mBaseUrlForDataUrl);
}
@SuppressWarnings("unused")
@CalledByNative
private static void initializeConstants(
int load_type_default,
int load_type_browser_initiated_http_post,
int load_type_data,
int ua_override_inherit,
int ua_override_false,
int ua_override_true) {
LOAD_TYPE_DEFAULT = load_type_default;
LOAD_TYPE_BROWSER_INITIATED_HTTP_POST = load_type_browser_initiated_http_post;
LOAD_TYPE_DATA = load_type_data;
UA_OVERRIDE_INHERIT = ua_override_inherit;
UA_OVERRIDE_FALSE = ua_override_false;
UA_OVERRIDE_TRUE = ua_override_true;
}
/**
* Parses |url| as a GURL on the native side, and
* returns true if it's scheme is data:.
*/
private static native boolean nativeIsDataScheme(String url);
}