Home | History | Annotate | Download | only in browser
      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.
      4 
      5 package org.chromium.content.browser;
      6 
      7 import org.chromium.base.CalledByNative;
      8 import org.chromium.base.JNINamespace;
      9 
     10 import java.util.Map;
     11 
     12 /**
     13  * Holds parameters for ContentViewCore.LoadUrl. Parameters should match
     14  * counterparts in NavigationController::LoadURLParams, including default
     15  * values.
     16  */
     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;
     24 
     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;
     31 
     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
     35     // this class.
     36     final String mUrl;
     37     int mLoadUrlType;
     38     int mTransitionType;
     39     int mUaOverrideOption;
     40     private Map<String, String> mExtraHeaders;
     41     byte[] mPostData;
     42     String mBaseUrlForDataUrl;
     43     String mVirtualUrlForDataUrl;
     44     boolean mCanLoadLocalResources;
     45 
     46     public LoadUrlParams(String url) {
     47         // Check initializeConstants was called.
     48         assert LOAD_TYPE_DEFAULT != LOAD_TYPE_BROWSER_INITIATED_HTTP_POST;
     49 
     50         mUrl = url;
     51         mLoadUrlType = LOAD_TYPE_DEFAULT;
     52         mTransitionType = PageTransitionTypes.PAGE_TRANSITION_LINK;
     53         mUaOverrideOption = UA_OVERRIDE_INHERIT;
     54         mPostData = null;
     55         mBaseUrlForDataUrl = null;
     56         mVirtualUrlForDataUrl = null;
     57     }
     58 
     59     /**
     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.
     64      */
     65     public static LoadUrlParams createLoadDataParams(
     66         String data, String mimeType, boolean isBase64Encoded) {
     67         return createLoadDataParams(data, mimeType, isBase64Encoded, null);
     68     }
     69 
     70     /**
     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.
     77      */
     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);
     84         }
     85         if (isBase64Encoded) {
     86             dataUrl.append(";base64");
     87         }
     88         dataUrl.append(",");
     89         dataUrl.append(data);
     90 
     91         LoadUrlParams params = new LoadUrlParams(dataUrl.toString());
     92         params.setLoadType(LoadUrlParams.LOAD_TYPE_DATA);
     93         params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
     94         return params;
     95     }
     96 
     97     /**
     98      * Helper method to create a LoadUrlParams object for data url with base
     99      * and virtual url.
    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
    108      *                   if null.
    109      */
    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);
    115     }
    116 
    117     /**
    118      * Helper method to create a LoadUrlParams object for data url with base
    119      * and virtual url.
    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
    128      *                   if null.
    129      * @param charset The character set for the data. Pass null if the mime type
    130      *                does not require a special charset.
    131      */
    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");
    144         }
    145         return params;
    146     }
    147 
    148     /**
    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.
    152      */
    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);
    159         return params;
    160     }
    161 
    162     /**
    163      * Return the url.
    164      */
    165     public String getUrl() {
    166         return mUrl;
    167     }
    168 
    169     /**
    170      * Return the base url for a data url, otherwise null.
    171      */
    172     public String getBaseUrl() {
    173         return mBaseUrlForDataUrl;
    174     }
    175 
    176     /**
    177      * Set load type of this load. Defaults to LOAD_TYPE_DEFAULT.
    178      * @param loadType One of LOAD_TYPE static constants above.
    179      */
    180     public void setLoadType(int loadType) {
    181         mLoadUrlType = loadType;
    182     }
    183 
    184     /**
    185      * Set transition type of this load. Defaults to PAGE_TRANSITION_LINK.
    186      * @param transitionType One of PAGE_TRANSITION static constants in ContentView.
    187      */
    188     public void setTransitionType(int transitionType) {
    189         mTransitionType = transitionType;
    190     }
    191 
    192     /**
    193      * Return the transition type.
    194      */
    195     public int getTransitionType() {
    196         return mTransitionType;
    197     }
    198 
    199     /**
    200      * Set user agent override option of this load. Defaults to UA_OVERRIDE_INHERIT.
    201      * @param uaOption One of UA_OVERRIDE static constants above.
    202      */
    203     public void setOverrideUserAgent(int uaOption) {
    204         mUaOverrideOption = uaOption;
    205     }
    206 
    207     /**
    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.
    211      */
    212     public void setExtraHeaders(Map<String, String> extraHeaders) {
    213         mExtraHeaders = extraHeaders;
    214     }
    215 
    216     /**
    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.
    220      */
    221     String getExtraHeadersString() {
    222         return getExtraHeadersString("\n", false);
    223     }
    224 
    225     /**
    226      * Return the extra headers as a single String separated by "\r\n", or null if no extra header
    227      * is set. This form is suitable for passing to native
    228      * net::HttpRequestHeaders::AddHeadersFromString.
    229      */
    230     public String getExtraHttpRequestHeadersString() {
    231         return getExtraHeadersString("\r\n", true);
    232     }
    233 
    234     private String getExtraHeadersString(String delimiter, boolean addTerminator) {
    235         if (mExtraHeaders == null) return null;
    236 
    237         StringBuilder headerBuilder = new StringBuilder();
    238         for (Map.Entry<String, String> header : mExtraHeaders.entrySet()) {
    239             if (headerBuilder.length() > 0) headerBuilder.append(delimiter);
    240 
    241             // Header name should be lower case.
    242             headerBuilder.append(header.getKey().toLowerCase());
    243             headerBuilder.append(":");
    244             headerBuilder.append(header.getValue());
    245         }
    246         if (addTerminator)
    247             headerBuilder.append(delimiter);
    248 
    249         return headerBuilder.toString();
    250     }
    251 
    252     /**
    253      * Set the post data of this load. This field is ignored unless load type is
    254      * LOAD_TYPE_BROWSER_INITIATED_HTTP_POST.
    255      * @param postData Post data for this http post load.
    256      */
    257     public void setPostData(byte[] postData) {
    258         mPostData = postData;
    259     }
    260 
    261     /**
    262      * Set the base url for data load. It is used both to resolve relative URLs
    263      * and when applying JavaScript's same origin policy. It is ignored unless
    264      * load type is LOAD_TYPE_DATA.
    265      * @param baseUrl The base url for this data load.
    266      */
    267     public void setBaseUrlForDataUrl(String baseUrl) {
    268         mBaseUrlForDataUrl = baseUrl;
    269     }
    270 
    271     /**
    272      * Set the virtual url for data load. It is the url displayed to the user.
    273      * It is ignored unless load type is LOAD_TYPE_DATA.
    274      * @param virtualUrl The virtual url for this data load.
    275      */
    276     public void setVirtualUrlForDataUrl(String virtualUrl) {
    277         mVirtualUrlForDataUrl = virtualUrl;
    278     }
    279 
    280     /**
    281      * Set whether the load should be able to access local resources. This
    282      * defaults to false.
    283      */
    284     public void setCanLoadLocalResources(boolean canLoad) {
    285         mCanLoadLocalResources = canLoad;
    286     }
    287 
    288     public int getLoadUrlType() {
    289         return mLoadUrlType;
    290     }
    291 
    292     public boolean isBaseUrlDataScheme() {
    293         // If there's no base url set, but this is a data load then
    294         // treat the scheme as data:.
    295         if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) {
    296             return true;
    297         }
    298         return nativeIsDataScheme(mBaseUrlForDataUrl);
    299     }
    300 
    301     @SuppressWarnings("unused")
    302     @CalledByNative
    303     private static void initializeConstants(
    304             int load_type_default,
    305             int load_type_browser_initiated_http_post,
    306             int load_type_data,
    307             int ua_override_inherit,
    308             int ua_override_false,
    309             int ua_override_true) {
    310         LOAD_TYPE_DEFAULT = load_type_default;
    311         LOAD_TYPE_BROWSER_INITIATED_HTTP_POST = load_type_browser_initiated_http_post;
    312         LOAD_TYPE_DATA = load_type_data;
    313         UA_OVERRIDE_INHERIT = ua_override_inherit;
    314         UA_OVERRIDE_FALSE = ua_override_false;
    315         UA_OVERRIDE_TRUE = ua_override_true;
    316     }
    317 
    318     /**
    319      * Parses |url| as a GURL on the native side, and
    320      * returns true if it's scheme is data:.
    321      */
    322     private static native boolean nativeIsDataScheme(String url);
    323 }
    324