1 package org.robolectric.fakes; 2 3 import android.webkit.WebSettings; 4 import javax.annotation.Nullable; 5 6 /** Robolectric implementation of {@link android.webkit.WebSettings}. */ 7 public class RoboWebSettings extends WebSettings { 8 private static final String DEFAULT_USER_AGENT = 9 "Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30" 10 + " (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"; 11 @Nullable private static String defaultUserAgentOverride = null; 12 13 private boolean blockNetworkImage = false; 14 private boolean javaScriptEnabled = false; 15 private boolean javaScriptCanOpenWindowAutomatically = false; 16 private boolean lightTouchEnabled = false; 17 private boolean needInitialFocus = false; 18 private RenderPriority renderPriority = RenderPriority.NORMAL; 19 private boolean pluginsEnabled = false; 20 private boolean saveFormData = false; 21 private boolean supportMultipleWindows = false; 22 private boolean supportZoom = true; 23 private boolean useWideViewPort = false; 24 private int cacheMode; 25 private WebSettings.LayoutAlgorithm layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS; 26 private String defaultTextEncoding = "UTF-8"; 27 private int defaultFontSize = 16; 28 private boolean loadsImagesAutomatically; 29 private int defaultFixedFontSize; 30 private int minimumLogicalFontSize; 31 private int minimumFontSize; 32 private String fantasyFontFamily; 33 private String cursiveFontFamily; 34 private String serifFontFamily; 35 private String sansSerifFontFamily; 36 private String fixedFontFamily; 37 private String standardFontFamily; 38 private boolean savePassword; 39 private int userAgent; 40 private boolean navDump; 41 private int forceDark; 42 43 @Override getBlockNetworkImage()44 public synchronized boolean getBlockNetworkImage() { 45 return blockNetworkImage; 46 } 47 48 @Override setBlockNetworkImage(boolean flag)49 public synchronized void setBlockNetworkImage(boolean flag) { 50 blockNetworkImage = flag; 51 } 52 53 @Override getJavaScriptEnabled()54 public synchronized boolean getJavaScriptEnabled() { 55 return javaScriptEnabled; 56 } 57 58 @Override setJavaScriptEnabled(boolean flag)59 public synchronized void setJavaScriptEnabled(boolean flag) { 60 javaScriptEnabled = flag; 61 } 62 63 @Override getLightTouchEnabled()64 public boolean getLightTouchEnabled() { 65 return lightTouchEnabled; 66 } 67 68 @Override setLightTouchEnabled(boolean flag)69 public void setLightTouchEnabled(boolean flag) { 70 lightTouchEnabled = flag; 71 } 72 getNeedInitialFocus()73 public boolean getNeedInitialFocus() { 74 return needInitialFocus; 75 } 76 77 @Override setNeedInitialFocus(boolean flag)78 public void setNeedInitialFocus(boolean flag) { 79 needInitialFocus = flag; 80 } 81 82 @Override setRenderPriority(RenderPriority priority)83 public synchronized void setRenderPriority(RenderPriority priority) { 84 renderPriority = priority; 85 } 86 getRenderPriority()87 public RenderPriority getRenderPriority() { 88 return renderPriority; 89 } 90 91 @Override getPluginsEnabled()92 public synchronized boolean getPluginsEnabled() { 93 return pluginsEnabled; 94 } 95 96 @Override setPluginsEnabled(boolean flag)97 public synchronized void setPluginsEnabled(boolean flag) { 98 pluginsEnabled = flag; 99 } 100 getSupportMultipleWindows()101 public boolean getSupportMultipleWindows() { 102 return supportMultipleWindows; 103 } 104 105 @Override setSupportMultipleWindows(boolean support)106 public synchronized void setSupportMultipleWindows(boolean support) { 107 supportMultipleWindows = support; 108 } 109 getSupportZoom()110 public boolean getSupportZoom() { 111 return supportZoom; 112 } 113 114 @Override setSupportZoom(boolean support)115 public void setSupportZoom(boolean support) { 116 supportZoom = support; 117 } 118 119 @Override setCacheMode(int mode)120 public void setCacheMode(int mode) { 121 this.cacheMode = mode; 122 } 123 124 @Override getCacheMode()125 public int getCacheMode() { 126 return cacheMode; 127 } 128 129 @Override getUseWideViewPort()130 public boolean getUseWideViewPort() { 131 return useWideViewPort; 132 } 133 134 @Override setUseWideViewPort(boolean useWideViewPort)135 public void setUseWideViewPort(boolean useWideViewPort) { 136 this.useWideViewPort = useWideViewPort; 137 } 138 139 @Override getSaveFormData()140 public boolean getSaveFormData() { 141 return saveFormData; 142 } 143 144 @Override setSaveFormData(boolean saveFormData)145 public void setSaveFormData(boolean saveFormData) { 146 this.saveFormData = saveFormData; 147 } 148 149 @Override setJavaScriptCanOpenWindowsAutomatically( boolean javaScriptCanOpenWindowAutomatically)150 public void setJavaScriptCanOpenWindowsAutomatically( 151 boolean javaScriptCanOpenWindowAutomatically) { 152 this.javaScriptCanOpenWindowAutomatically = javaScriptCanOpenWindowAutomatically; 153 } 154 155 @Override getJavaScriptCanOpenWindowsAutomatically()156 public boolean getJavaScriptCanOpenWindowsAutomatically() { 157 return this.javaScriptCanOpenWindowAutomatically; 158 } 159 160 @Override setLayoutAlgorithm(WebSettings.LayoutAlgorithm algorithm)161 public synchronized void setLayoutAlgorithm(WebSettings.LayoutAlgorithm algorithm) { 162 this.layoutAlgorithm = algorithm; 163 } 164 165 @Override getDefaultTextEncodingName()166 public String getDefaultTextEncodingName() { 167 return this.defaultTextEncoding; 168 } 169 170 @Override setDefaultTextEncodingName(String defaultTextEncoding)171 public void setDefaultTextEncodingName(String defaultTextEncoding) { 172 this.defaultTextEncoding = defaultTextEncoding; 173 } 174 175 @Override getDefaultFontSize()176 public int getDefaultFontSize() { 177 return defaultFontSize; 178 } 179 180 @Override setDefaultFontSize(int defaultFontSize)181 public void setDefaultFontSize(int defaultFontSize) { 182 this.defaultFontSize = defaultFontSize; 183 } 184 185 @Override getLoadsImagesAutomatically()186 public boolean getLoadsImagesAutomatically() { 187 return loadsImagesAutomatically; 188 } 189 190 @Override setLoadsImagesAutomatically(boolean loadsImagesAutomatically)191 public void setLoadsImagesAutomatically(boolean loadsImagesAutomatically) { 192 this.loadsImagesAutomatically = loadsImagesAutomatically; 193 } 194 195 @Override getDefaultFixedFontSize()196 public int getDefaultFixedFontSize() { 197 return defaultFixedFontSize; 198 } 199 200 @Override setDefaultFixedFontSize(int defaultFixedFontSize)201 public void setDefaultFixedFontSize(int defaultFixedFontSize) { 202 this.defaultFixedFontSize = defaultFixedFontSize; 203 } 204 205 @Override getMinimumLogicalFontSize()206 public int getMinimumLogicalFontSize() { 207 return minimumLogicalFontSize; 208 } 209 210 @Override setMinimumLogicalFontSize(int minimumLogicalFontSize)211 public void setMinimumLogicalFontSize(int minimumLogicalFontSize) { 212 this.minimumLogicalFontSize = minimumLogicalFontSize; 213 } 214 215 @Override getMinimumFontSize()216 public int getMinimumFontSize() { 217 return minimumFontSize; 218 } 219 220 @Override setMinimumFontSize(int minimumFontSize)221 public void setMinimumFontSize(int minimumFontSize) { 222 this.minimumFontSize = minimumFontSize; 223 } 224 225 @Override getFantasyFontFamily()226 public String getFantasyFontFamily() { 227 return fantasyFontFamily; 228 } 229 230 @Override setFantasyFontFamily(String fantasyFontFamily)231 public void setFantasyFontFamily(String fantasyFontFamily) { 232 this.fantasyFontFamily = fantasyFontFamily; 233 } 234 235 @Override getCursiveFontFamily()236 public String getCursiveFontFamily() { 237 return cursiveFontFamily; 238 } 239 240 @Override setCursiveFontFamily(String cursiveFontFamily)241 public void setCursiveFontFamily(String cursiveFontFamily) { 242 this.cursiveFontFamily = cursiveFontFamily; 243 } 244 245 @Override getSerifFontFamily()246 public String getSerifFontFamily() { 247 return serifFontFamily; 248 } 249 250 @Override setSerifFontFamily(String serifFontFamily)251 public void setSerifFontFamily(String serifFontFamily) { 252 this.serifFontFamily = serifFontFamily; 253 } 254 255 @Override getSansSerifFontFamily()256 public String getSansSerifFontFamily() { 257 return sansSerifFontFamily; 258 } 259 260 @Override setSansSerifFontFamily(String sansSerifFontFamily)261 public void setSansSerifFontFamily(String sansSerifFontFamily) { 262 this.sansSerifFontFamily = sansSerifFontFamily; 263 } 264 265 @Override getFixedFontFamily()266 public String getFixedFontFamily() { 267 return fixedFontFamily; 268 } 269 270 @Override setFixedFontFamily(String fixedFontFamily)271 public void setFixedFontFamily(String fixedFontFamily) { 272 this.fixedFontFamily = fixedFontFamily; 273 } 274 275 @Override getStandardFontFamily()276 public String getStandardFontFamily() { 277 return standardFontFamily; 278 } 279 280 @Override setStandardFontFamily(String standardFontFamily)281 public void setStandardFontFamily(String standardFontFamily) { 282 this.standardFontFamily = standardFontFamily; 283 } 284 285 @Override getLayoutAlgorithm()286 public LayoutAlgorithm getLayoutAlgorithm() { 287 return layoutAlgorithm; 288 } 289 290 @Override supportMultipleWindows()291 public boolean supportMultipleWindows() { 292 return supportMultipleWindows; 293 } 294 295 @Override getSavePassword()296 public boolean getSavePassword() { 297 return savePassword; 298 } 299 300 @Override setSavePassword(boolean savePassword)301 public void setSavePassword(boolean savePassword) { 302 this.savePassword = savePassword; 303 } 304 305 @Override supportZoom()306 public boolean supportZoom() { 307 return supportZoom; 308 } 309 310 @Override getUserAgent()311 public int getUserAgent() { 312 return userAgent; 313 } 314 315 @Override setUserAgent(int userAgent)316 public void setUserAgent(int userAgent) { 317 this.userAgent = userAgent; 318 } 319 320 @Override getNavDump()321 public boolean getNavDump() { 322 return navDump; 323 } 324 325 @Override setNavDump(boolean navDump)326 public void setNavDump(boolean navDump) { 327 this.navDump = navDump; 328 } 329 330 private boolean allowFileAccess = true; 331 private boolean builtInZoomControls = true; 332 private String userAgentString = null; 333 334 @Override getAllowFileAccess()335 public boolean getAllowFileAccess() { 336 return allowFileAccess; 337 } 338 339 @Override setAllowFileAccess(boolean allow)340 public void setAllowFileAccess(boolean allow) { 341 allowFileAccess = allow; 342 } 343 344 @Override getBuiltInZoomControls()345 public boolean getBuiltInZoomControls() { 346 return builtInZoomControls; 347 } 348 349 @Override setBuiltInZoomControls(boolean enabled)350 public void setBuiltInZoomControls(boolean enabled) { 351 builtInZoomControls = enabled; 352 } 353 354 @Override setUserAgentString(@ullable String ua)355 public synchronized void setUserAgentString(@Nullable String ua) { 356 userAgentString = ua; 357 } 358 359 @Override getUserAgentString()360 public synchronized String getUserAgentString() { 361 return userAgentString == null || userAgentString.isEmpty() 362 ? getDefaultUserAgent() 363 : userAgentString; 364 } 365 366 // End API 3 367 368 private boolean databaseEnabled = false; 369 private String databasePath = "database"; 370 private String geolocationDatabasePath = "geolocation"; 371 private boolean geolocationEnabled = false; 372 373 @Override getDatabaseEnabled()374 public synchronized boolean getDatabaseEnabled() { 375 return databaseEnabled; 376 } 377 378 @Override setDatabaseEnabled(boolean flag)379 public synchronized void setDatabaseEnabled(boolean flag) { 380 databaseEnabled = flag; 381 } 382 383 @Override setDatabasePath(String path)384 public synchronized void setDatabasePath(String path) { 385 databasePath = path; 386 } 387 388 @Override getDatabasePath()389 public synchronized String getDatabasePath() { 390 return databasePath; 391 } 392 getGeolocationDatabasePath()393 public String getGeolocationDatabasePath() { 394 return geolocationDatabasePath; 395 } 396 397 @Override setGeolocationDatabasePath(String geolocationDatabasePath)398 public void setGeolocationDatabasePath(String geolocationDatabasePath) { 399 this.geolocationDatabasePath = geolocationDatabasePath; 400 } 401 getGeolocationEnabled()402 public boolean getGeolocationEnabled() { 403 return geolocationEnabled; 404 } 405 406 @Override setGeolocationEnabled(boolean geolocationEnabled)407 public void setGeolocationEnabled(boolean geolocationEnabled) { 408 this.geolocationEnabled = geolocationEnabled; 409 } 410 411 // End API 5 412 413 private ZoomDensity defaultZoom; 414 private boolean domStorageEnabled = false; 415 private boolean loadWithOverviewMode = false; 416 private boolean appCacheEnabled = false; 417 private long appCacheMaxSize; 418 private String appCachePath = "appcache"; 419 420 @Override setDefaultZoom(ZoomDensity zoom)421 public void setDefaultZoom(ZoomDensity zoom) { 422 this.defaultZoom = zoom; 423 } 424 425 @Override getDefaultZoom()426 public ZoomDensity getDefaultZoom() { 427 return defaultZoom; 428 } 429 430 @Override getDomStorageEnabled()431 public synchronized boolean getDomStorageEnabled() { 432 return domStorageEnabled; 433 } 434 435 @Override setDomStorageEnabled(boolean flag)436 public synchronized void setDomStorageEnabled(boolean flag) { 437 domStorageEnabled = flag; 438 } 439 440 @Override getLoadWithOverviewMode()441 public boolean getLoadWithOverviewMode() { 442 return loadWithOverviewMode; 443 } 444 445 @Override setLoadWithOverviewMode(boolean flag)446 public void setLoadWithOverviewMode(boolean flag) { 447 loadWithOverviewMode = flag; 448 } 449 getAppCacheEnabled()450 public boolean getAppCacheEnabled() { 451 return appCacheEnabled; 452 } 453 454 @Override setAppCacheEnabled(boolean appCacheEnabled)455 public void setAppCacheEnabled(boolean appCacheEnabled) { 456 this.appCacheEnabled = appCacheEnabled; 457 } 458 459 @Override setAppCacheMaxSize(long appCacheMaxSize)460 public void setAppCacheMaxSize(long appCacheMaxSize) { 461 this.appCacheMaxSize = appCacheMaxSize; 462 } 463 getAppCacheMaxSize()464 public long getAppCacheMaxSize() { 465 return appCacheMaxSize; 466 } 467 getAppCachePath()468 public String getAppCachePath() { 469 return appCachePath; 470 } 471 472 @Override setAppCachePath(String appCachePath)473 public void setAppCachePath(String appCachePath) { 474 this.appCachePath = appCachePath; 475 } 476 477 // End API 7 478 479 private boolean blockNetworkLoads = false; 480 private WebSettings.PluginState pluginState = WebSettings.PluginState.OFF; 481 482 @Override getBlockNetworkLoads()483 public synchronized boolean getBlockNetworkLoads() { 484 return blockNetworkLoads; 485 } 486 487 @Override setBlockNetworkLoads(boolean flag)488 public synchronized void setBlockNetworkLoads(boolean flag) { 489 blockNetworkLoads = flag; 490 } 491 492 @Override getPluginState()493 public synchronized WebSettings.PluginState getPluginState() { 494 return pluginState; 495 } 496 497 @Override setPluginState(WebSettings.PluginState state)498 public synchronized void setPluginState(WebSettings.PluginState state) { 499 pluginState = state; 500 } 501 502 // End API 8 503 504 private boolean useWebViewBackgroundForOverscrollBackground; 505 506 @Override getUseWebViewBackgroundForOverscrollBackground()507 public boolean getUseWebViewBackgroundForOverscrollBackground() { 508 return useWebViewBackgroundForOverscrollBackground; 509 } 510 511 @Override setUseWebViewBackgroundForOverscrollBackground( boolean useWebViewBackgroundForOverscrollBackground)512 public void setUseWebViewBackgroundForOverscrollBackground( 513 boolean useWebViewBackgroundForOverscrollBackground) { 514 this.useWebViewBackgroundForOverscrollBackground = useWebViewBackgroundForOverscrollBackground; 515 } 516 517 // End API 9 518 519 private boolean enableSmoothTransition; 520 private boolean allowContentAccess = true; 521 private boolean displayZoomControls; 522 523 @Override enableSmoothTransition()524 public boolean enableSmoothTransition() { 525 return enableSmoothTransition; 526 } 527 528 @Override setEnableSmoothTransition(boolean enableSmoothTransition)529 public void setEnableSmoothTransition(boolean enableSmoothTransition) { 530 this.enableSmoothTransition = enableSmoothTransition; 531 } 532 533 @Override setAllowContentAccess(boolean allow)534 public void setAllowContentAccess(boolean allow) { 535 allowContentAccess = allow; 536 } 537 538 @Override getAllowContentAccess()539 public boolean getAllowContentAccess() { 540 return allowContentAccess; 541 } 542 543 @Override setDisplayZoomControls(boolean enabled)544 public void setDisplayZoomControls(boolean enabled) { 545 displayZoomControls = enabled; 546 } 547 548 @Override getDisplayZoomControls()549 public boolean getDisplayZoomControls() { 550 return displayZoomControls; 551 } 552 553 // End API 11 554 555 private int textZoom = 100; 556 557 @Override getTextZoom()558 public int getTextZoom() { 559 return textZoom; 560 } 561 562 @Override setTextZoom(int textZoom)563 public void setTextZoom(int textZoom) { 564 this.textZoom = textZoom; 565 } 566 567 // End API 14 568 569 private boolean allowFileAccessFromFile = true; 570 private boolean allowUniversalAccessFromFile = true; 571 572 @Override getAllowFileAccessFromFileURLs()573 public boolean getAllowFileAccessFromFileURLs() { 574 return allowFileAccessFromFile; 575 } 576 577 @Override setAllowFileAccessFromFileURLs(boolean allow)578 public void setAllowFileAccessFromFileURLs(boolean allow) { 579 allowFileAccessFromFile = allow; 580 } 581 582 @Override getAllowUniversalAccessFromFileURLs()583 public boolean getAllowUniversalAccessFromFileURLs() { 584 return allowUniversalAccessFromFile; 585 } 586 587 @Override setAllowUniversalAccessFromFileURLs(boolean allow)588 public void setAllowUniversalAccessFromFileURLs(boolean allow) { 589 allowUniversalAccessFromFile = allow; 590 } 591 592 // End API 16 593 594 private boolean mediaPlaybackRequiresUserGesture = true; 595 596 @Override getMediaPlaybackRequiresUserGesture()597 public boolean getMediaPlaybackRequiresUserGesture() { 598 return mediaPlaybackRequiresUserGesture; 599 } 600 601 @Override setMediaPlaybackRequiresUserGesture(boolean require)602 public void setMediaPlaybackRequiresUserGesture(boolean require) { 603 mediaPlaybackRequiresUserGesture = require; 604 } 605 606 // End API 17 607 608 private int mixedContentMode; 609 private boolean acceptThirdPartyCookies; 610 private boolean videoOverlayForEmbeddedEncryptedVideoEnabled; 611 612 @Override setMixedContentMode(int mixedContentMode)613 public void setMixedContentMode(int mixedContentMode) { 614 this.mixedContentMode = mixedContentMode; 615 } 616 617 @Override getMixedContentMode()618 public int getMixedContentMode() { 619 return mixedContentMode; 620 } 621 622 @Override setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean b)623 public void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean b) { 624 videoOverlayForEmbeddedEncryptedVideoEnabled = b; 625 } 626 627 @Override getVideoOverlayForEmbeddedEncryptedVideoEnabled()628 public boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled() { 629 return videoOverlayForEmbeddedEncryptedVideoEnabled; 630 } 631 632 @Override getAcceptThirdPartyCookies()633 public boolean getAcceptThirdPartyCookies() { 634 return acceptThirdPartyCookies; 635 } 636 637 @Override setAcceptThirdPartyCookies(boolean acceptThirdPartyCookies)638 public void setAcceptThirdPartyCookies(boolean acceptThirdPartyCookies) { 639 this.acceptThirdPartyCookies = acceptThirdPartyCookies; 640 } 641 642 // End API 21 643 644 @Override setOffscreenPreRaster(boolean enabled)645 public void setOffscreenPreRaster(boolean enabled) {} 646 647 @Override getOffscreenPreRaster()648 public boolean getOffscreenPreRaster() { 649 return false; 650 } 651 652 // End API 23 653 654 @Override getDisabledActionModeMenuItems()655 public int getDisabledActionModeMenuItems() { 656 return 0; 657 } 658 659 @Override setDisabledActionModeMenuItems(int menuItems)660 public void setDisabledActionModeMenuItems(int menuItems) {} 661 662 // End API 24. 663 664 @Override getSafeBrowsingEnabled()665 public boolean getSafeBrowsingEnabled() { 666 return false; 667 } 668 669 @Override setSafeBrowsingEnabled(boolean enabled)670 public void setSafeBrowsingEnabled(boolean enabled) {} 671 672 // End API 26 673 674 @Override getForceDark()675 public int getForceDark() { 676 return forceDark; 677 } 678 679 @Override setForceDark(int forceDark)680 public void setForceDark(int forceDark) { 681 this.forceDark = forceDark; 682 } 683 684 // End API 29 685 686 /** 687 * Returns the default User-Agent used by a WebView. An instance of WebView could use a different 688 * User-Agent if a call is made to {@link WebSettings#setUserAgentString(String)}. 689 * 690 * <p>The default User-Agent can be overridden (for the entire application) by calling {@link 691 * #setDefaultUserAgentOverride(String)}. 692 */ getDefaultUserAgent()693 public static String getDefaultUserAgent() { 694 return defaultUserAgentOverride == null ? DEFAULT_USER_AGENT : defaultUserAgentOverride; 695 } 696 697 /** 698 * Overrides the default user agent for all WebViews. The value set here is returned from {@link 699 * #getDefaultUserAgent()}. 700 * 701 * <p>Note that particular WebView instances will ignore this value if they have been configured 702 * with a custom user agent via {@link WebSettings#setUserAgentString(String)}. 703 * 704 * <p>If the value is null, the default user agent will be provided by Robolectric. 705 */ setDefaultUserAgentOverride(@ullable String defaultUserAgent)706 public static void setDefaultUserAgentOverride(@Nullable String defaultUserAgent) { 707 defaultUserAgentOverride = defaultUserAgent; 708 } 709 } 710