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