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_public.browser; 6 7 import org.chromium.base.CalledByNative; 8 import org.chromium.base.JNINamespace; 9 import org.chromium.content_public.common.Referrer; 10 import org.chromium.ui.base.PageTransitionTypes; 11 12 import java.util.Locale; 13 import 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") 21 public 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