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 44using namespace std; 45 46namespace WebCore { 47 48static 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) 55bool Settings::gShouldPaintNativeControls = true; 56#endif 57 58#if PLATFORM(WIN) || (OS(WINDOWS) && PLATFORM(WX)) 59bool 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. 67static 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 83Settings::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 214void Settings::setStandardFontFamily(const AtomicString& standardFontFamily) 215{ 216 if (standardFontFamily == m_standardFontFamily) 217 return; 218 219 m_standardFontFamily = standardFontFamily; 220 m_page->setNeedsRecalcStyleInAllFrames(); 221} 222 223void Settings::setFixedFontFamily(const AtomicString& fixedFontFamily) 224{ 225 if (m_fixedFontFamily == fixedFontFamily) 226 return; 227 228 m_fixedFontFamily = fixedFontFamily; 229 m_page->setNeedsRecalcStyleInAllFrames(); 230} 231 232void Settings::setSerifFontFamily(const AtomicString& serifFontFamily) 233{ 234 if (m_serifFontFamily == serifFontFamily) 235 return; 236 237 m_serifFontFamily = serifFontFamily; 238 m_page->setNeedsRecalcStyleInAllFrames(); 239} 240 241void Settings::setSansSerifFontFamily(const AtomicString& sansSerifFontFamily) 242{ 243 if (m_sansSerifFontFamily == sansSerifFontFamily) 244 return; 245 246 m_sansSerifFontFamily = sansSerifFontFamily; 247 m_page->setNeedsRecalcStyleInAllFrames(); 248} 249 250void Settings::setCursiveFontFamily(const AtomicString& cursiveFontFamily) 251{ 252 if (m_cursiveFontFamily == cursiveFontFamily) 253 return; 254 255 m_cursiveFontFamily = cursiveFontFamily; 256 m_page->setNeedsRecalcStyleInAllFrames(); 257} 258 259void Settings::setFantasyFontFamily(const AtomicString& fantasyFontFamily) 260{ 261 if (m_fantasyFontFamily == fantasyFontFamily) 262 return; 263 264 m_fantasyFontFamily = fantasyFontFamily; 265 m_page->setNeedsRecalcStyleInAllFrames(); 266} 267 268void Settings::setMinimumFontSize(int minimumFontSize) 269{ 270 if (m_minimumFontSize == minimumFontSize) 271 return; 272 273 m_minimumFontSize = minimumFontSize; 274 m_page->setNeedsRecalcStyleInAllFrames(); 275} 276 277void Settings::setMinimumLogicalFontSize(int minimumLogicalFontSize) 278{ 279 if (m_minimumLogicalFontSize == minimumLogicalFontSize) 280 return; 281 282 m_minimumLogicalFontSize = minimumLogicalFontSize; 283 m_page->setNeedsRecalcStyleInAllFrames(); 284} 285 286void Settings::setDefaultFontSize(int defaultFontSize) 287{ 288 if (m_defaultFontSize == defaultFontSize) 289 return; 290 291 m_defaultFontSize = defaultFontSize; 292 m_page->setNeedsRecalcStyleInAllFrames(); 293} 294 295void 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 305void Settings::setBlockNetworkImage(bool blockNetworkImage) 306{ 307 m_blockNetworkImage = blockNetworkImage; 308} 309#endif 310 311void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically) 312{ 313 m_loadsImagesAutomatically = loadsImagesAutomatically; 314 setLoadsImagesAutomaticallyInAllFrames(m_page); 315} 316 317void Settings::setLoadsSiteIconsIgnoringImageLoadingSetting(bool loadsSiteIcons) 318{ 319 m_loadsSiteIconsIgnoringImageLoadingSetting = loadsSiteIcons; 320} 321 322void Settings::setJavaScriptEnabled(bool isJavaScriptEnabled) 323{ 324 m_isJavaScriptEnabled = isJavaScriptEnabled; 325} 326 327void Settings::setWebSecurityEnabled(bool isWebSecurityEnabled) 328{ 329 m_isWebSecurityEnabled = isWebSecurityEnabled; 330} 331 332void Settings::setAllowUniversalAccessFromFileURLs(bool allowUniversalAccessFromFileURLs) 333{ 334 m_allowUniversalAccessFromFileURLs = allowUniversalAccessFromFileURLs; 335} 336 337void Settings::setAllowFileAccessFromFileURLs(bool allowFileAccessFromFileURLs) 338{ 339 m_allowFileAccessFromFileURLs = allowFileAccessFromFileURLs; 340} 341 342void Settings::setSpatialNavigationEnabled(bool isSpatialNavigationEnabled) 343{ 344 m_isSpatialNavigationEnabled = isSpatialNavigationEnabled; 345} 346 347void Settings::setJavaEnabled(bool isJavaEnabled) 348{ 349 m_isJavaEnabled = isJavaEnabled; 350} 351 352void Settings::setImagesEnabled(bool areImagesEnabled) 353{ 354 m_areImagesEnabled = areImagesEnabled; 355} 356 357void Settings::setMediaEnabled(bool isMediaEnabled) 358{ 359 m_isMediaEnabled = isMediaEnabled; 360} 361 362void Settings::setPluginsEnabled(bool arePluginsEnabled) 363{ 364 m_arePluginsEnabled = arePluginsEnabled; 365} 366 367void Settings::setLocalStorageEnabled(bool localStorageEnabled) 368{ 369 m_localStorageEnabled = localStorageEnabled; 370} 371 372#if ENABLE(DOM_STORAGE) 373void Settings::setSessionStorageQuota(unsigned sessionStorageQuota) 374{ 375 m_sessionStorageQuota = sessionStorageQuota; 376} 377#endif 378 379void 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 395void Settings::setJavaScriptCanOpenWindowsAutomatically(bool javaScriptCanOpenWindowsAutomatically) 396{ 397 m_javaScriptCanOpenWindowsAutomatically = javaScriptCanOpenWindowsAutomatically; 398} 399 400void Settings::setJavaScriptCanAccessClipboard(bool javaScriptCanAccessClipboard) 401{ 402 m_javaScriptCanAccessClipboard = javaScriptCanAccessClipboard; 403} 404 405void Settings::setDefaultTextEncodingName(const String& defaultTextEncodingName) 406{ 407 m_defaultTextEncodingName = defaultTextEncodingName; 408} 409 410void 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 420void Settings::setShouldPrintBackgrounds(bool shouldPrintBackgrounds) 421{ 422 m_shouldPrintBackgrounds = shouldPrintBackgrounds; 423} 424 425void Settings::setTextAreasAreResizable(bool textAreasAreResizable) 426{ 427 if (m_textAreasAreResizable == textAreasAreResizable) 428 return; 429 430 m_textAreasAreResizable = textAreasAreResizable; 431 m_page->setNeedsRecalcStyleInAllFrames(); 432} 433 434void Settings::setEditableLinkBehavior(EditableLinkBehavior editableLinkBehavior) 435{ 436 m_editableLinkBehavior = editableLinkBehavior; 437} 438 439void Settings::setTextDirectionSubmenuInclusionBehavior(TextDirectionSubmenuInclusionBehavior behavior) 440{ 441 m_textDirectionSubmenuInclusionBehavior = behavior; 442} 443 444#if ENABLE(DASHBOARD_SUPPORT) 445void 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. 453void 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. 461void Settings::setNeedsKeyboardEventDisambiguationQuirks(bool needsQuirks) 462{ 463 m_needsKeyboardEventDisambiguationQuirks = needsQuirks; 464} 465 466void Settings::setTreatsAnyTextCSSLinkAsStylesheet(bool treatsAnyTextCSSLinkAsStylesheet) 467{ 468 m_treatsAnyTextCSSLinkAsStylesheet = treatsAnyTextCSSLinkAsStylesheet; 469} 470 471void Settings::setNeedsLeopardMailQuirks(bool needsQuirks) 472{ 473 m_needsLeopardMailQuirks = needsQuirks; 474} 475 476void Settings::setNeedsTigerMailQuirks(bool needsQuirks) 477{ 478 m_needsTigerMailQuirks = needsQuirks; 479} 480 481void Settings::setDOMPasteAllowed(bool DOMPasteAllowed) 482{ 483 m_isDOMPasteAllowed = DOMPasteAllowed; 484} 485 486void Settings::setDefaultMinDOMTimerInterval(double interval) 487{ 488 DOMTimer::setDefaultMinTimerInterval(interval); 489} 490 491double Settings::defaultMinDOMTimerInterval() 492{ 493 return DOMTimer::defaultMinTimerInterval(); 494} 495 496void Settings::setMinDOMTimerInterval(double interval) 497{ 498 m_page->setMinimumTimerInterval(interval); 499} 500 501double Settings::minDOMTimerInterval() 502{ 503 return m_page->minimumTimerInterval(); 504} 505 506void 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 521void Settings::setShrinksStandaloneImagesToFit(bool shrinksStandaloneImagesToFit) 522{ 523 m_shrinksStandaloneImagesToFit = shrinksStandaloneImagesToFit; 524} 525 526void Settings::setShowsURLsInToolTips(bool showsURLsInToolTips) 527{ 528 m_showsURLsInToolTips = showsURLsInToolTips; 529} 530 531void Settings::setFTPDirectoryTemplatePath(const String& path) 532{ 533 m_ftpDirectoryTemplatePath = path; 534} 535 536void Settings::setForceFTPDirectoryListings(bool force) 537{ 538 m_forceFTPDirectoryListings = force; 539} 540 541void Settings::setDeveloperExtrasEnabled(bool developerExtrasEnabled) 542{ 543 m_developerExtrasEnabled = developerExtrasEnabled; 544} 545 546#ifdef ANDROID_META_SUPPORT 547void 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 561void 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 650void 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 658void 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 666void 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 674void 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 682void 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 690void Settings::setViewportUserScalable(bool scalable) 691{ 692 m_viewport_user_scalable = scalable; 693} 694 695void 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 703void Settings::setFormatDetectionAddress(bool detect) 704{ 705 m_format_detection_address = detect; 706} 707 708void Settings::setFormatDetectionEmail(bool detect) 709{ 710 m_format_detection_email = detect; 711} 712 713void Settings::setFormatDetectionTelephone(bool detect) 714{ 715 m_format_detection_telephone = detect; 716} 717#endif 718 719void Settings::setAuthorAndUserStylesEnabled(bool authorAndUserStylesEnabled) 720{ 721 if (m_authorAndUserStylesEnabled == authorAndUserStylesEnabled) 722 return; 723 724 m_authorAndUserStylesEnabled = authorAndUserStylesEnabled; 725 m_page->setNeedsRecalcStyleInAllFrames(); 726} 727 728void Settings::setFontRenderingMode(FontRenderingMode mode) 729{ 730 if (fontRenderingMode() == mode) 731 return; 732 m_fontRenderingMode = mode; 733 m_page->setNeedsRecalcStyleInAllFrames(); 734} 735 736FontRenderingMode Settings::fontRenderingMode() const 737{ 738 return static_cast<FontRenderingMode>(m_fontRenderingMode); 739} 740 741void Settings::setNeedsSiteSpecificQuirks(bool needsQuirks) 742{ 743 m_needsSiteSpecificQuirks = needsQuirks; 744} 745 746void Settings::setFrameFlatteningEnabled(bool frameFlatteningEnabled) 747{ 748 m_frameFlatteningEnabled = frameFlatteningEnabled; 749} 750 751#if ENABLE(WEB_ARCHIVE) 752void Settings::setWebArchiveDebugModeEnabled(bool enabled) 753{ 754 m_webArchiveDebugModeEnabled = enabled; 755} 756#endif 757 758void Settings::setLocalFileContentSniffingEnabled(bool enabled) 759{ 760 m_localFileContentSniffingEnabled = enabled; 761} 762 763void Settings::setLocalStorageDatabasePath(const String& path) 764{ 765 m_localStorageDatabasePath = path; 766} 767 768void Settings::setApplicationChromeMode(bool mode) 769{ 770 m_inApplicationChromeMode = mode; 771} 772 773void Settings::setOfflineWebApplicationCacheEnabled(bool enabled) 774{ 775 m_offlineWebApplicationCacheEnabled = enabled; 776} 777 778void Settings::setShouldPaintCustomScrollbars(bool shouldPaintCustomScrollbars) 779{ 780 m_shouldPaintCustomScrollbars = shouldPaintCustomScrollbars; 781} 782 783void Settings::setEnforceCSSMIMETypeInNoQuirksMode(bool enforceCSSMIMETypeInNoQuirksMode) 784{ 785 m_enforceCSSMIMETypeInNoQuirksMode = enforceCSSMIMETypeInNoQuirksMode; 786} 787 788#if USE(SAFARI_THEME) 789void Settings::setShouldPaintNativeControls(bool shouldPaintNativeControls) 790{ 791 gShouldPaintNativeControls = shouldPaintNativeControls; 792} 793#endif 794 795void Settings::setUsesEncodingDetector(bool usesEncodingDetector) 796{ 797 m_usesEncodingDetector = usesEncodingDetector; 798} 799 800void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled) 801{ 802 if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled) 803 return; 804 805 m_dnsPrefetchingEnabled = dnsPrefetchingEnabled; 806 m_page->dnsPrefetchingStateChanged(); 807} 808 809void Settings::setAllowScriptsToCloseWindows(bool allowScriptsToCloseWindows) 810{ 811 m_allowScriptsToCloseWindows = allowScriptsToCloseWindows; 812} 813 814void Settings::setCaretBrowsingEnabled(bool caretBrowsingEnabled) 815{ 816 m_caretBrowsingEnabled = caretBrowsingEnabled; 817} 818 819void Settings::setDownloadableBinaryFontsEnabled(bool downloadableBinaryFontsEnabled) 820{ 821 m_downloadableBinaryFontsEnabled = downloadableBinaryFontsEnabled; 822} 823 824void Settings::setXSSAuditorEnabled(bool xssAuditorEnabled) 825{ 826 m_xssAuditorEnabled = xssAuditorEnabled; 827} 828 829#if ENABLE(LINK_PREFETCH) 830void Settings::setLinkPrefetchEnabled(bool linkPrefetchEnabled) 831{ 832 m_linkPrefetchEnabled = linkPrefetchEnabled; 833} 834#endif 835 836void Settings::setAcceleratedCompositingEnabled(bool enabled) 837{ 838 if (m_acceleratedCompositingEnabled == enabled) 839 return; 840 841 m_acceleratedCompositingEnabled = enabled; 842 m_page->setNeedsRecalcStyleInAllFrames(); 843} 844 845void Settings::setCanvasUsesAcceleratedDrawing(bool enabled) 846{ 847 m_canvasUsesAcceleratedDrawing = enabled; 848} 849 850void Settings::setAcceleratedDrawingEnabled(bool enabled) 851{ 852 m_acceleratedDrawingEnabled = enabled; 853} 854 855void Settings::setAcceleratedCompositingFor3DTransformsEnabled(bool enabled) 856{ 857 m_acceleratedCompositingFor3DTransformsEnabled = enabled; 858} 859 860void Settings::setAcceleratedCompositingForVideoEnabled(bool enabled) 861{ 862 m_acceleratedCompositingForVideoEnabled = enabled; 863} 864 865void Settings::setAcceleratedCompositingForPluginsEnabled(bool enabled) 866{ 867 m_acceleratedCompositingForPluginsEnabled = enabled; 868} 869 870void Settings::setAcceleratedCompositingForCanvasEnabled(bool enabled) 871{ 872 m_acceleratedCompositingForCanvasEnabled = enabled; 873} 874 875void Settings::setAcceleratedCompositingForAnimationEnabled(bool enabled) 876{ 877 m_acceleratedCompositingForAnimationEnabled = enabled; 878} 879 880void Settings::setShowDebugBorders(bool enabled) 881{ 882 if (m_showDebugBorders == enabled) 883 return; 884 885 m_showDebugBorders = enabled; 886 m_page->setNeedsRecalcStyleInAllFrames(); 887} 888 889void Settings::setShowRepaintCounter(bool enabled) 890{ 891 if (m_showRepaintCounter == enabled) 892 return; 893 894 m_showRepaintCounter = enabled; 895 m_page->setNeedsRecalcStyleInAllFrames(); 896} 897 898void Settings::setExperimentalNotificationsEnabled(bool enabled) 899{ 900 m_experimentalNotificationsEnabled = enabled; 901} 902 903void Settings::setPluginAllowedRunTime(unsigned runTime) 904{ 905 m_pluginAllowedRunTime = runTime; 906 m_page->pluginAllowedRunTimeChanged(); 907} 908 909#if PLATFORM(WIN) || (OS(WINDOWS) && PLATFORM(WX)) 910void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers) 911{ 912 gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers; 913} 914#endif 915 916void Settings::setWebAudioEnabled(bool enabled) 917{ 918 m_webAudioEnabled = enabled; 919} 920 921void Settings::setWebGLEnabled(bool enabled) 922{ 923 m_webGLEnabled = enabled; 924} 925 926void Settings::setOpenGLMultisamplingEnabled(bool enabled) 927{ 928 m_openGLMultisamplingEnabled = enabled; 929} 930 931void Settings::setAccelerated2dCanvasEnabled(bool enabled) 932{ 933 m_acceleratedCanvas2dEnabled = enabled; 934} 935 936void Settings::setLoadDeferringEnabled(bool enabled) 937{ 938 m_loadDeferringEnabled = enabled; 939} 940 941void 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