2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2013 Apple Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "core/testing/InternalSettings.h"
30 #include "bindings/core/v8/ExceptionState.h"
31 #include "core/dom/ExceptionCode.h"
32 #include "core/frame/Settings.h"
33 #include "core/inspector/InspectorController.h"
34 #include "core/page/Page.h"
35 #include "platform/RuntimeEnabledFeatures.h"
36 #include "platform/Supplementable.h"
37 #include "platform/text/LocaleToScriptMapping.h"
39 #define InternalSettingsGuardForSettingsReturn(returnValue) \
41 exceptionState.throwDOMException(InvalidAccessError, "The settings object cannot be obtained."); \
45 #define InternalSettingsGuardForSettings() \
47 exceptionState.throwDOMException(InvalidAccessError, "The settings object cannot be obtained."); \
51 #define InternalSettingsGuardForPage() \
53 exceptionState.throwDOMException(InvalidAccessError, "The page object cannot be obtained."); \
59 InternalSettings::Backup::Backup(Settings* settings)
60 : m_originalAuthorShadowDOMForAnyElementEnabled(RuntimeEnabledFeatures::authorShadowDOMForAnyElementEnabled())
61 , m_originalCSP(RuntimeEnabledFeatures::experimentalContentSecurityPolicyFeaturesEnabled())
62 , m_originalLaxMixedContentCheckingEnabled(RuntimeEnabledFeatures::laxMixedContentCheckingEnabled())
63 , m_originalOverlayScrollbarsEnabled(RuntimeEnabledFeatures::overlayScrollbarsEnabled())
64 , m_originalEditingBehavior(settings->editingBehaviorType())
65 , m_originalTextAutosizingEnabled(settings->textAutosizingEnabled())
66 , m_originalTextAutosizingWindowSizeOverride(settings->textAutosizingWindowSizeOverride())
67 , m_originalAccessibilityFontScaleFactor(settings->accessibilityFontScaleFactor())
68 , m_originalMediaTypeOverride(settings->mediaTypeOverride())
69 , m_originalMockScrollbarsEnabled(settings->mockScrollbarsEnabled())
70 , m_originalMockGestureTapHighlightsEnabled(settings->mockGestureTapHighlightsEnabled())
71 , m_langAttributeAwareFormControlUIEnabled(RuntimeEnabledFeatures::langAttributeAwareFormControlUIEnabled())
72 , m_imagesEnabled(settings->imagesEnabled())
73 , m_defaultVideoPosterURL(settings->defaultVideoPosterURL())
74 , m_originalLayerSquashingEnabled(settings->layerSquashingEnabled())
75 , m_originalPseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled(RuntimeEnabledFeatures::pseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled())
79 void InternalSettings::Backup::restoreTo(Settings* settings)
81 RuntimeEnabledFeatures::setAuthorShadowDOMForAnyElementEnabled(m_originalAuthorShadowDOMForAnyElementEnabled);
82 RuntimeEnabledFeatures::setExperimentalContentSecurityPolicyFeaturesEnabled(m_originalCSP);
83 RuntimeEnabledFeatures::setLaxMixedContentCheckingEnabled(m_originalLaxMixedContentCheckingEnabled);
84 RuntimeEnabledFeatures::setOverlayScrollbarsEnabled(m_originalOverlayScrollbarsEnabled);
85 settings->setEditingBehaviorType(m_originalEditingBehavior);
86 settings->setTextAutosizingEnabled(m_originalTextAutosizingEnabled);
87 settings->setTextAutosizingWindowSizeOverride(m_originalTextAutosizingWindowSizeOverride);
88 settings->setAccessibilityFontScaleFactor(m_originalAccessibilityFontScaleFactor);
89 settings->setMediaTypeOverride(m_originalMediaTypeOverride);
90 settings->setMockScrollbarsEnabled(m_originalMockScrollbarsEnabled);
91 settings->setMockGestureTapHighlightsEnabled(m_originalMockGestureTapHighlightsEnabled);
92 RuntimeEnabledFeatures::setLangAttributeAwareFormControlUIEnabled(m_langAttributeAwareFormControlUIEnabled);
93 settings->setImagesEnabled(m_imagesEnabled);
94 settings->setDefaultVideoPosterURL(m_defaultVideoPosterURL);
95 settings->setLayerSquashingEnabled(m_originalLayerSquashingEnabled);
96 settings->genericFontFamilySettings().reset();
97 RuntimeEnabledFeatures::setPseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled(m_originalPseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled);
101 InternalSettings* InternalSettings::from(Page& page)
103 if (!HeapSupplement<Page>::from(page, supplementName()))
104 HeapSupplement<Page>::provideTo(page, supplementName(), new InternalSettings(page));
105 return static_cast<InternalSettings*>(HeapSupplement<Page>::from(page, supplementName()));
108 // We can't use RefCountedSupplement because that would try to make InternalSettings RefCounted
109 // and InternalSettings is already RefCounted via its base class, InternalSettingsGenerated.
110 // Instead, we manually make InternalSettings supplement Page.
111 class InternalSettingsWrapper : public Supplement<Page> {
113 explicit InternalSettingsWrapper(Page& page)
114 : m_internalSettings(InternalSettings::create(page)) { }
115 virtual ~InternalSettingsWrapper() { m_internalSettings->hostDestroyed(); }
117 virtual bool isRefCountedWrapper() const OVERRIDE { return true; }
119 InternalSettings* internalSettings() const { return m_internalSettings.get(); }
122 RefPtr<InternalSettings> m_internalSettings;
125 InternalSettings* InternalSettings::from(Page& page)
127 if (!Supplement<Page>::from(page, supplementName()))
128 Supplement<Page>::provideTo(page, supplementName(), adoptPtr(new InternalSettingsWrapper(page)));
129 return static_cast<InternalSettingsWrapper*>(Supplement<Page>::from(page, supplementName()))->internalSettings();
133 const char* InternalSettings::supplementName()
135 return "InternalSettings";
138 InternalSettings::~InternalSettings()
142 InternalSettings::InternalSettings(Page& page)
143 : InternalSettingsGenerated(&page)
145 , m_backup(&page.settings())
147 ScriptWrappable::init(this);
150 void InternalSettings::resetToConsistentState()
152 page()->setPageScaleFactor(1, IntPoint(0, 0));
154 m_backup.restoreTo(settings());
155 m_backup = Backup(settings());
156 m_backup.m_originalTextAutosizingEnabled = settings()->textAutosizingEnabled();
158 InternalSettingsGenerated::resetToConsistentState();
161 Settings* InternalSettings::settings() const
165 return &page()->settings();
168 void InternalSettings::setMockScrollbarsEnabled(bool enabled, ExceptionState& exceptionState)
170 InternalSettingsGuardForSettings();
171 settings()->setMockScrollbarsEnabled(enabled);
174 void InternalSettings::setMockGestureTapHighlightsEnabled(bool enabled, ExceptionState& exceptionState)
176 InternalSettingsGuardForSettings();
177 settings()->setMockGestureTapHighlightsEnabled(enabled);
180 void InternalSettings::setAuthorShadowDOMForAnyElementEnabled(bool isEnabled)
182 RuntimeEnabledFeatures::setAuthorShadowDOMForAnyElementEnabled(isEnabled);
185 void InternalSettings::setExperimentalContentSecurityPolicyFeaturesEnabled(bool enabled)
187 RuntimeEnabledFeatures::setExperimentalContentSecurityPolicyFeaturesEnabled(enabled);
190 void InternalSettings::setLaxMixedContentCheckingEnabled(bool enabled)
192 RuntimeEnabledFeatures::setLaxMixedContentCheckingEnabled(enabled);
195 void InternalSettings::setPseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled(bool enabled)
197 RuntimeEnabledFeatures::setPseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled(enabled);
200 void InternalSettings::setOverlayScrollbarsEnabled(bool enabled)
202 RuntimeEnabledFeatures::setOverlayScrollbarsEnabled(enabled);
205 void InternalSettings::setViewportEnabled(bool enabled, ExceptionState& exceptionState)
207 InternalSettingsGuardForSettings();
208 settings()->setViewportEnabled(enabled);
211 // FIXME: This is a temporary flag and should be removed once squashing is
212 // ready (crbug.com/261605).
213 void InternalSettings::setLayerSquashingEnabled(bool enabled, ExceptionState& exceptionState)
215 InternalSettingsGuardForSettings();
216 settings()->setLayerSquashingEnabled(enabled);
219 void InternalSettings::setStandardFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
221 InternalSettingsGuardForSettings();
222 UScriptCode code = scriptNameToCode(script);
223 if (code == USCRIPT_INVALID_CODE)
225 if (settings()->genericFontFamilySettings().updateStandard(family, code))
226 settings()->notifyGenericFontFamilyChange();
229 void InternalSettings::setSerifFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
231 InternalSettingsGuardForSettings();
232 UScriptCode code = scriptNameToCode(script);
233 if (code == USCRIPT_INVALID_CODE)
235 if (settings()->genericFontFamilySettings().updateSerif(family, code))
236 settings()->notifyGenericFontFamilyChange();
239 void InternalSettings::setSansSerifFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
241 InternalSettingsGuardForSettings();
242 UScriptCode code = scriptNameToCode(script);
243 if (code == USCRIPT_INVALID_CODE)
245 if (settings()->genericFontFamilySettings().updateSansSerif(family, code))
246 settings()->notifyGenericFontFamilyChange();
249 void InternalSettings::setFixedFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
251 InternalSettingsGuardForSettings();
252 UScriptCode code = scriptNameToCode(script);
253 if (code == USCRIPT_INVALID_CODE)
255 if (settings()->genericFontFamilySettings().updateFixed(family, code))
256 settings()->notifyGenericFontFamilyChange();
259 void InternalSettings::setCursiveFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
261 InternalSettingsGuardForSettings();
262 UScriptCode code = scriptNameToCode(script);
263 if (code == USCRIPT_INVALID_CODE)
265 if (settings()->genericFontFamilySettings().updateCursive(family, code))
266 settings()->notifyGenericFontFamilyChange();
269 void InternalSettings::setFantasyFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
271 InternalSettingsGuardForSettings();
272 UScriptCode code = scriptNameToCode(script);
273 if (code == USCRIPT_INVALID_CODE)
275 if (settings()->genericFontFamilySettings().updateFantasy(family, code))
276 settings()->notifyGenericFontFamilyChange();
279 void InternalSettings::setPictographFontFamily(const AtomicString& family, const String& script, ExceptionState& exceptionState)
281 InternalSettingsGuardForSettings();
282 UScriptCode code = scriptNameToCode(script);
283 if (code == USCRIPT_INVALID_CODE)
285 if (settings()->genericFontFamilySettings().updatePictograph(family, code))
286 settings()->notifyGenericFontFamilyChange();
289 void InternalSettings::setTextAutosizingEnabled(bool enabled, ExceptionState& exceptionState)
291 InternalSettingsGuardForSettings();
292 settings()->setTextAutosizingEnabled(enabled);
293 m_page->inspectorController().setTextAutosizingEnabled(enabled);
296 void InternalSettings::setTextAutosizingWindowSizeOverride(int width, int height, ExceptionState& exceptionState)
298 InternalSettingsGuardForSettings();
299 settings()->setTextAutosizingWindowSizeOverride(IntSize(width, height));
302 void InternalSettings::setMediaTypeOverride(const String& mediaType, ExceptionState& exceptionState)
304 InternalSettingsGuardForSettings();
305 settings()->setMediaTypeOverride(mediaType);
308 void InternalSettings::setAccessibilityFontScaleFactor(float fontScaleFactor, ExceptionState& exceptionState)
310 InternalSettingsGuardForSettings();
311 settings()->setAccessibilityFontScaleFactor(fontScaleFactor);
314 void InternalSettings::setEditingBehavior(const String& editingBehavior, ExceptionState& exceptionState)
316 InternalSettingsGuardForSettings();
317 if (equalIgnoringCase(editingBehavior, "win"))
318 settings()->setEditingBehaviorType(EditingWindowsBehavior);
319 else if (equalIgnoringCase(editingBehavior, "mac"))
320 settings()->setEditingBehaviorType(EditingMacBehavior);
321 else if (equalIgnoringCase(editingBehavior, "unix"))
322 settings()->setEditingBehaviorType(EditingUnixBehavior);
323 else if (equalIgnoringCase(editingBehavior, "android"))
324 settings()->setEditingBehaviorType(EditingAndroidBehavior);
326 exceptionState.throwDOMException(SyntaxError, "The editing behavior type provided ('" + editingBehavior + "') is invalid.");
329 void InternalSettings::setLangAttributeAwareFormControlUIEnabled(bool enabled)
331 RuntimeEnabledFeatures::setLangAttributeAwareFormControlUIEnabled(enabled);
334 void InternalSettings::setImagesEnabled(bool enabled, ExceptionState& exceptionState)
336 InternalSettingsGuardForSettings();
337 settings()->setImagesEnabled(enabled);
340 void InternalSettings::setDefaultVideoPosterURL(const String& url, ExceptionState& exceptionState)
342 InternalSettingsGuardForSettings();
343 settings()->setDefaultVideoPosterURL(url);
346 void InternalSettings::trace(Visitor* visitor)
348 visitor->trace(m_page);
349 InternalSettingsGenerated::trace(visitor);
351 HeapSupplement<Page>::trace(visitor);