1 /* 2 * Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "Settings.h" 28 29 #include "BackForwardController.h" 30 #include "CachedResourceLoader.h" 31 #include "CookieStorage.h" 32 #include "DOMTimer.h" 33 #include "Database.h" 34 #include "Frame.h" 35 #include "FrameTree.h" 36 #include "FrameView.h" 37 #include "HistoryItem.h" 38 #include "Page.h" 39 #include "PageCache.h" 40 #include "ResourceHandle.h" 41 #include "StorageMap.h" 42 #include <limits> 43 44 using namespace std; 45 46 namespace WebCore { 47 48 static void setLoadsImagesAutomaticallyInAllFrames(Page* page) 49 { 50 for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) 51 frame->document()->cachedResourceLoader()->setAutoLoadImages(page->settings()->loadsImagesAutomatically()); 52 } 53 54 #if USE(SAFARI_THEME) 55 bool Settings::gShouldPaintNativeControls = true; 56 #endif 57 58 #if PLATFORM(WIN) || (OS(WINDOWS) && PLATFORM(WX)) 59 bool Settings::gShouldUseHighResolutionTimers = true; 60 #endif 61 62 // NOTEs 63 // 1) EditingMacBehavior comprises Tiger, Leopard, SnowLeopard and iOS builds, as well QtWebKit and Chromium when built on Mac; 64 // 2) EditingWindowsBehavior comprises Win32 and WinCE builds, as well as QtWebKit and Chromium when built on Windows; 65 // 3) EditingUnixBehavior comprises all unix-based systems, but Darwin/MacOS (and then abusing the terminology); 66 // 99) MacEditingBehavior is used a fallback. 67 static EditingBehaviorType editingBehaviorTypeForPlatform() 68 { 69 return 70 #if OS(DARWIN) 71 EditingMacBehavior 72 #elif OS(WINDOWS) 73 EditingWindowsBehavior 74 #elif OS(UNIX) 75 EditingUnixBehavior 76 #else 77 // Fallback 78 EditingMacBehavior 79 #endif 80 ; 81 } 82 83 Settings::Settings(Page* page) 84 : m_page(page) 85 , m_editableLinkBehavior(EditableLinkDefaultBehavior) 86 , m_textDirectionSubmenuInclusionBehavior(TextDirectionSubmenuAutomaticallyIncluded) 87 , m_minimumFontSize(0) 88 , m_minimumLogicalFontSize(0) 89 , m_defaultFontSize(0) 90 , m_defaultFixedFontSize(0) 91 , m_validationMessageTimerMagnification(50) 92 , m_maximumDecodedImageSize(numeric_limits<size_t>::max()) 93 #if ENABLE(DOM_STORAGE) 94 , m_sessionStorageQuota(StorageMap::noQuota) 95 #endif 96 , m_pluginAllowedRunTime(numeric_limits<unsigned>::max()) 97 , m_editingBehaviorType(editingBehaviorTypeForPlatform()) 98 #ifdef ANDROID_LAYOUT 99 , m_layoutAlgorithm(kLayoutFitColumnToScreen) 100 #endif 101 , m_passwordEchoDurationInSeconds(1) 102 , m_isSpatialNavigationEnabled(false) 103 , m_isJavaEnabled(false) 104 , m_loadsImagesAutomatically(false) 105 , m_loadsSiteIconsIgnoringImageLoadingSetting(false) 106 , m_privateBrowsingEnabled(false) 107 , m_caretBrowsingEnabled(false) 108 , m_areImagesEnabled(true) 109 , m_isMediaEnabled(true) 110 , m_arePluginsEnabled(false) 111 , m_localStorageEnabled(false) 112 , m_isJavaScriptEnabled(false) 113 , m_isWebSecurityEnabled(true) 114 , m_allowUniversalAccessFromFileURLs(true) 115 , m_allowFileAccessFromFileURLs(true) 116 , m_javaScriptCanOpenWindowsAutomatically(false) 117 , m_javaScriptCanAccessClipboard(false) 118 , m_shouldPrintBackgrounds(false) 119 , m_textAreasAreResizable(false) 120 #if ENABLE(DASHBOARD_SUPPORT) 121 , m_usesDashboardBackwardCompatibilityMode(false) 122 #endif 123 , m_needsAdobeFrameReloadingQuirk(false) 124 , m_needsKeyboardEventDisambiguationQuirks(false) 125 , m_treatsAnyTextCSSLinkAsStylesheet(false) 126 , m_needsLeopardMailQuirks(false) 127 , m_needsTigerMailQuirks(false) 128 , m_isDOMPasteAllowed(false) 129 , m_shrinksStandaloneImagesToFit(true) 130 , m_usesPageCache(false) 131 , m_showsURLsInToolTips(false) 132 , m_forceFTPDirectoryListings(false) 133 , m_developerExtrasEnabled(false) 134 , m_authorAndUserStylesEnabled(true) 135 , m_needsSiteSpecificQuirks(false) 136 , m_fontRenderingMode(0) 137 , m_frameFlatteningEnabled(false) 138 , m_webArchiveDebugModeEnabled(false) 139 , m_localFileContentSniffingEnabled(false) 140 , m_inApplicationChromeMode(false) 141 , m_offlineWebApplicationCacheEnabled(false) 142 , m_shouldPaintCustomScrollbars(false) 143 , m_enforceCSSMIMETypeInNoQuirksMode(true) 144 , m_usesEncodingDetector(false) 145 , m_allowScriptsToCloseWindows(false) 146 , m_canvasUsesAcceleratedDrawing(false) 147 , m_acceleratedDrawingEnabled(false) 148 // FIXME: This should really be disabled by default as it makes platforms that don't support the feature download files 149 // they can't use by. Leaving enabled for now to not change existing behavior. 150 , m_downloadableBinaryFontsEnabled(true) 151 , m_xssAuditorEnabled(false) 152 #if ENABLE(LINK_PREFETCH) 153 , m_linkPrefetchEnabled(true) 154 #endif 155 , m_acceleratedCompositingEnabled(true) 156 , m_acceleratedCompositingFor3DTransformsEnabled(true) 157 , m_acceleratedCompositingForVideoEnabled(true) 158 , m_acceleratedCompositingForPluginsEnabled(true) 159 , m_acceleratedCompositingForCanvasEnabled(true) 160 , m_acceleratedCompositingForAnimationEnabled(true) 161 , m_showDebugBorders(false) 162 , m_showRepaintCounter(false) 163 , m_experimentalNotificationsEnabled(false) 164 , m_webGLEnabled(false) 165 , m_openGLMultisamplingEnabled(true) 166 , m_webAudioEnabled(false) 167 , m_acceleratedCanvas2dEnabled(false) 168 , m_loadDeferringEnabled(true) 169 , m_tiledBackingStoreEnabled(false) 170 , m_paginateDuringLayoutEnabled(false) 171 , m_dnsPrefetchingEnabled(true) 172 #if ENABLE(FULLSCREEN_API) 173 , m_fullScreenAPIEnabled(false) 174 #endif 175 , m_asynchronousSpellCheckingEnabled(false) 176 , m_memoryInfoEnabled(false) 177 , m_interactiveFormValidation(false) 178 , m_usePreHTML5ParserQuirks(false) 179 , m_hyperlinkAuditingEnabled(false) 180 , m_crossOriginCheckInGetMatchedCSSRulesDisabled(false) 181 , m_useQuickLookResourceCachingQuirks(false) 182 , m_forceCompositingMode(false) 183 , m_shouldInjectUserScriptsInInitialEmptyDocument(false) 184 #ifdef ANDROID_LAYOUT 185 , m_useWideViewport(false) 186 #endif 187 #ifdef ANDROID_MULTIPLE_WINDOWS 188 , m_supportMultipleWindows(true) 189 #endif 190 #ifdef ANDROID_BLOCK_NETWORK_IMAGE 191 , m_blockNetworkImage(false) 192 #endif 193 #if ENABLE(WEB_AUTOFILL) 194 , m_autoFillEnabled(false) 195 #endif 196 #ifdef ANDROID_PLUGINS 197 , m_pluginsOnDemand(false) 198 #endif 199 #if OS(SYMBIAN) 200 , m_passwordEchoEnabled(true) 201 #else 202 , m_passwordEchoEnabled(false) 203 #endif 204 { 205 // A Frame may not have been created yet, so we initialize the AtomicString 206 // hash before trying to use it. 207 AtomicString::init(); 208 #ifdef ANDROID_META_SUPPORT 209 m_default_format_detection = true; 210 resetMetadataSettings(); 211 #endif 212 } 213 214 void Settings::setStandardFontFamily(const AtomicString& standardFontFamily) 215 { 216 if (standardFontFamily == m_standardFontFamily) 217 return; 218 219 m_standardFontFamily = standardFontFamily; 220 m_page->setNeedsRecalcStyleInAllFrames(); 221 } 222 223 void Settings::setFixedFontFamily(const AtomicString& fixedFontFamily) 224 { 225 if (m_fixedFontFamily == fixedFontFamily) 226 return; 227 228 m_fixedFontFamily = fixedFontFamily; 229 m_page->setNeedsRecalcStyleInAllFrames(); 230 } 231 232 void Settings::setSerifFontFamily(const AtomicString& serifFontFamily) 233 { 234 if (m_serifFontFamily == serifFontFamily) 235 return; 236 237 m_serifFontFamily = serifFontFamily; 238 m_page->setNeedsRecalcStyleInAllFrames(); 239 } 240 241 void Settings::setSansSerifFontFamily(const AtomicString& sansSerifFontFamily) 242 { 243 if (m_sansSerifFontFamily == sansSerifFontFamily) 244 return; 245 246 m_sansSerifFontFamily = sansSerifFontFamily; 247 m_page->setNeedsRecalcStyleInAllFrames(); 248 } 249 250 void Settings::setCursiveFontFamily(const AtomicString& cursiveFontFamily) 251 { 252 if (m_cursiveFontFamily == cursiveFontFamily) 253 return; 254 255 m_cursiveFontFamily = cursiveFontFamily; 256 m_page->setNeedsRecalcStyleInAllFrames(); 257 } 258 259 void Settings::setFantasyFontFamily(const AtomicString& fantasyFontFamily) 260 { 261 if (m_fantasyFontFamily == fantasyFontFamily) 262 return; 263 264 m_fantasyFontFamily = fantasyFontFamily; 265 m_page->setNeedsRecalcStyleInAllFrames(); 266 } 267 268 void Settings::setMinimumFontSize(int minimumFontSize) 269 { 270 if (m_minimumFontSize == minimumFontSize) 271 return; 272 273 m_minimumFontSize = minimumFontSize; 274 m_page->setNeedsRecalcStyleInAllFrames(); 275 } 276 277 void Settings::setMinimumLogicalFontSize(int minimumLogicalFontSize) 278 { 279 if (m_minimumLogicalFontSize == minimumLogicalFontSize) 280 return; 281 282 m_minimumLogicalFontSize = minimumLogicalFontSize; 283 m_page->setNeedsRecalcStyleInAllFrames(); 284 } 285 286 void Settings::setDefaultFontSize(int defaultFontSize) 287 { 288 if (m_defaultFontSize == defaultFontSize) 289 return; 290 291 m_defaultFontSize = defaultFontSize; 292 m_page->setNeedsRecalcStyleInAllFrames(); 293 } 294 295 void Settings::setDefaultFixedFontSize(int defaultFontSize) 296 { 297 if (m_defaultFixedFontSize == defaultFontSize) 298 return; 299 300 m_defaultFixedFontSize = defaultFontSize; 301 m_page->setNeedsRecalcStyleInAllFrames(); 302 } 303 304 #ifdef ANDROID_BLOCK_NETWORK_IMAGE 305 void Settings::setBlockNetworkImage(bool blockNetworkImage) 306 { 307 m_blockNetworkImage = blockNetworkImage; 308 } 309 #endif 310 311 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically) 312 { 313 m_loadsImagesAutomatically = loadsImagesAutomatically; 314 setLoadsImagesAutomaticallyInAllFrames(m_page); 315 } 316 317 void Settings::setLoadsSiteIconsIgnoringImageLoadingSetting(bool loadsSiteIcons) 318 { 319 m_loadsSiteIconsIgnoringImageLoadingSetting = loadsSiteIcons; 320 } 321 322 void Settings::setJavaScriptEnabled(bool isJavaScriptEnabled) 323 { 324 m_isJavaScriptEnabled = isJavaScriptEnabled; 325 } 326 327 void Settings::setWebSecurityEnabled(bool isWebSecurityEnabled) 328 { 329 m_isWebSecurityEnabled = isWebSecurityEnabled; 330 } 331 332 void Settings::setAllowUniversalAccessFromFileURLs(bool allowUniversalAccessFromFileURLs) 333 { 334 m_allowUniversalAccessFromFileURLs = allowUniversalAccessFromFileURLs; 335 } 336 337 void Settings::setAllowFileAccessFromFileURLs(bool allowFileAccessFromFileURLs) 338 { 339 m_allowFileAccessFromFileURLs = allowFileAccessFromFileURLs; 340 } 341 342 void Settings::setSpatialNavigationEnabled(bool isSpatialNavigationEnabled) 343 { 344 m_isSpatialNavigationEnabled = isSpatialNavigationEnabled; 345 } 346 347 void Settings::setJavaEnabled(bool isJavaEnabled) 348 { 349 m_isJavaEnabled = isJavaEnabled; 350 } 351 352 void Settings::setImagesEnabled(bool areImagesEnabled) 353 { 354 m_areImagesEnabled = areImagesEnabled; 355 } 356 357 void Settings::setMediaEnabled(bool isMediaEnabled) 358 { 359 m_isMediaEnabled = isMediaEnabled; 360 } 361 362 void Settings::setPluginsEnabled(bool arePluginsEnabled) 363 { 364 m_arePluginsEnabled = arePluginsEnabled; 365 } 366 367 void Settings::setLocalStorageEnabled(bool localStorageEnabled) 368 { 369 m_localStorageEnabled = localStorageEnabled; 370 } 371 372 #if ENABLE(DOM_STORAGE) 373 void Settings::setSessionStorageQuota(unsigned sessionStorageQuota) 374 { 375 m_sessionStorageQuota = sessionStorageQuota; 376 } 377 #endif 378 379 void Settings::setPrivateBrowsingEnabled(bool privateBrowsingEnabled) 380 { 381 if (m_privateBrowsingEnabled == privateBrowsingEnabled) 382 return; 383 384 #if USE(CFURLSTORAGESESSIONS) 385 ResourceHandle::setPrivateBrowsingEnabled(privateBrowsingEnabled); 386 #endif 387 388 // FIXME: We can only enable cookie private browsing mode globally, so it's misleading to have it as a per-page setting. 389 setCookieStoragePrivateBrowsingEnabled(privateBrowsingEnabled); 390 391 m_privateBrowsingEnabled = privateBrowsingEnabled; 392 m_page->privateBrowsingStateChanged(); 393 } 394 395 void Settings::setJavaScriptCanOpenWindowsAutomatically(bool javaScriptCanOpenWindowsAutomatically) 396 { 397 m_javaScriptCanOpenWindowsAutomatically = javaScriptCanOpenWindowsAutomatically; 398 } 399 400 void Settings::setJavaScriptCanAccessClipboard(bool javaScriptCanAccessClipboard) 401 { 402 m_javaScriptCanAccessClipboard = javaScriptCanAccessClipboard; 403 } 404 405 void Settings::setDefaultTextEncodingName(const String& defaultTextEncodingName) 406 { 407 m_defaultTextEncodingName = defaultTextEncodingName; 408 } 409 410 void Settings::setUserStyleSheetLocation(const KURL& userStyleSheetLocation) 411 { 412 if (m_userStyleSheetLocation == userStyleSheetLocation) 413 return; 414 415 m_userStyleSheetLocation = userStyleSheetLocation; 416 417 m_page->userStyleSheetLocationChanged(); 418 } 419 420 void Settings::setShouldPrintBackgrounds(bool shouldPrintBackgrounds) 421 { 422 m_shouldPrintBackgrounds = shouldPrintBackgrounds; 423 } 424 425 void Settings::setTextAreasAreResizable(bool textAreasAreResizable) 426 { 427 if (m_textAreasAreResizable == textAreasAreResizable) 428 return; 429 430 m_textAreasAreResizable = textAreasAreResizable; 431 m_page->setNeedsRecalcStyleInAllFrames(); 432 } 433 434 void Settings::setEditableLinkBehavior(EditableLinkBehavior editableLinkBehavior) 435 { 436 m_editableLinkBehavior = editableLinkBehavior; 437 } 438 439 void Settings::setTextDirectionSubmenuInclusionBehavior(TextDirectionSubmenuInclusionBehavior behavior) 440 { 441 m_textDirectionSubmenuInclusionBehavior = behavior; 442 } 443 444 #if ENABLE(DASHBOARD_SUPPORT) 445 void Settings::setUsesDashboardBackwardCompatibilityMode(bool usesDashboardBackwardCompatibilityMode) 446 { 447 m_usesDashboardBackwardCompatibilityMode = usesDashboardBackwardCompatibilityMode; 448 } 449 #endif 450 451 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe 452 // can fix the bug from their end. 453 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC) 454 { 455 m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC; 456 } 457 458 // This is a quirk we are pro-actively applying to old applications. It changes keyboard event dispatching, 459 // making keyIdentifier available on keypress events, making charCode available on keydown/keyup events, 460 // and getting keypress dispatched in more cases. 461 void Settings::setNeedsKeyboardEventDisambiguationQuirks(bool needsQuirks) 462 { 463 m_needsKeyboardEventDisambiguationQuirks = needsQuirks; 464 } 465 466 void Settings::setTreatsAnyTextCSSLinkAsStylesheet(bool treatsAnyTextCSSLinkAsStylesheet) 467 { 468 m_treatsAnyTextCSSLinkAsStylesheet = treatsAnyTextCSSLinkAsStylesheet; 469 } 470 471 void Settings::setNeedsLeopardMailQuirks(bool needsQuirks) 472 { 473 m_needsLeopardMailQuirks = needsQuirks; 474 } 475 476 void Settings::setNeedsTigerMailQuirks(bool needsQuirks) 477 { 478 m_needsTigerMailQuirks = needsQuirks; 479 } 480 481 void Settings::setDOMPasteAllowed(bool DOMPasteAllowed) 482 { 483 m_isDOMPasteAllowed = DOMPasteAllowed; 484 } 485 486 void Settings::setDefaultMinDOMTimerInterval(double interval) 487 { 488 DOMTimer::setDefaultMinTimerInterval(interval); 489 } 490 491 double Settings::defaultMinDOMTimerInterval() 492 { 493 return DOMTimer::defaultMinTimerInterval(); 494 } 495 496 void Settings::setMinDOMTimerInterval(double interval) 497 { 498 m_page->setMinimumTimerInterval(interval); 499 } 500 501 double Settings::minDOMTimerInterval() 502 { 503 return m_page->minimumTimerInterval(); 504 } 505 506 void Settings::setUsesPageCache(bool usesPageCache) 507 { 508 if (m_usesPageCache == usesPageCache) 509 return; 510 511 m_usesPageCache = usesPageCache; 512 if (!m_usesPageCache) { 513 int first = -m_page->backForward()->backCount(); 514 int last = m_page->backForward()->forwardCount(); 515 for (int i = first; i <= last; i++) 516 pageCache()->remove(m_page->backForward()->itemAtIndex(i)); 517 pageCache()->releaseAutoreleasedPagesNow(); 518 } 519 } 520 521 void Settings::setShrinksStandaloneImagesToFit(bool shrinksStandaloneImagesToFit) 522 { 523 m_shrinksStandaloneImagesToFit = shrinksStandaloneImagesToFit; 524 } 525 526 void Settings::setShowsURLsInToolTips(bool showsURLsInToolTips) 527 { 528 m_showsURLsInToolTips = showsURLsInToolTips; 529 } 530 531 void Settings::setFTPDirectoryTemplatePath(const String& path) 532 { 533 m_ftpDirectoryTemplatePath = path; 534 } 535 536 void Settings::setForceFTPDirectoryListings(bool force) 537 { 538 m_forceFTPDirectoryListings = force; 539 } 540 541 void Settings::setDeveloperExtrasEnabled(bool developerExtrasEnabled) 542 { 543 m_developerExtrasEnabled = developerExtrasEnabled; 544 } 545 546 #ifdef ANDROID_META_SUPPORT 547 void Settings::resetMetadataSettings() 548 { 549 m_viewport_width = -1; 550 m_viewport_height = -1; 551 m_viewport_initial_scale = 0; 552 m_viewport_minimum_scale = 0; 553 m_viewport_maximum_scale = 0; 554 m_viewport_user_scalable = true; 555 m_viewport_target_densitydpi = -1; 556 m_format_detection_telephone = m_default_format_detection; 557 m_format_detection_address = m_default_format_detection; 558 m_format_detection_email = m_default_format_detection; 559 } 560 561 void Settings::setMetadataSettings(const String& key, const String& value) 562 { 563 if (key == "width") { 564 if (value == "device-width") { 565 m_viewport_width = 0; 566 } else { 567 int width = value.toInt(); 568 if (width <= 10000) { 569 if (width <= 320) { 570 // This is a hack to accommodate the pages designed for the 571 // original iPhone. The new version, since 10/2007, is to 572 // use device-width which works for both portrait and 573 // landscape modes. 574 m_viewport_width = 0; 575 } else { 576 m_viewport_width = width; 577 } 578 } 579 } 580 } else if (key == "height") { 581 if (value == "device-height") { 582 m_viewport_height = 0; 583 } else { 584 int height = value.toInt(); 585 if (height >= 200 && height <= 10000) { 586 m_viewport_height = height; 587 } 588 } 589 } else if (key == "initial-scale") { 590 int scale = int(value.toFloat() * 100); 591 if (scale >= 1 && scale <= 1000) { 592 m_viewport_initial_scale = scale; 593 } 594 } else if (key == "minimum-scale") { 595 int scale = int(value.toFloat() * 100); 596 if (scale >= 1 && scale <= 1000) { 597 m_viewport_minimum_scale = scale; 598 } 599 } else if (key == "maximum-scale") { 600 int scale = int(value.toFloat() * 100); 601 if (scale >= 1 && scale <= 1000) { 602 m_viewport_maximum_scale = scale; 603 } 604 } else if (key == "user-scalable") { 605 // even Apple doc says using "no", "0" is common in the real world, and 606 // some sites, e.g. gomoviesapp.com, use "false". 607 if (value == "no" || value == "0" || value == "false") { 608 m_viewport_user_scalable = false; 609 } 610 } else if (key == "target-densitydpi") { 611 if (value == "device-dpi") { 612 m_viewport_target_densitydpi = 0; 613 } else if (value == "low-dpi") { 614 m_viewport_target_densitydpi = 120; 615 } else if (value == "medium-dpi") { 616 m_viewport_target_densitydpi = 160; 617 } else if (value == "high-dpi") { 618 m_viewport_target_densitydpi = 240; 619 } else { 620 int dpi = value.toInt(); 621 if (dpi >= 70 && dpi <= 400) { 622 m_viewport_target_densitydpi = dpi; 623 } 624 } 625 } else if (key == "telephone") { 626 if (value == "no") { 627 m_format_detection_telephone = false; 628 } 629 } else if (key == "address") { 630 if (value == "no") { 631 m_format_detection_address = false; 632 } 633 } else if (key == "email") { 634 if (value == "no") { 635 m_format_detection_email = false; 636 } 637 } else if (key == "format-detection") { 638 // even Apple doc says "format-detection" should be the name of the 639 // <meta> tag. In the real world, e.g. amazon.com, use 640 // "format-detection=no" in the "viewport" <meta> tag to disable all 641 // format detection. 642 if (value == "no") { 643 m_format_detection_telephone = false; 644 m_format_detection_address = false; 645 m_format_detection_email = false; 646 } 647 } 648 } 649 650 void Settings::setViewportWidth(int width) 651 { 652 if (width < 0 || width > 10000) 653 m_viewport_width = -1; 654 else 655 m_viewport_width = width; 656 } 657 658 void Settings::setViewportHeight(int height) 659 { 660 if (height < 0 || height > 10000) 661 m_viewport_height = -1; 662 else 663 m_viewport_height = height; 664 } 665 666 void Settings::setViewportInitialScale(int scale) 667 { 668 if (scale < 1 || scale > 1000) 669 m_viewport_initial_scale = 0; 670 else 671 m_viewport_initial_scale = scale; 672 } 673 674 void Settings::setViewportMinimumScale(int scale) 675 { 676 if (scale < 1 || scale > 1000) 677 m_viewport_minimum_scale = 0; 678 else 679 m_viewport_minimum_scale = scale; 680 } 681 682 void Settings::setViewportMaximumScale(int scale) 683 { 684 if (scale < 1 || scale > 1000) 685 m_viewport_maximum_scale = 0; 686 else 687 m_viewport_maximum_scale = scale; 688 } 689 690 void Settings::setViewportUserScalable(bool scalable) 691 { 692 m_viewport_user_scalable = scalable; 693 } 694 695 void Settings::setViewportTargetDensityDpi(int dpi) 696 { 697 if (dpi < 0 || dpi > 400) 698 m_viewport_target_densitydpi = -1; 699 else 700 m_viewport_target_densitydpi = dpi; 701 } 702 703 void Settings::setFormatDetectionAddress(bool detect) 704 { 705 m_format_detection_address = detect; 706 } 707 708 void Settings::setFormatDetectionEmail(bool detect) 709 { 710 m_format_detection_email = detect; 711 } 712 713 void Settings::setFormatDetectionTelephone(bool detect) 714 { 715 m_format_detection_telephone = detect; 716 } 717 #endif 718 719 void Settings::setAuthorAndUserStylesEnabled(bool authorAndUserStylesEnabled) 720 { 721 if (m_authorAndUserStylesEnabled == authorAndUserStylesEnabled) 722 return; 723 724 m_authorAndUserStylesEnabled = authorAndUserStylesEnabled; 725 m_page->setNeedsRecalcStyleInAllFrames(); 726 } 727 728 void Settings::setFontRenderingMode(FontRenderingMode mode) 729 { 730 if (fontRenderingMode() == mode) 731 return; 732 m_fontRenderingMode = mode; 733 m_page->setNeedsRecalcStyleInAllFrames(); 734 } 735 736 FontRenderingMode Settings::fontRenderingMode() const 737 { 738 return static_cast<FontRenderingMode>(m_fontRenderingMode); 739 } 740 741 void Settings::setNeedsSiteSpecificQuirks(bool needsQuirks) 742 { 743 m_needsSiteSpecificQuirks = needsQuirks; 744 } 745 746 void Settings::setFrameFlatteningEnabled(bool frameFlatteningEnabled) 747 { 748 m_frameFlatteningEnabled = frameFlatteningEnabled; 749 } 750 751 #if ENABLE(WEB_ARCHIVE) 752 void Settings::setWebArchiveDebugModeEnabled(bool enabled) 753 { 754 m_webArchiveDebugModeEnabled = enabled; 755 } 756 #endif 757 758 void Settings::setLocalFileContentSniffingEnabled(bool enabled) 759 { 760 m_localFileContentSniffingEnabled = enabled; 761 } 762 763 void Settings::setLocalStorageDatabasePath(const String& path) 764 { 765 m_localStorageDatabasePath = path; 766 } 767 768 void Settings::setApplicationChromeMode(bool mode) 769 { 770 m_inApplicationChromeMode = mode; 771 } 772 773 void Settings::setOfflineWebApplicationCacheEnabled(bool enabled) 774 { 775 m_offlineWebApplicationCacheEnabled = enabled; 776 } 777 778 void Settings::setShouldPaintCustomScrollbars(bool shouldPaintCustomScrollbars) 779 { 780 m_shouldPaintCustomScrollbars = shouldPaintCustomScrollbars; 781 } 782 783 void Settings::setEnforceCSSMIMETypeInNoQuirksMode(bool enforceCSSMIMETypeInNoQuirksMode) 784 { 785 m_enforceCSSMIMETypeInNoQuirksMode = enforceCSSMIMETypeInNoQuirksMode; 786 } 787 788 #if USE(SAFARI_THEME) 789 void Settings::setShouldPaintNativeControls(bool shouldPaintNativeControls) 790 { 791 gShouldPaintNativeControls = shouldPaintNativeControls; 792 } 793 #endif 794 795 void Settings::setUsesEncodingDetector(bool usesEncodingDetector) 796 { 797 m_usesEncodingDetector = usesEncodingDetector; 798 } 799 800 void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled) 801 { 802 if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled) 803 return; 804 805 m_dnsPrefetchingEnabled = dnsPrefetchingEnabled; 806 m_page->dnsPrefetchingStateChanged(); 807 } 808 809 void Settings::setAllowScriptsToCloseWindows(bool allowScriptsToCloseWindows) 810 { 811 m_allowScriptsToCloseWindows = allowScriptsToCloseWindows; 812 } 813 814 void Settings::setCaretBrowsingEnabled(bool caretBrowsingEnabled) 815 { 816 m_caretBrowsingEnabled = caretBrowsingEnabled; 817 } 818 819 void Settings::setDownloadableBinaryFontsEnabled(bool downloadableBinaryFontsEnabled) 820 { 821 m_downloadableBinaryFontsEnabled = downloadableBinaryFontsEnabled; 822 } 823 824 void Settings::setXSSAuditorEnabled(bool xssAuditorEnabled) 825 { 826 m_xssAuditorEnabled = xssAuditorEnabled; 827 } 828 829 #if ENABLE(LINK_PREFETCH) 830 void Settings::setLinkPrefetchEnabled(bool linkPrefetchEnabled) 831 { 832 m_linkPrefetchEnabled = linkPrefetchEnabled; 833 } 834 #endif 835 836 void Settings::setAcceleratedCompositingEnabled(bool enabled) 837 { 838 if (m_acceleratedCompositingEnabled == enabled) 839 return; 840 841 m_acceleratedCompositingEnabled = enabled; 842 m_page->setNeedsRecalcStyleInAllFrames(); 843 } 844 845 void Settings::setCanvasUsesAcceleratedDrawing(bool enabled) 846 { 847 m_canvasUsesAcceleratedDrawing = enabled; 848 } 849 850 void Settings::setAcceleratedDrawingEnabled(bool enabled) 851 { 852 m_acceleratedDrawingEnabled = enabled; 853 } 854 855 void Settings::setAcceleratedCompositingFor3DTransformsEnabled(bool enabled) 856 { 857 m_acceleratedCompositingFor3DTransformsEnabled = enabled; 858 } 859 860 void Settings::setAcceleratedCompositingForVideoEnabled(bool enabled) 861 { 862 m_acceleratedCompositingForVideoEnabled = enabled; 863 } 864 865 void Settings::setAcceleratedCompositingForPluginsEnabled(bool enabled) 866 { 867 m_acceleratedCompositingForPluginsEnabled = enabled; 868 } 869 870 void Settings::setAcceleratedCompositingForCanvasEnabled(bool enabled) 871 { 872 m_acceleratedCompositingForCanvasEnabled = enabled; 873 } 874 875 void Settings::setAcceleratedCompositingForAnimationEnabled(bool enabled) 876 { 877 m_acceleratedCompositingForAnimationEnabled = enabled; 878 } 879 880 void Settings::setShowDebugBorders(bool enabled) 881 { 882 if (m_showDebugBorders == enabled) 883 return; 884 885 m_showDebugBorders = enabled; 886 m_page->setNeedsRecalcStyleInAllFrames(); 887 } 888 889 void Settings::setShowRepaintCounter(bool enabled) 890 { 891 if (m_showRepaintCounter == enabled) 892 return; 893 894 m_showRepaintCounter = enabled; 895 m_page->setNeedsRecalcStyleInAllFrames(); 896 } 897 898 void Settings::setExperimentalNotificationsEnabled(bool enabled) 899 { 900 m_experimentalNotificationsEnabled = enabled; 901 } 902 903 void Settings::setPluginAllowedRunTime(unsigned runTime) 904 { 905 m_pluginAllowedRunTime = runTime; 906 m_page->pluginAllowedRunTimeChanged(); 907 } 908 909 #if PLATFORM(WIN) || (OS(WINDOWS) && PLATFORM(WX)) 910 void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers) 911 { 912 gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers; 913 } 914 #endif 915 916 void Settings::setWebAudioEnabled(bool enabled) 917 { 918 m_webAudioEnabled = enabled; 919 } 920 921 void Settings::setWebGLEnabled(bool enabled) 922 { 923 m_webGLEnabled = enabled; 924 } 925 926 void Settings::setOpenGLMultisamplingEnabled(bool enabled) 927 { 928 m_openGLMultisamplingEnabled = enabled; 929 } 930 931 void Settings::setAccelerated2dCanvasEnabled(bool enabled) 932 { 933 m_acceleratedCanvas2dEnabled = enabled; 934 } 935 936 void Settings::setLoadDeferringEnabled(bool enabled) 937 { 938 m_loadDeferringEnabled = enabled; 939 } 940 941 void Settings::setTiledBackingStoreEnabled(bool enabled) 942 { 943 m_tiledBackingStoreEnabled = enabled; 944 #if ENABLE(TILED_BACKING_STORE) 945 if (m_page->mainFrame()) 946 m_page->mainFrame()->setTiledBackingStoreEnabled(enabled); 947 #endif 948 } 949 950 } // namespace WebCore 951