LoadUrlParams.java revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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
5package org.chromium.content_public.browser;
6
7import org.chromium.base.CalledByNative;
8import org.chromium.base.JNINamespace;
9import org.chromium.content_public.common.Referrer;
10import org.chromium.ui.base.PageTransitionTypes;
11
12import java.util.Locale;
13import java.util.Map;
14
15/**
16 * Holds parameters for NavigationController.LoadUrl. Parameters should match
17 * counterparts in NavigationController::LoadURLParams, including default
18 * values.
19 */
20@JNINamespace("content")
21public class LoadUrlParams {
22    // Should match NavigationController::LoadUrlType exactly. See comments
23    // there for proper usage. initializeConstants() checks that the values
24    // are correct.
25    public static final int LOAD_TYPE_DEFAULT = 0;
26    public static final int LOAD_TYPE_BROWSER_INITIATED_HTTP_POST = 1;
27    public static final int LOAD_TYPE_DATA = 2;
28
29    // Should match NavigationController::UserAgentOverrideOption exactly.
30    // See comments there for proper usage. initializeConstants() checks that
31    // the values are correct.
32    public static final int UA_OVERRIDE_INHERIT = 0;
33    public static final int UA_OVERRIDE_FALSE = 1;
34    public static final int UA_OVERRIDE_TRUE = 2;
35
36    // Fields with counterparts in NavigationController::LoadURLParams.
37    // Package private so that ContentViewCore.loadUrl can pass them down to
38    // native code. Should not be accessed directly anywhere else outside of
39    // this class.
40    String mUrl;
41    int mLoadUrlType;
42    int mTransitionType;
43    Referrer mReferrer;
44    private Map<String, String> mExtraHeaders;
45    private String mVerbatimHeaders;
46    int mUaOverrideOption;
47    byte[] mPostData;
48    String mBaseUrlForDataUrl;
49    String mVirtualUrlForDataUrl;
50    boolean mCanLoadLocalResources;
51    boolean mIsRendererInitiated;
52
53    /**
54     * Creates an instance with default page transition type.
55     * @param url the url to be loaded
56     */
57    public LoadUrlParams(String url) {
58        this(url, PageTransitionTypes.PAGE_TRANSITION_LINK);
59    }
60
61    /**
62     * Creates an instance with the given page transition type.
63     * @param url the url to be loaded
64     * @param transitionType the PageTransitionType constant corresponding to the load
65     */
66    public LoadUrlParams(String url, int transitionType) {
67        mUrl = url;
68        mTransitionType = transitionType;
69
70        // Initialize other fields to defaults matching defaults of the native
71        // NavigationController::LoadUrlParams.
72        mLoadUrlType = LOAD_TYPE_DEFAULT;
73        mUaOverrideOption = UA_OVERRIDE_INHERIT;
74        mPostData = null;
75        mBaseUrlForDataUrl = null;
76        mVirtualUrlForDataUrl = null;
77    }
78
79    /**
80     * Helper method to create a LoadUrlParams object for data url.
81     * @param data Data to be loaded.
82     * @param mimeType Mime type of the data.
83     * @param isBase64Encoded True if the data is encoded in Base 64 format.
84     */
85    public static LoadUrlParams createLoadDataParams(
86        String data, String mimeType, boolean isBase64Encoded) {
87        return createLoadDataParams(data, mimeType, isBase64Encoded, null);
88    }
89
90    /**
91     * Helper method to create a LoadUrlParams object for data url.
92     * @param data Data to be loaded.
93     * @param mimeType Mime type of the data.
94     * @param isBase64Encoded True if the data is encoded in Base 64 format.
95     * @param charset The character set for the data. Pass null if the mime type
96     *                does not require a special charset.
97     */
98    public static LoadUrlParams createLoadDataParams(
99            String data, String mimeType, boolean isBase64Encoded, String charset) {
100        StringBuilder dataUrl = new StringBuilder("data:");
101        dataUrl.append(mimeType);
102        if (charset != null && !charset.isEmpty()) {
103            dataUrl.append(";charset=" + charset);
104        }
105        if (isBase64Encoded) {
106            dataUrl.append(";base64");
107        }
108        dataUrl.append(",");
109        dataUrl.append(data);
110
111        LoadUrlParams params = new LoadUrlParams(dataUrl.toString());
112        params.setLoadType(LoadUrlParams.LOAD_TYPE_DATA);
113        params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
114        return params;
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     */
130    public static LoadUrlParams createLoadDataParamsWithBaseUrl(
131            String data, String mimeType, boolean isBase64Encoded,
132            String baseUrl, String historyUrl) {
133        return createLoadDataParamsWithBaseUrl(data, mimeType, isBase64Encoded,
134                baseUrl, historyUrl, null);
135    }
136
137    /**
138     * Helper method to create a LoadUrlParams object for data url with base
139     * and virtual url.
140     * @param data Data to be loaded.
141     * @param mimeType Mime type of the data.
142     * @param isBase64Encoded True if the data is encoded in Base 64 format.
143     * @param baseUrl Base url of this data load. Note that for WebView compatibility,
144     *                baseUrl and historyUrl are ignored if this is a data: url.
145     *                Defaults to about:blank if null.
146     * @param historyUrl History url for this data load. Note that for WebView compatibility,
147     *                   this is ignored if baseUrl is a data: url. Defaults to about:blank
148     *                   if null.
149     * @param charset The character set for the data. Pass null if the mime type
150     *                does not require a special charset.
151     */
152    public static LoadUrlParams createLoadDataParamsWithBaseUrl(
153            String data, String mimeType, boolean isBase64Encoded,
154            String baseUrl, String historyUrl, String charset) {
155        LoadUrlParams params = createLoadDataParams(data, mimeType, isBase64Encoded, charset);
156        // For WebView compatibility, when the base URL has the 'data:'
157        // scheme, we treat it as a regular data URL load and skip setting
158        // baseUrl and historyUrl.
159        // TODO(joth): we should just append baseURL and historyURL here, and move the
160        // WebView specific transform up to a wrapper factory function in android_webview/.
161        if (baseUrl == null || !baseUrl.toLowerCase(Locale.US).startsWith("data:")) {
162            params.setBaseUrlForDataUrl(baseUrl != null ? baseUrl : "about:blank");
163            params.setVirtualUrlForDataUrl(historyUrl != null ? historyUrl : "about:blank");
164        }
165        return params;
166    }
167
168    /**
169     * Helper method to create a LoadUrlParams object for an HTTP POST load.
170     * @param url URL of the load.
171     * @param postData Post data of the load. Can be null.
172     */
173    public static LoadUrlParams createLoadHttpPostParams(
174            String url, byte[] postData) {
175        LoadUrlParams params = new LoadUrlParams(url);
176        params.setLoadType(LOAD_TYPE_BROWSER_INITIATED_HTTP_POST);
177        params.setTransitionType(PageTransitionTypes.PAGE_TRANSITION_TYPED);
178        params.setPostData(postData);
179        return params;
180    }
181
182    /**
183     * Sets the url.
184     */
185    public void setUrl(String url) {
186        mUrl = url;
187    }
188
189    /**
190     * Return the url.
191     */
192    public String getUrl() {
193        return mUrl;
194    }
195
196    /**
197     * Return the base url for a data url, otherwise null.
198     */
199    public String getBaseUrl() {
200        return mBaseUrlForDataUrl;
201    }
202
203    /**
204     * Set load type of this load. Defaults to LOAD_TYPE_DEFAULT.
205     * @param loadType One of LOAD_TYPE static constants above.
206     */
207    public void setLoadType(int loadType) {
208        mLoadUrlType = loadType;
209    }
210
211    /**
212     * Set transition type of this load. Defaults to PAGE_TRANSITION_LINK.
213     * @param transitionType One of PAGE_TRANSITION static constants in ContentView.
214     */
215    public void setTransitionType(int transitionType) {
216        mTransitionType = transitionType;
217    }
218
219    /**
220     * Return the transition type.
221     */
222    public int getTransitionType() {
223        return mTransitionType;
224    }
225
226    /**
227     * @return the referrer of this load
228     */
229    public void setReferrer(Referrer referrer) {
230        mReferrer = referrer;
231    }
232
233    /**
234     * Sets the referrer of this load.
235     */
236    public Referrer getReferrer() {
237        return mReferrer;
238    }
239
240    /**
241     * Set extra headers for this load.
242     * @param extraHeaders Extra HTTP headers for this load. Note that these
243     *                     headers will never overwrite existing ones set by Chromium.
244     */
245    public void setExtraHeaders(Map<String, String> extraHeaders) {
246        mExtraHeaders = extraHeaders;
247    }
248
249    /**
250     * Return the extra headers as a map.
251     */
252    public Map<String, String> getExtraHeaders() {
253        return mExtraHeaders;
254    }
255
256    /**
257     * Return the extra headers as a single String separated by "\n", or null if no extra header is
258     * set. This form is suitable for passing to native
259     * NavigationController::LoadUrlParams::extra_headers. This will return the headers set in an
260     * exploded form through setExtraHeaders(). Embedders that work with extra headers in opaque
261     * collapsed form can use the setVerbatimHeaders() / getVerbatimHeaders() instead.
262     */
263    public String getExtraHeadersString() {
264        return getExtraHeadersString("\n", false);
265    }
266
267    /**
268     * Return the extra headers as a single String separated by "\r\n", or null if no extra header
269     * is set. This form is suitable for passing to native
270     * net::HttpRequestHeaders::AddHeadersFromString.
271     */
272    public String getExtraHttpRequestHeadersString() {
273        return getExtraHeadersString("\r\n", true);
274    }
275
276    private String getExtraHeadersString(String delimiter, boolean addTerminator) {
277        if (mExtraHeaders == null) return null;
278
279        StringBuilder headerBuilder = new StringBuilder();
280        for (Map.Entry<String, String> header : mExtraHeaders.entrySet()) {
281            if (headerBuilder.length() > 0) headerBuilder.append(delimiter);
282
283            // Header name should be lower case.
284            headerBuilder.append(header.getKey().toLowerCase(Locale.US));
285            headerBuilder.append(":");
286            headerBuilder.append(header.getValue());
287        }
288        if (addTerminator)
289            headerBuilder.append(delimiter);
290
291        return headerBuilder.toString();
292    }
293
294    /**
295     * Sets the verbatim extra headers string. This is an alternative to storing the headers in
296     * a map (setExtraHeaders()) for the embedders that use collapsed headers strings.
297     */
298    public void setVerbatimHeaders(String headers) {
299        mVerbatimHeaders = headers;
300    }
301
302    /**
303     * @return the verbatim extra headers string
304     */
305    public String getVerbatimHeaders() {
306        return mVerbatimHeaders;
307    }
308
309    /**
310     * Set user agent override option of this load. Defaults to UA_OVERRIDE_INHERIT.
311     * @param uaOption One of UA_OVERRIDE static constants above.
312     */
313    public void setOverrideUserAgent(int uaOption) {
314        mUaOverrideOption = uaOption;
315    }
316
317    /**
318     * Get user agent override option of this load. Defaults to UA_OVERRIDE_INHERIT.
319     * @param uaOption One of UA_OVERRIDE static constants above.
320     */
321    public int getUserAgentOverrideOption() {
322        return mUaOverrideOption;
323    }
324
325    /**
326     * Set the post data of this load. This field is ignored unless load type is
327     * LOAD_TYPE_BROWSER_INITIATED_HTTP_POST.
328     * @param postData Post data for this http post load.
329     */
330    public void setPostData(byte[] postData) {
331        mPostData = postData;
332    }
333
334    /**
335     * @return the data to be sent through POST
336     */
337    public byte[] getPostData() {
338        return mPostData;
339    }
340
341    /**
342     * Set the base url for data load. It is used both to resolve relative URLs
343     * and when applying JavaScript's same origin policy. It is ignored unless
344     * load type is LOAD_TYPE_DATA.
345     * @param baseUrl The base url for this data load.
346     */
347    public void setBaseUrlForDataUrl(String baseUrl) {
348        mBaseUrlForDataUrl = baseUrl;
349    }
350
351    /**
352     * Get the virtual url for data load. It is the url displayed to the user.
353     * It is ignored unless load type is LOAD_TYPE_DATA.
354     * @return The virtual url for this data load.
355     */
356    public String getVirtualUrlForDataUrl() {
357        return mVirtualUrlForDataUrl;
358    }
359
360    /**
361     * Set the virtual url for data load. It is the url displayed to the user.
362     * It is ignored unless load type is LOAD_TYPE_DATA.
363     * @param virtualUrl The virtual url for this data load.
364     */
365    public void setVirtualUrlForDataUrl(String virtualUrl) {
366        mVirtualUrlForDataUrl = virtualUrl;
367    }
368
369    /**
370     * Set whether the load should be able to access local resources. This
371     * defaults to false.
372     */
373    public void setCanLoadLocalResources(boolean canLoad) {
374        mCanLoadLocalResources = canLoad;
375    }
376
377    /**
378     * Get whether the load should be able to access local resources. This
379     * defaults to false.
380     */
381    public boolean getCanLoadLocalResources() {
382        return mCanLoadLocalResources;
383    }
384
385    public int getLoadUrlType() {
386        return mLoadUrlType;
387    }
388
389    /**
390     * @param rendererInitiated Whether or not this load was initiated from a renderer.
391     */
392    public void setIsRendererInitiated(boolean rendererInitiated) {
393        mIsRendererInitiated = rendererInitiated;
394    }
395
396    /**
397     * @return Whether or not this load was initiated from a renderer or not.
398     */
399    public boolean getIsRendererInitiated() {
400        return mIsRendererInitiated;
401    }
402
403    public boolean isBaseUrlDataScheme() {
404        // If there's no base url set, but this is a data load then
405        // treat the scheme as data:.
406        if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) {
407            return true;
408        }
409        return nativeIsDataScheme(mBaseUrlForDataUrl);
410    }
411
412    @SuppressWarnings("unused")
413    @CalledByNative
414    private static void initializeConstants(
415            int loadTypeDefault,
416            int loadTypeBrowserInitiatedHttpPost,
417            int loadTypeData,
418            int uaOverrideInherit,
419            int uaOverrideFalse,
420            int uaOverrideTrue) {
421        assert LOAD_TYPE_DEFAULT == loadTypeDefault;
422        assert LOAD_TYPE_BROWSER_INITIATED_HTTP_POST == loadTypeBrowserInitiatedHttpPost;
423        assert LOAD_TYPE_DATA == loadTypeData;
424        assert UA_OVERRIDE_INHERIT == uaOverrideInherit;
425        assert UA_OVERRIDE_FALSE == uaOverrideFalse;
426        assert UA_OVERRIDE_TRUE == uaOverrideTrue;
427    }
428
429    /**
430     * Parses |url| as a GURL on the native side, and
431     * returns true if it's scheme is data:.
432     */
433    private static native boolean nativeIsDataScheme(String url);
434}
435