[WebKit2] Rework WebPreferencesStore to allow easier overriding of defaults
[WebKit-https.git] / Source / WebKit2 / Shared / WebPreferencesStore.h
1 /*
2  * Copyright (C) 2010, 2011, 2012 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef WebPreferencesStore_h
27 #define WebPreferencesStore_h
28
29 #include "ArgumentDecoder.h"
30 #include "ArgumentEncoder.h"
31 #include <WebCore/SecurityOrigin.h>
32 #include <wtf/HashMap.h>
33 #include <wtf/text/StringHash.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebKit {
37
38 // macro(KeyUpper, KeyLower, TypeNameUpper, TypeName, DefaultValue) 
39
40 #if PLATFORM(GTK)
41 #define DEFAULT_WEBKIT_TABSTOLINKS_ENABLED true
42 #else
43 #define DEFAULT_WEBKIT_TABSTOLINKS_ENABLED false
44 #endif
45
46 #if ENABLE(SMOOTH_SCROLLING)
47 #define DEFAULT_WEBKIT_SCROLL_ANIMATOR_ENABLED true
48 #else
49 #define DEFAULT_WEBKIT_SCROLL_ANIMATOR_ENABLED false
50 #endif
51
52 #if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
53 #define DEFAULT_SCREEN_FONT_SUBSTITUTION_ENABLED false
54 #else
55 #define DEFAULT_SCREEN_FONT_SUBSTITUTION_ENABLED true
56 #endif
57
58 #if PLATFORM(COCOA)
59 #define DEFAULT_HIDDEN_PAGE_DOM_TIMER_THROTTLING_ENABLED true
60 #define DEFAULT_HIDDEN_PAGE_CSS_ANIMATION_SUSPENSION_ENABLED true
61 #define DEFAULT_PDFPLUGIN_ENABLED true
62 #else
63 #define DEFAULT_HIDDEN_PAGE_DOM_TIMER_THROTTLING_ENABLED false
64 #define DEFAULT_HIDDEN_PAGE_CSS_ANIMATION_SUSPENSION_ENABLED false
65 #define DEFAULT_PDFPLUGIN_ENABLED false
66 #endif
67
68 #if PLATFORM(IOS)
69 #define DEFAULT_FRAME_FLATTENING_ENABLED true
70 #define DEFAULT_SHOULD_PRINT_BACKGROUNDS true
71 #define DEFAULT_TEXT_AREAS_ARE_RESIZABLE false
72 #define DEFAULT_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY false
73 #define DEFAULT_SHOULD_RESPECT_IMAGE_ORIENTATION true
74 #define DEFAULT_MINIMUM_FONT_ZOOM_SIZE WKGetMinimumZoomFontSize()
75 #define DEFAULT_PASSWORD_ECHO_ENABLED true
76 #define DEFAULT_MEDIA_PLAYBACK_ALLOWS_INLINE false
77 #define DEFAULT_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE true
78 #define DEFAULT_TEMPORARY_TILE_COHORT_RETENTION_ENABLED false
79 #else
80 #define DEFAULT_FRAME_FLATTENING_ENABLED false
81 #define DEFAULT_SHOULD_PRINT_BACKGROUNDS false
82 #define DEFAULT_TEXT_AREAS_ARE_RESIZABLE true
83 #define DEFAULT_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY true
84 #define DEFAULT_SHOULD_RESPECT_IMAGE_ORIENTATION false
85 #define DEFAULT_MINIMUM_FONT_ZOOM_SIZE 0
86 #define DEFAULT_PASSWORD_ECHO_ENABLED false
87 #define DEFAULT_MEDIA_PLAYBACK_ALLOWS_INLINE true
88 #define DEFAULT_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE false
89 #define DEFAULT_TEMPORARY_TILE_COHORT_RETENTION_ENABLED true
90 #endif
91
92 #if PLATFORM(IOS) && !PLATFORM(IOS_SIMULATOR)
93 #define DEFAULT_ACCELERATED_DRAWING_ENABLED true
94 #else
95 #define DEFAULT_ACCELERATED_DRAWING_ENABLED false
96 #endif
97
98 #if PLATFORM(IOS) && PLATFORM(IOS_SIMULATOR)
99 #define DEFAULT_CANVAS_USES_ACCELERATED_DRAWING false
100 #else
101 #define DEFAULT_CANVAS_USES_ACCELERATED_DRAWING true
102 #endif
103
104 #define FOR_EACH_WEBKIT_BOOL_PREFERENCE(macro) \
105     macro(JavaScriptEnabled, javaScriptEnabled, Bool, bool, true) \
106     macro(JavaScriptMarkupEnabled, javaScriptMarkupEnabled, Bool, bool, true) \
107     macro(LoadsImagesAutomatically, loadsImagesAutomatically, Bool, bool, true) \
108     macro(LoadsSiteIconsIgnoringImageLoadingPreference, loadsSiteIconsIgnoringImageLoadingPreference, Bool, bool, false) \
109     macro(PluginsEnabled, pluginsEnabled, Bool, bool, true) \
110     macro(JavaEnabled, javaEnabled, Bool, bool, true) \
111     macro(JavaEnabledForLocalFiles, javaEnabledForLocalFiles, Bool, bool, true) \
112     macro(OfflineWebApplicationCacheEnabled, offlineWebApplicationCacheEnabled, Bool, bool, false) \
113     macro(LocalStorageEnabled, localStorageEnabled, Bool, bool, true) \
114     macro(DatabasesEnabled, databasesEnabled, Bool, bool, true) \
115     macro(XSSAuditorEnabled, xssAuditorEnabled, Bool, bool, true) \
116     macro(FrameFlatteningEnabled, frameFlatteningEnabled, Bool, bool, DEFAULT_FRAME_FLATTENING_ENABLED) \
117     macro(DeveloperExtrasEnabled, developerExtrasEnabled, Bool, bool, false) \
118     macro(JavaScriptExperimentsEnabled, javaScriptExperimentsEnabled, Bool, bool, false) \
119     macro(PrivateBrowsingEnabled, privateBrowsingEnabled, Bool, bool, false) \
120     macro(TextAreasAreResizable, textAreasAreResizable, Bool, bool, DEFAULT_TEXT_AREAS_ARE_RESIZABLE) \
121     macro(JavaScriptCanOpenWindowsAutomatically, javaScriptCanOpenWindowsAutomatically, Bool, bool, DEFAULT_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY) \
122     macro(HyperlinkAuditingEnabled, hyperlinkAuditingEnabled, Bool, bool, true) \
123     macro(NeedsSiteSpecificQuirks, needsSiteSpecificQuirks, Bool, bool, false) \
124     macro(AcceleratedCompositingEnabled, acceleratedCompositingEnabled, Bool, bool, true) \
125     macro(ForceCompositingMode, forceCompositingMode, Bool, bool, false) \
126     macro(AcceleratedDrawingEnabled, acceleratedDrawingEnabled, Bool, bool, DEFAULT_ACCELERATED_DRAWING_ENABLED) \
127     macro(CanvasUsesAcceleratedDrawing, canvasUsesAcceleratedDrawing, Bool, bool, DEFAULT_CANVAS_USES_ACCELERATED_DRAWING) \
128     macro(CompositingBordersVisible, compositingBordersVisible, Bool, bool, false) \
129     macro(CompositingRepaintCountersVisible, compositingRepaintCountersVisible, Bool, bool, false) \
130     macro(TiledScrollingIndicatorVisible, tiledScrollingIndicatorVisible, Bool, bool, false) \
131     macro(WebGLEnabled, webGLEnabled, Bool, bool, true) \
132     macro(MultithreadedWebGLEnabled, multithreadedWebGLEnabled, Bool, bool, false) \
133     macro(ForceSoftwareWebGLRendering, forceSoftwareWebGLRendering, Bool, bool, false) \
134     macro(Accelerated2dCanvasEnabled, accelerated2dCanvasEnabled, Bool, bool, false) \
135     macro(CSSRegionsEnabled, cssRegionsEnabled, Bool, bool, true) \
136     macro(CSSCompositingEnabled, cssCompositingEnabled, Bool, bool, true) \
137     macro(ForceFTPDirectoryListings, forceFTPDirectoryListings, Bool, bool, false) \
138     macro(TabsToLinks, tabsToLinks, Bool, bool, DEFAULT_WEBKIT_TABSTOLINKS_ENABLED) \
139     macro(DNSPrefetchingEnabled, dnsPrefetchingEnabled, Bool, bool, false) \
140     macro(WebArchiveDebugModeEnabled, webArchiveDebugModeEnabled, Bool, bool, false) \
141     macro(LocalFileContentSniffingEnabled, localFileContentSniffingEnabled, Bool, bool, false) \
142     macro(UsesPageCache, usesPageCache, Bool, bool, true) \
143     macro(PageCacheSupportsPlugins, pageCacheSupportsPlugins, Bool, bool, true) \
144     macro(AuthorAndUserStylesEnabled, authorAndUserStylesEnabled, Bool, bool, true) \
145     macro(PaginateDuringLayoutEnabled, paginateDuringLayoutEnabled, Bool, bool, false) \
146     macro(DOMPasteAllowed, domPasteAllowed, Bool, bool, false) \
147     macro(JavaScriptCanAccessClipboard, javaScriptCanAccessClipboard, Bool, bool, false) \
148     macro(ShouldPrintBackgrounds, shouldPrintBackgrounds, Bool, bool, DEFAULT_SHOULD_PRINT_BACKGROUNDS) \
149     macro(FullScreenEnabled, fullScreenEnabled, Bool, bool, false) \
150     macro(AsynchronousSpellCheckingEnabled, asynchronousSpellCheckingEnabled, Bool, bool, false) \
151     macro(WebSecurityEnabled, webSecurityEnabled, Bool, bool, true) \
152     macro(AllowUniversalAccessFromFileURLs, allowUniversalAccessFromFileURLs, Bool, bool, false) \
153     macro(AllowFileAccessFromFileURLs, allowFileAccessFromFileURLs, Bool, bool, false) \
154     macro(AVFoundationEnabled, isAVFoundationEnabled, Bool, bool, true) \
155     macro(MediaPlaybackRequiresUserGesture, mediaPlaybackRequiresUserGesture, Bool, bool, DEFAULT_MEDIA_PLAYBACK_REQUIRES_USER_GESTURE) \
156     macro(MediaPlaybackAllowsInline, mediaPlaybackAllowsInline, Bool, bool, DEFAULT_MEDIA_PLAYBACK_ALLOWS_INLINE) \
157     macro(MediaPlaybackAllowsAirPlay, mediaPlaybackAllowsAirPlay, Bool, bool, true) \
158     macro(InspectorStartsAttached, inspectorStartsAttached, Bool, bool, true) \
159     macro(ShowsToolTipOverTruncatedText, showsToolTipOverTruncatedText, Bool, bool, false) \
160     macro(MockScrollbarsEnabled, mockScrollbarsEnabled, Bool, bool, false) \
161     macro(WebAudioEnabled, webAudioEnabled, Bool, bool, true) \
162     macro(ApplicationChromeModeEnabled, applicationChromeMode, Bool, bool, false) \
163     macro(SuppressesIncrementalRendering, suppressesIncrementalRendering, Bool, bool, false) \
164     macro(BackspaceKeyNavigationEnabled, backspaceKeyNavigationEnabled, Bool, bool, true) \
165     macro(CaretBrowsingEnabled, caretBrowsingEnabled, Bool, bool, false) \
166     macro(ShouldDisplaySubtitles, shouldDisplaySubtitles, Bool, bool, false) \
167     macro(ShouldDisplayCaptions, shouldDisplayCaptions, Bool, bool, false) \
168     macro(ShouldDisplayTextDescriptions, shouldDisplayTextDescriptions, Bool, bool, false) \
169     macro(NotificationsEnabled, notificationsEnabled, Bool, bool, true) \
170     macro(ShouldRespectImageOrientation, shouldRespectImageOrientation, Bool, bool, DEFAULT_SHOULD_RESPECT_IMAGE_ORIENTATION) \
171     macro(WantsBalancedSetDefersLoadingBehavior, wantsBalancedSetDefersLoadingBehavior, Bool, bool, false) \
172     macro(RequestAnimationFrameEnabled, requestAnimationFrameEnabled, Bool, bool, true) \
173     macro(DiagnosticLoggingEnabled, diagnosticLoggingEnabled, Bool, bool, false) \
174     macro(AsynchronousPluginInitializationEnabled, asynchronousPluginInitializationEnabled, Bool, bool, false) \
175     macro(AsynchronousPluginInitializationEnabledForAllPlugins, asynchronousPluginInitializationEnabledForAllPlugins, Bool, bool, false) \
176     macro(ArtificialPluginInitializationDelayEnabled, artificialPluginInitializationDelayEnabled, Bool, bool, false) \
177     macro(TabToLinksEnabled, tabToLinksEnabled, Bool, bool, false) \
178     macro(InteractiveFormValidationEnabled, interactiveFormValidationEnabled, Bool, bool, false) \
179     macro(ScrollingPerformanceLoggingEnabled, scrollingPerformanceLoggingEnabled, Bool, bool, false) \
180     macro(ScrollAnimatorEnabled, scrollAnimatorEnabled, Bool, bool, DEFAULT_WEBKIT_SCROLL_ANIMATOR_ENABLED) \
181     macro(ScreenFontSubstitutionEnabled, screenFontSubstitutionEnabled, Bool, bool, DEFAULT_SCREEN_FONT_SUBSTITUTION_ENABLED) \
182     macro(CookieEnabled, cookieEnabled, Bool, bool, true) \
183     macro(PlugInSnapshottingEnabled, plugInSnapshottingEnabled, Bool, bool, false) \
184     macro(SnapshotAllPlugIns, snapshotAllPlugIns, Bool, bool, false) \
185     macro(AutostartOriginPlugInSnapshottingEnabled, autostartOriginPlugInSnapshottingEnabled, Bool, bool, true) \
186     macro(PrimaryPlugInSnapshotDetectionEnabled, primaryPlugInSnapshotDetectionEnabled, Bool, bool, true) \
187     macro(PDFPluginEnabled, pdfPluginEnabled, Bool, bool, DEFAULT_PDFPLUGIN_ENABLED) \
188     macro(UsesEncodingDetector, usesEncodingDetector, Bool, bool, false) \
189     macro(TextAutosizingEnabled, textAutosizingEnabled, Bool, bool, false) \
190     macro(AggressiveTileRetentionEnabled, aggressiveTileRetentionEnabled, Bool, bool, false) \
191     macro(TemporaryTileCohortRetentionEnabled, temporaryTileCohortRetentionEnabled, Bool, bool, DEFAULT_TEMPORARY_TILE_COHORT_RETENTION_ENABLED) \
192     macro(QTKitEnabled, isQTKitEnabled, Bool, bool, true) \
193     macro(LogsPageMessagesToSystemConsoleEnabled, logsPageMessagesToSystemConsoleEnabled, Bool, bool, false) \
194     macro(PageVisibilityBasedProcessSuppressionEnabled, pageVisibilityBasedProcessSuppressionEnabled, Bool, bool, true) \
195     macro(SmartInsertDeleteEnabled, smartInsertDeleteEnabled, Bool, bool, true) \
196     macro(SelectTrailingWhitespaceEnabled, selectTrailingWhitespaceEnabled, Bool, bool, false) \
197     macro(ShowsURLsInToolTipsEnabled, showsURLsInToolTipsEnabled, Bool, bool, false) \
198     macro(AcceleratedCompositingForOverflowScrollEnabled, acceleratedCompositingForOverflowScrollEnabled, Bool, bool, false) \
199     macro(HiddenPageDOMTimerThrottlingEnabled, hiddenPageDOMTimerThrottlingEnabled, Bool, bool, DEFAULT_HIDDEN_PAGE_DOM_TIMER_THROTTLING_ENABLED) \
200     macro(HiddenPageCSSAnimationSuspensionEnabled, hiddenPageCSSAnimationSuspensionEnabled, Bool, bool, DEFAULT_HIDDEN_PAGE_CSS_ANIMATION_SUSPENSION_ENABLED) \
201     macro(LowPowerVideoAudioBufferSizeEnabled, lowPowerVideoAudioBufferSizeEnabled, Bool, bool, false) \
202     macro(ThreadedScrollingEnabled, threadedScrollingEnabled, Bool, bool, true) \
203     macro(SimpleLineLayoutEnabled, simpleLineLayoutEnabled, Bool, bool, true) \
204     macro(SimpleLineLayoutDebugBordersEnabled, simpleLineLayoutDebugBordersEnabled, Bool, bool, false) \
205     macro(SubpixelCSSOMElementMetricsEnabled, subpixelCSSOMElementMetricsEnabled, Bool, bool, true) \
206     macro(BackgroundShouldExtendBeyondPage, backgroundShouldExtendBeyondPage, Bool, bool, false) \
207     macro(MediaStreamEnabled, mediaStreamEnabled, Bool, bool, false) \
208     macro(UseLegacyTextAlignPositionedElementBehavior, useLegacyTextAlignPositionedElementBehavior, Bool, bool, false) \
209     macro(SpatialNavigationEnabled, spatialNavigationEnabled, Bool, bool, false) \
210     macro(MediaSourceEnabled, mediaSourceEnabled, Bool, bool, true) \
211     macro(ViewGestureDebuggingEnabled, viewGestureDebuggingEnabled, Bool, bool, false) \
212     macro(ShouldConvertPositionStyleOnCopy, shouldConvertPositionStyleOnCopy, Bool, bool, false) \
213     macro(Standalone, standalone, Bool, bool, false) \
214     macro(TelephoneNumberParsingEnabled, telephoneNumberParsingEnabled, Bool, bool, false) \
215     macro(AlwaysUseBaselineOfPrimaryFont, alwaysUseBaselineOfPrimaryFont, Bool, bool, false) \
216     macro(AllowMultiElementImplicitSubmission, allowMultiElementImplicitSubmission, Bool, bool, false) \
217     macro(AlwaysUseAcceleratedOverflowScroll, alwaysUseAcceleratedOverflowScroll, Bool, bool, false) \
218     macro(PasswordEchoEnabled, passwordEchoEnabled, Bool, bool, DEFAULT_PASSWORD_ECHO_ENABLED) \
219     macro(ImageControlsEnabled, imageControlsEnabled, Bool, bool, false) \
220     macro(EnableInheritURIQueryComponent, enableInheritURIQueryComponent, Bool, bool, false) \
221     macro(ServiceControlsEnabled, serviceControlsEnabled, Bool, bool, false) \
222
223 #define FOR_EACH_WEBKIT_DOUBLE_PREFERENCE(macro) \
224     macro(PDFScaleFactor, pdfScaleFactor, Double, double, 0) \
225     macro(IncrementalRenderingSuppressionTimeout, incrementalRenderingSuppressionTimeout, Double, double, 5) \
226     macro(MinimumFontSize, minimumFontSize, Double, double, 0) \
227     macro(MinimumLogicalFontSize, minimumLogicalFontSize, Double, double, 9) \
228     macro(MinimumZoomFontSize, minimumZoomFontSize, Double, double, DEFAULT_MINIMUM_FONT_ZOOM_SIZE) \
229     macro(DefaultFontSize, defaultFontSize, Double, double, 16) \
230     macro(DefaultFixedFontSize, defaultFixedFontSize, Double, double, 13) \
231     macro(LayoutInterval, layoutInterval, Double, double, -1) \
232     macro(MaxParseDuration, maxParseDuration, Double, double, -1) \
233     macro(PasswordEchoDuration, passwordEchoDuration, Double, double, 2) \
234     \
235
236 #define FOR_EACH_WEBKIT_UINT32_PREFERENCE(macro) \
237     macro(FontSmoothingLevel, fontSmoothingLevel, UInt32, uint32_t, FontSmoothingLevelMedium) \
238     macro(LayoutFallbackWidth, layoutFallbackWidth, UInt32, uint32_t, 980) \
239     macro(DeviceWidth, deviceWidth, UInt32, uint32_t, 0) \
240     macro(DeviceHeight, deviceHeight, UInt32, uint32_t, 0) \
241     macro(PDFDisplayMode, pdfDisplayMode, UInt32, uint32_t, 1) \
242     macro(EditableLinkBehavior, editableLinkBehavior, UInt32, uint32_t, WebCore::EditableLinkNeverLive) \
243     macro(InspectorAttachedHeight, inspectorAttachedHeight, UInt32, uint32_t, 300) \
244     macro(InspectorAttachedWidth, inspectorAttachedWidth, UInt32, uint32_t, 750) \
245     macro(InspectorAttachmentSide, inspectorAttachmentSide, UInt32, uint32_t, 0) \
246     macro(StorageBlockingPolicy, storageBlockingPolicy, UInt32, uint32_t, WebCore::SecurityOrigin::AllowAllStorage) \
247     \
248
249 #if PLATFORM(COCOA)
250
251 #if PLATFORM(IOS)
252 #define DEFAULT_CURSIVE_FONT_FAMILY "Snell Roundhand"
253 #define DEFAULT_PICTOGRAPH_FONT_FAMILY "AppleColorEmoji"
254 #else
255 #define DEFAULT_CURSIVE_FONT_FAMILY "Apple Chancery"
256 #define DEFAULT_PICTOGRAPH_FONT_FAMILY "Apple Color Emoji"
257 #endif
258
259
260 #define FOR_EACH_WEBKIT_FONT_FAMILY_PREFERENCE(macro) \
261     macro(StandardFontFamily, standardFontFamily, String, String, "Times") \
262     macro(CursiveFontFamily, cursiveFontFamily, String, String, DEFAULT_CURSIVE_FONT_FAMILY) \
263     macro(FantasyFontFamily, fantasyFontFamily, String, String, "Papyrus") \
264     macro(FixedFontFamily, fixedFontFamily, String, String, "Courier") \
265     macro(SansSerifFontFamily, sansSerifFontFamily, String, String, "Helvetica") \
266     macro(SerifFontFamily, serifFontFamily, String, String, "Times") \
267     macro(PictographFontFamily, pictographFontFamily, String, String, "Apple Color Emoji") \
268     \
269
270 #elif PLATFORM(GTK) || PLATFORM(EFL)
271
272 #define FOR_EACH_WEBKIT_FONT_FAMILY_PREFERENCE(macro) \
273     macro(StandardFontFamily, standardFontFamily, String, String, "Times") \
274     macro(CursiveFontFamily, cursiveFontFamily, String, String, "Comic Sans MS") \
275     macro(FantasyFontFamily, fantasyFontFamily, String, String, "Impact") \
276     macro(FixedFontFamily, fixedFontFamily, String, String, "Courier New") \
277     macro(SansSerifFontFamily, sansSerifFontFamily, String, String, "Helvetica") \
278     macro(SerifFontFamily, serifFontFamily, String, String, "Times") \
279     macro(PictographFontFamily, pictographFontFamily, String, String, "Times") \
280     \
281
282 #endif
283
284 #define FOR_EACH_WEBKIT_STRING_PREFERENCE(macro) \
285     FOR_EACH_WEBKIT_FONT_FAMILY_PREFERENCE(macro) \
286     macro(DefaultTextEncodingName, defaultTextEncodingName, String, String, "ISO-8859-1") \
287     macro(FTPDirectoryTemplatePath, ftpDirectoryTemplatePath, String, String, "") \
288     \
289
290 #define FOR_EACH_WEBKIT_STRING_PREFERENCE_NOT_IN_WEBCORE(macro) \
291     macro(InspectorWindowFrame, inspectorWindowFrame, String, String, "") \
292     \
293
294 #define FOR_EACH_WEBKIT_PREFERENCE(macro) \
295     FOR_EACH_WEBKIT_BOOL_PREFERENCE(macro) \
296     FOR_EACH_WEBKIT_DOUBLE_PREFERENCE(macro) \
297     FOR_EACH_WEBKIT_UINT32_PREFERENCE(macro) \
298     FOR_EACH_WEBKIT_STRING_PREFERENCE(macro) \
299     FOR_EACH_WEBKIT_STRING_PREFERENCE_NOT_IN_WEBCORE(macro) \
300     \
301
302 namespace WebPreferencesKey {
303
304 #define DECLARE_KEY_GETTERS(KeyUpper, KeyLower, TypeName, Type, DefaultValue) const String& KeyLower##Key();
305
306 FOR_EACH_WEBKIT_PREFERENCE(DECLARE_KEY_GETTERS)
307
308 #undef DECLARE_KEY_GETTERS
309
310 } // namespace WebPreferencesKey
311
312 struct WebPreferencesStore {
313     WebPreferencesStore();
314
315     void encode(IPC::ArgumentEncoder&) const;
316     static bool decode(IPC::ArgumentDecoder&, WebPreferencesStore&);
317
318     // NOTE: The getters in this class have non-standard names to aid in the use of the preference macros.
319
320     bool setStringValueForKey(const String& key, const String& value);
321     String getStringValueForKey(const String& key) const;
322
323     bool setBoolValueForKey(const String& key, bool value);
324     bool getBoolValueForKey(const String& key) const;
325
326     bool setUInt32ValueForKey(const String& key, uint32_t value);
327     uint32_t getUInt32ValueForKey(const String& key) const;
328
329     bool setDoubleValueForKey(const String& key, double value);
330     double getDoubleValueForKey(const String& key) const;
331
332     void setOverrideDefaultsStringValueForKey(const String& key, String value);
333     void setOverrideDefaultsBoolValueForKey(const String& key, bool value);
334     void setOverrideDefaultsUInt32ValueForKey(const String& key, uint32_t value);
335     void setOverrideDefaultsDoubleValueForKey(const String& key, double value);
336
337     // For WebKitTestRunner usage.
338     static void overrideBoolValueForKey(const String& key, bool value);
339     static void removeTestRunnerOverrides();
340
341     struct Value {
342         enum class Type {
343             None,
344             String,
345             Bool,
346             UInt32,
347             Double,
348         };
349
350         void encode(IPC::ArgumentEncoder&) const;
351         static bool decode(IPC::ArgumentDecoder&, Value&);
352
353         explicit Value() : m_type(Type::None) { }
354         explicit Value(const String& value) : m_type(Type::String), m_string(value) { }
355         explicit Value(bool value) : m_type(Type::Bool), m_bool(value) { }
356         explicit Value(uint32_t value) : m_type(Type::UInt32), m_uint32(value) { }
357         explicit Value(double value) : m_type(Type::Double), m_double(value) { }
358
359         Value(Value&& value)
360             : m_type(value.m_type)
361         {
362             switch (m_type) {
363             case Type::None:
364                 break;
365             case Type::String:
366                 new (&m_string) String(std::move(value.m_string));
367                 break;
368             case Type::Bool:
369                 m_bool = value.m_bool;
370                 break;
371             case Type::UInt32:
372                 m_uint32 = value.m_uint32;
373                 break;
374             case Type::Double:
375                 m_double = value.m_double;
376                 break;
377             }
378         }
379
380         Value& operator=(const Value& other)
381         {
382             if (this == &other)
383                 return *this;
384                 
385             destroy();
386
387             m_type = other.m_type;
388             switch (m_type) {
389             case Type::None:
390                 break;
391             case Type::String:
392                 new (&m_string) String(other.m_string);
393                 break;
394             case Type::Bool:
395                 m_bool = other.m_bool;
396                 break;
397             case Type::UInt32:
398                 m_uint32 = other.m_uint32;
399                 break;
400             case Type::Double:
401                 m_double = other.m_double;
402                 break;
403             }
404     
405             return *this;
406         }
407
408         ~Value()
409         {
410             destroy();
411         }
412
413         Type type() const { return m_type; }
414
415         String asString() const
416         {
417             ASSERT(m_type == Type::String);
418             return m_string;
419         }
420
421         bool asBool() const
422         {
423             ASSERT(m_type == Type::Bool);
424             return m_bool;
425         }
426
427         uint32_t asUInt32() const
428         {
429             ASSERT(m_type == Type::UInt32);
430             return m_uint32;
431         }
432
433         double asDouble() const
434         {
435             ASSERT(m_type == Type::Double);
436             return m_double;
437         }
438
439     private:
440         void destroy()
441         {
442             if (m_type == Type::String)
443                 m_string.~String();
444         }
445
446         Type m_type;
447         union {
448             String m_string;
449             bool m_bool;
450             uint32_t m_uint32;
451             double m_double;
452         };
453     };
454
455     typedef HashMap<String, Value> ValueMap;
456     ValueMap m_values;
457     ValueMap m_overridenDefaults;
458 };
459
460 } // namespace WebKit
461
462 #endif // WebPreferencesStore_h