249903a551eaa1b19a74a0eeaae4feb01578f12e
[WebKit-https.git] / WebKit / WebView.subproj / WebPreferences.m
1 /*        
2         WebPreferences.m
3         Copyright 2001, 2002, Apple Computer, Inc. All rights reserved.
4 */
5
6 #import <WebKit/WebPreferencesPrivate.h>
7
8 #import <WebKit/WebKitLogging.h>
9 #import <WebKit/WebKitNSStringExtras.h>
10 #import <WebKit/WebNSURLExtras.h>
11
12 #import <Foundation/NSDictionary_NSURLExtras.h>
13 #import <Foundation/NSString_NSURLExtras.h>
14
15 #import <WebCore/WebCoreSettings.h>
16
17 // These are private because callers should be using the cover methods
18 #define WebKitLogLevelPreferenceKey @"WebKitLogLevel"
19 #define WebKitStandardFontPreferenceKey @"WebKitStandardFont"
20 #define WebKitFixedFontPreferenceKey @"WebKitFixedFont"
21 #define WebKitSerifFontPreferenceKey @"WebKitSerifFont"
22 #define WebKitSansSerifFontPreferenceKey @"WebKitSansSerifFont"
23 #define WebKitCursiveFontPreferenceKey @"WebKitCursiveFont"
24 #define WebKitFantasyFontPreferenceKey @"WebKitFantasyFont"
25 #define WebKitMinimumFontSizePreferenceKey @"WebKitMinimumFontSize"
26 #define WebKitMinimumLogicalFontSizePreferenceKey @"WebKitMinimumLogicalFontSize"
27 #define WebKitDefaultFontSizePreferenceKey @"WebKitDefaultFontSize"
28 #define WebKitDefaultFixedFontSizePreferenceKey @"WebKitDefaultFixedFontSize"
29 #define WebKitDefaultTextEncodingNamePreferenceKey @"WebKitDefaultTextEncodingName"
30 #define WebKitUserStyleSheetEnabledPreferenceKey @"WebKitUserStyleSheetEnabledPreferenceKey"
31 #define WebKitUserStyleSheetLocationPreferenceKey @"WebKitUserStyleSheetLocationPreferenceKey"
32 #define WebKitShouldPrintBackgroundsPreferenceKey @"WebKitShouldPrintBackgroundsPreferenceKey"
33 #define WebKitJavaEnabledPreferenceKey @"WebKitJavaEnabled"
34 #define WebKitJavaScriptEnabledPreferenceKey @"WebKitJavaScriptEnabled"
35 #define WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey @"WebKitJavaScriptCanOpenWindowsAutomatically"
36 #define WebKitPluginsEnabledPreferenceKey @"WebKitPluginsEnabled"
37 #define WebKitInitialTimedLayoutDelayPreferenceKey @"WebKitInitialTimedLayoutDelay"
38 #define WebKitInitialTimedLayoutSizePreferenceKey @"WebKitInitialTimedLayoutSize"
39 #define WebKitInitialTimedLayoutEnabledPreferenceKey @"WebKitInitialTimedLayoutEnabled"
40 #define WebKitResourceTimedLayoutEnabledPreferenceKey @"WebKitResourceTimedLayoutEnabled"
41 #define WebKitResourceTimedLayoutDelayPreferenceKey @"WebKitResourceTimedLayoutDelay"
42 #define WebKitAllowAnimatedImagesPreferenceKey @"WebKitAllowAnimatedImagesPreferenceKey"
43 #define WebKitAllowAnimatedImageLoopingPreferenceKey @"WebKitAllowAnimatedImageLoopingPreferenceKey"
44 #define WebKitDisplayImagesKey @"WebKitDisplayImagesKey"
45 #define WebKitPageCacheSizePreferenceKey @"WebKitPageCacheSizePreferenceKey"
46 #define WebKitObjectCacheSizePreferenceKey @"WebKitObjectCacheSizePreferenceKey"
47 #define WebKitBackForwardCacheExpirationIntervalKey @"WebKitBackForwardCacheExpirationIntervalKey"
48 #define WebKitTabToLinksPreferenceKey @"WebKitTabToLinksPreferenceKey"
49 #define WebKitHistoryIsFrozenPreferenceKey @"WebKitHistoryIsFrozen"
50
51 NSString *WebPreferencesChangedNotification = @"WebPreferencesChangedNotification";
52
53 #define KEY(x) [(_private->identifier?_private->identifier:@"") stringByAppendingString:x]
54
55 enum { WebPreferencesVersion = 1 };
56
57 @interface WebPreferencesPrivate : NSObject
58 {
59 @public
60     NSMutableDictionary *values;
61     NSString *identifier;
62     NSString *IBCreatorID;
63     BOOL autosaves;
64 }
65 @end
66
67 @implementation WebPreferencesPrivate
68 - (void)dealloc
69 {
70     [values release];
71     [identifier release];
72     [IBCreatorID release];
73     [super dealloc];
74 }
75 @end
76
77 @interface WebPreferences (WebInternal)
78 + (NSString *)_concatenateKeyWithIBCreatorID:(NSString *)key;
79 + (NSString *)_IBCreatorID;
80 - (NSString *)_stringValueForKey: (NSString *)key;
81 - (void)_setStringValue: (NSString *)value forKey: (NSString *)key;
82 - (int)_integerValueForKey: (NSString *)key;
83 - (void)_setIntegerValue: (int)value forKey: (NSString *)key;
84 - (int)_boolValueForKey: (NSString *)key;
85 - (void)_setBoolValue: (BOOL)value forKey: (NSString *)key;
86 @end
87
88 @implementation WebPreferences
89
90 - init
91 {
92     // Create fake identifier
93     static int instanceCount = 1;
94     NSString *fakeIdentifier;
95     
96     // At least ensure that identifier hasn't been already used.  
97     fakeIdentifier = [NSString stringWithFormat:@"WebPreferences%d", instanceCount++];
98     while ([[self class] _getInstanceForIdentifier:fakeIdentifier]){
99         fakeIdentifier = [NSString stringWithFormat:@"WebPreferences%d", instanceCount++];
100     }
101     
102     return [self initWithIdentifier:fakeIdentifier];
103 }
104
105 static WebPreferences *_standardPreferences = nil;
106
107 - (id)initWithIdentifier:(NSString *)anIdentifier
108 {
109     [super init];
110
111     _private = [[WebPreferencesPrivate alloc] init];
112     _private->IBCreatorID = [[WebPreferences _IBCreatorID] retain];
113
114     WebPreferences *instance = [[self class] _getInstanceForIdentifier:anIdentifier];
115     if (instance){
116         [self release];
117         return [instance retain];
118     }
119
120     _private->values = [[NSMutableDictionary alloc] init];
121     _private->identifier = [anIdentifier copy];
122     
123     [[self class] _setInstance:self forIdentifier:_private->identifier];
124
125     [[NSNotificationCenter defaultCenter]
126        postNotificationName:WebPreferencesChangedNotification object:self userInfo:nil];
127
128     return self;
129 }
130
131 - (id)initWithCoder:(NSCoder *)decoder
132 {
133     volatile id result = nil;
134
135 NS_DURING
136
137     int version;
138
139     _private = [[WebPreferencesPrivate alloc] init];
140     _private->IBCreatorID = [[WebPreferences _IBCreatorID] retain];
141     
142     if ([decoder allowsKeyedCoding]){
143         _private->identifier = [[decoder decodeObjectForKey:@"Identifier"] retain];
144         _private->values = [[decoder decodeObjectForKey:@"Values"] retain];
145         LOG (Encoding, "Identifier = %@, Values = %@\n", _private->identifier, _private->values);
146     }
147     else {
148         [decoder decodeValueOfObjCType:@encode(int) at:&version];
149         if (version == 1){
150             _private->identifier = [[decoder decodeObject] retain];
151             _private->values = [[decoder decodeObject] retain];
152         }
153     }
154     
155     // If we load a nib multiple times, or have instances in multiple
156     // nibs with the same name, the first guy up wins.
157     WebPreferences *instance = [[self class] _getInstanceForIdentifier:_private->identifier];
158     if (instance){
159         [self release];
160         result = [instance retain];
161     }
162     else {
163         [[self class] _setInstance:self forIdentifier:_private->identifier];
164         result = self;
165     }
166     
167 NS_HANDLER
168
169     result = nil;
170     [self release];
171     
172 NS_ENDHANDLER
173
174     return result;
175 }
176
177 - (void)encodeWithCoder:(NSCoder *)encoder
178 {
179     if ([encoder allowsKeyedCoding]){
180         [encoder encodeObject:_private->identifier forKey:@"Identifier"];
181         [encoder encodeObject:_private->values forKey:@"Values"];
182         LOG (Encoding, "Identifier = %@, Values = %@\n", _private->identifier, _private->values);
183     }
184     else {
185         int version = WebPreferencesVersion;
186         [encoder encodeValueOfObjCType:@encode(int) at:&version];
187         [encoder encodeObject:_private->identifier];
188         [encoder encodeObject:_private->values];
189     }
190 }
191
192 + (WebPreferences *)standardPreferences
193 {
194     if (_standardPreferences == nil) {
195         _standardPreferences = [[WebPreferences alloc] initWithIdentifier:nil];
196         [_standardPreferences setAutosaves:YES];
197         [_standardPreferences _postPreferencesChangesNotification];
198     }
199
200     return _standardPreferences;
201 }
202
203 // if we ever have more than one WebPreferences object, this would move to init
204 + (void)initialize
205 {
206     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
207         @"0x0",                         WebKitLogLevelPreferenceKey,
208         @"Times",                       WebKitStandardFontPreferenceKey,
209         @"Courier",                     WebKitFixedFontPreferenceKey,
210         @"Times",                       WebKitSerifFontPreferenceKey,
211         @"Helvetica",                   WebKitSansSerifFontPreferenceKey,
212         @"Apple Chancery",              WebKitCursiveFontPreferenceKey,
213         @"Papyrus",                     WebKitFantasyFontPreferenceKey,
214         @"1",                           WebKitMinimumFontSizePreferenceKey,
215         @"9",                           WebKitMinimumLogicalFontSizePreferenceKey, 
216         @"16",                          WebKitDefaultFontSizePreferenceKey,
217         @"13",                          WebKitDefaultFixedFontSizePreferenceKey,
218         @"ISO-8859-1",                  WebKitDefaultTextEncodingNamePreferenceKey,
219         @"1.00",                        WebKitInitialTimedLayoutDelayPreferenceKey,
220         @"4096",                        WebKitInitialTimedLayoutSizePreferenceKey,
221         @"1.00",                        WebKitResourceTimedLayoutDelayPreferenceKey,
222         @"4",                           WebKitPageCacheSizePreferenceKey,
223         @"4194304",                     WebKitObjectCacheSizePreferenceKey,
224         [NSNumber numberWithBool:YES],  WebKitInitialTimedLayoutEnabledPreferenceKey,
225         [NSNumber numberWithBool:YES],  WebKitResourceTimedLayoutEnabledPreferenceKey,
226         [NSNumber numberWithBool:NO],   WebKitUserStyleSheetEnabledPreferenceKey,
227         @"",                            WebKitUserStyleSheetLocationPreferenceKey,
228         [NSNumber numberWithBool:NO],   WebKitShouldPrintBackgroundsPreferenceKey,
229         [NSNumber numberWithBool:YES],  WebKitJavaEnabledPreferenceKey,
230         [NSNumber numberWithBool:YES],  WebKitJavaScriptEnabledPreferenceKey,
231         [NSNumber numberWithBool:YES],  WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey,
232         [NSNumber numberWithBool:YES],  WebKitPluginsEnabledPreferenceKey,
233         [NSNumber numberWithBool:YES],  WebKitAllowAnimatedImagesPreferenceKey,
234         [NSNumber numberWithBool:YES],  WebKitAllowAnimatedImageLoopingPreferenceKey,
235         [NSNumber numberWithBool:YES],  WebKitDisplayImagesKey,
236         @"1800",                        WebKitBackForwardCacheExpirationIntervalKey,
237         [NSNumber numberWithBool:NO],   WebKitTabToLinksPreferenceKey,
238         [NSNumber numberWithBool:NO],   WebKitHistoryIsFrozenPreferenceKey,
239         nil];
240
241     [[NSUserDefaults standardUserDefaults] registerDefaults:dict];
242 }
243
244 - (void)dealloc
245 {
246     [_private release];
247     [super dealloc];
248 }
249
250 - (NSString *)identifier
251 {
252     return _private->identifier;
253 }
254
255 - (NSString *)_stringValueForKey: (NSString *)key
256 {
257     NSString *_key = KEY(key);
258     NSString *s = [_private->values objectForKey:_key];
259     if (s)
260         return s;
261     s = [[NSUserDefaults standardUserDefaults] stringForKey:_key];
262     if (!s)
263         s = [[NSUserDefaults standardUserDefaults] stringForKey:key];
264     return s;
265 }
266
267 - (void)_setStringValue: (NSString *)value forKey: (NSString *)key
268 {
269     NSString *_key = KEY(key);
270     if (_private->autosaves)
271         [[NSUserDefaults standardUserDefaults] setObject:value forKey:_key];
272
273     [_private->values setObject: value forKey:_key];
274
275     [self _postPreferencesChangesNotification];
276 }
277
278 - (int)_integerValueForKey: (NSString *)key
279 {
280     NSString *_key = KEY(key);
281     NSNumber *n = [_private->values objectForKey:_key];
282     if (n)
283         return [n intValue];
284     n = [[NSUserDefaults standardUserDefaults] objectForKey:_key];
285     if (!n)
286         n = [[NSUserDefaults standardUserDefaults] objectForKey:key];
287     return [n intValue];
288 }
289
290 - (void)_setIntegerValue: (int)value forKey: (NSString *)key
291 {
292     NSString *_key = KEY(key);
293     if (_private->autosaves)
294         [[NSUserDefaults standardUserDefaults] setInteger:value forKey:_key];
295
296     [_private->values _web_setInt: value forKey: _key];
297
298     [self _postPreferencesChangesNotification];
299 }
300
301 - (int)_boolValueForKey: (NSString *)key
302 {
303     NSString *_key = KEY(key);
304     NSNumber *n = [_private->values objectForKey:_key];
305     if (n)
306         return [n boolValue];
307     n = [[NSUserDefaults standardUserDefaults] objectForKey:_key];
308     if (!n)
309         n = [[NSUserDefaults standardUserDefaults] objectForKey:key];
310     return [n intValue] != 0 ? YES : NO;
311 }
312
313 - (void)_setBoolValue: (BOOL)value forKey: (NSString *)key
314 {
315     NSString *_key = KEY(key);
316     if (_private->autosaves)
317         [[NSUserDefaults standardUserDefaults] setBool:value forKey:_key];
318
319     [_private->values _web_setBool: value forKey: _key];
320
321     [self _postPreferencesChangesNotification];
322 }
323
324 - (NSString *)standardFontFamily
325 {
326     return [self _stringValueForKey: WebKitStandardFontPreferenceKey];
327 }
328
329 - (void)setStandardFontFamily:(NSString *)family
330 {
331     [self _setStringValue: family forKey: WebKitStandardFontPreferenceKey];
332 }
333
334 - (NSString *)fixedFontFamily
335 {
336     return [self _stringValueForKey: WebKitFixedFontPreferenceKey];
337 }
338
339 - (void)setFixedFontFamily:(NSString *)family
340 {
341     [self _setStringValue: family forKey: WebKitFixedFontPreferenceKey];
342 }
343
344 - (NSString *)serifFontFamily
345 {
346     return [self _stringValueForKey: WebKitSerifFontPreferenceKey];
347 }
348
349 - (void)setSerifFontFamily:(NSString *)family 
350 {
351     [self _setStringValue: family forKey: WebKitSerifFontPreferenceKey];
352 }
353
354 - (NSString *)sansSerifFontFamily
355 {
356     return [self _stringValueForKey: WebKitSansSerifFontPreferenceKey];
357 }
358
359 - (void)setSansSerifFontFamily:(NSString *)family
360 {
361     [self _setStringValue: family forKey: WebKitSansSerifFontPreferenceKey];
362 }
363
364 - (NSString *)cursiveFontFamily
365 {
366     return [self _stringValueForKey: WebKitCursiveFontPreferenceKey];
367 }
368
369 - (void)setCursiveFontFamily:(NSString *)family
370 {
371     [self _setStringValue: family forKey: WebKitCursiveFontPreferenceKey];
372 }
373
374 - (NSString *)fantasyFontFamily
375 {
376     return [self _stringValueForKey: WebKitFantasyFontPreferenceKey];
377 }
378
379 - (void)setFantasyFontFamily:(NSString *)family
380 {
381     [self _setStringValue: family forKey: WebKitFantasyFontPreferenceKey];
382 }
383
384 - (int)defaultFontSize
385 {
386     return [self _integerValueForKey: WebKitDefaultFontSizePreferenceKey];
387 }
388
389 - (void)setDefaultFontSize:(int)size
390 {
391     [self _setIntegerValue: size forKey: WebKitDefaultFontSizePreferenceKey];
392 }
393
394 - (int)defaultFixedFontSize
395 {
396     return [self _integerValueForKey: WebKitDefaultFixedFontSizePreferenceKey];
397 }
398
399 - (void)setDefaultFixedFontSize:(int)size
400 {
401     [self _setIntegerValue: size forKey: WebKitDefaultFixedFontSizePreferenceKey];
402 }
403
404 - (int)minimumFontSize
405 {
406     return [self _integerValueForKey: WebKitMinimumFontSizePreferenceKey];
407 }
408
409 - (void)setMinimumFontSize:(int)size
410 {
411     [self _setIntegerValue: size forKey: WebKitMinimumFontSizePreferenceKey];
412 }
413
414 - (int)minimumLogicalFontSize
415 {
416   return [self _integerValueForKey: WebKitMinimumLogicalFontSizePreferenceKey];
417 }
418
419 - (void)setMinimumLogicalFontSize:(int)size
420 {
421   [self _setIntegerValue: size forKey: WebKitMinimumLogicalFontSizePreferenceKey];
422 }
423
424 - (NSString *)defaultTextEncodingName
425 {
426     return [self _stringValueForKey: WebKitDefaultTextEncodingNamePreferenceKey];
427 }
428
429 - (void)setDefaultTextEncodingName:(NSString *)encoding
430 {
431     [self _setStringValue: encoding forKey: WebKitDefaultTextEncodingNamePreferenceKey];
432 }
433
434 - (BOOL)userStyleSheetEnabled
435 {
436     return [self _boolValueForKey: WebKitUserStyleSheetEnabledPreferenceKey];
437 }
438
439 - (void)setUserStyleSheetEnabled:(BOOL)flag
440 {
441     [self _setBoolValue: flag forKey: WebKitUserStyleSheetEnabledPreferenceKey];
442 }
443
444 - (NSURL *)userStyleSheetLocation
445 {
446     NSString *locationString = [self _stringValueForKey: WebKitUserStyleSheetLocationPreferenceKey];
447     
448     if ([locationString _web_looksLikeAbsoluteURL]) {
449         return [NSURL _web_URLWithDataAsString:locationString];
450     } else {
451         locationString = [locationString stringByExpandingTildeInPath];
452         return [NSURL fileURLWithPath:locationString];
453     }
454 }
455
456 - (void)setUserStyleSheetLocation:(NSURL *)URL
457 {
458     NSString *locationString;
459     
460     if ([URL isFileURL]) {
461         locationString = [[URL path] _web_stringByAbbreviatingWithTildeInPath];
462     } else {
463         locationString = [URL _web_originalDataAsString];
464     }
465     
466     [self _setStringValue:locationString forKey: WebKitUserStyleSheetLocationPreferenceKey];
467 }
468
469 - (BOOL)shouldPrintBackgrounds
470 {
471     return [self _boolValueForKey: WebKitShouldPrintBackgroundsPreferenceKey];
472 }
473
474 - (void)setShouldPrintBackgrounds:(BOOL)flag
475 {
476     [self _setBoolValue: flag forKey: WebKitShouldPrintBackgroundsPreferenceKey];
477 }
478
479 - (BOOL)isJavaEnabled
480 {
481     return [self _boolValueForKey: WebKitJavaEnabledPreferenceKey];
482 }
483
484 - (void)setJavaEnabled:(BOOL)flag
485 {
486     [self _setBoolValue: flag forKey: WebKitJavaEnabledPreferenceKey];
487 }
488
489 - (BOOL)isJavaScriptEnabled
490 {
491     return [self _boolValueForKey: WebKitJavaScriptEnabledPreferenceKey];
492 }
493
494 - (void)setJavaScriptEnabled:(BOOL)flag
495 {
496     [self _setBoolValue: flag forKey: WebKitJavaScriptEnabledPreferenceKey];
497 }
498
499 - (BOOL)javaScriptCanOpenWindowsAutomatically
500 {
501     return [self _boolValueForKey: WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey];
502 }
503
504 - (void)setJavaScriptCanOpenWindowsAutomatically:(BOOL)flag
505 {
506     [self _setBoolValue: flag forKey: WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey];
507 }
508
509 - (BOOL)arePlugInsEnabled
510 {
511     return [self _boolValueForKey: WebKitPluginsEnabledPreferenceKey];
512 }
513
514 - (void)setPlugInsEnabled:(BOOL)flag
515 {
516     [self _setBoolValue: flag forKey: WebKitPluginsEnabledPreferenceKey];
517 }
518
519 - (BOOL)allowsAnimatedImages
520 {
521     return [self _boolValueForKey: WebKitAllowAnimatedImagesPreferenceKey];
522 }
523
524 - (void)setAllowsAnimatedImages:(BOOL)flag;
525 {
526     [self _setBoolValue: flag forKey: WebKitAllowAnimatedImagesPreferenceKey];
527 }
528
529 - (BOOL)allowsAnimatedImageLooping
530 {
531     return [self _boolValueForKey: WebKitAllowAnimatedImageLoopingPreferenceKey];
532 }
533
534 - (void)setAllowsAnimatedImageLooping: (BOOL)flag
535 {
536     [self _setBoolValue: flag forKey: WebKitAllowAnimatedImageLoopingPreferenceKey];
537 }
538
539 - (void)setLoadsImagesAutomatically: (BOOL)flag
540 {
541     [self _setBoolValue: flag forKey: WebKitDisplayImagesKey];
542 }
543
544 - (BOOL)loadsImagesAutomatically
545 {
546     return [self _boolValueForKey: WebKitDisplayImagesKey];
547 }
548
549 - (void)setAutosaves:(BOOL)flag;
550 {
551     _private->autosaves = flag;
552 }
553
554 - (BOOL)autosaves
555 {
556     return _private->autosaves;
557 }
558
559 @end
560
561 @implementation WebPreferences (WebPrivate)
562
563 - (NSTimeInterval)_initialTimedLayoutDelay
564 {
565     return (NSTimeInterval)[[NSUserDefaults standardUserDefaults] floatForKey:WebKitInitialTimedLayoutDelayPreferenceKey];
566 }
567
568 - (int)_initialTimedLayoutSize
569 {
570     return [[NSUserDefaults standardUserDefaults] integerForKey:WebKitInitialTimedLayoutDelayPreferenceKey];
571 }
572
573 - (int)_pageCacheSize
574 {
575     return [[NSUserDefaults standardUserDefaults] integerForKey:WebKitPageCacheSizePreferenceKey];
576 }
577
578 - (int)_objectCacheSize
579 {
580     return [[NSUserDefaults standardUserDefaults] integerForKey:WebKitObjectCacheSizePreferenceKey];
581 }
582
583 - (BOOL)_initialTimedLayoutEnabled
584 {
585     return [[NSUserDefaults standardUserDefaults] boolForKey:WebKitInitialTimedLayoutEnabledPreferenceKey];
586 }
587
588 - (NSTimeInterval)_resourceTimedLayoutDelay
589 {
590     return [[NSUserDefaults standardUserDefaults] floatForKey:WebKitResourceTimedLayoutDelayPreferenceKey];
591 }
592
593 - (BOOL)_resourceTimedLayoutEnabled
594 {
595     return [[NSUserDefaults standardUserDefaults] boolForKey:WebKitResourceTimedLayoutEnabledPreferenceKey];
596 }
597
598 - (NSTimeInterval)_backForwardCacheExpirationInterval
599 {
600     return (NSTimeInterval)[[NSUserDefaults standardUserDefaults] floatForKey:WebKitBackForwardCacheExpirationIntervalKey];
601 }
602
603 - (void)setTabsToLinks:(BOOL)flag
604 {
605     [self _setBoolValue: flag forKey: WebKitTabToLinksPreferenceKey];
606 }
607
608 - (BOOL)tabsToLinks
609 {
610     return [[NSUserDefaults standardUserDefaults] boolForKey:WebKitTabToLinksPreferenceKey];
611 }
612
613 - (void)setHistoryIsFrozen:(BOOL)flag
614 {
615     [self _setBoolValue:flag forKey:WebKitHistoryIsFrozenPreferenceKey];
616 }
617
618 - (BOOL)historyIsFrozen
619 {
620     return [[NSUserDefaults standardUserDefaults] boolForKey:WebKitHistoryIsFrozenPreferenceKey];
621 }
622
623 static NSMutableDictionary *webPreferencesInstances = nil;
624
625 + (WebPreferences *)_getInstanceForIdentifier:(NSString *)ident
626 {
627         LOG (Encoding, "requesting for %@\n", ident);
628
629     if (!ident){
630         if(_standardPreferences)
631             return _standardPreferences;
632         return nil;
633     }    
634     
635     WebPreferences *instance = [webPreferencesInstances objectForKey:[self _concatenateKeyWithIBCreatorID:ident]];
636
637     return instance;
638 }
639
640 + (void)_setInstance:(WebPreferences *)instance forIdentifier:(NSString *)ident
641 {
642     if (!webPreferencesInstances)
643         webPreferencesInstances = [[NSMutableDictionary alloc] init];
644     if (ident) {
645         [webPreferencesInstances setObject:instance forKey:[self _concatenateKeyWithIBCreatorID:ident]];
646         LOG (Encoding, "recording %p for %@\n", instance, [self _concatenateKeyWithIBCreatorID:ident]);
647     }
648 }
649
650 + (void)_removeReferenceForIdentifier:(NSString *)ident
651 {
652     if (ident != nil) {
653         [webPreferencesInstances performSelector:@selector(_web_checkLastReferenceForIdentifier:) withObject: [self _concatenateKeyWithIBCreatorID:ident] afterDelay:.1];
654     }
655 }
656
657 - (void)_postPreferencesChangesNotification
658 {
659     [[NSNotificationCenter defaultCenter]
660         postNotificationName:WebPreferencesChangedNotification object:self
661                     userInfo:nil];
662 }
663
664 static NSString *classIBCreatorID = 0;
665
666 + (void)_setIBCreatorID:(NSString *)string
667 {
668     
669     if (classIBCreatorID != string){
670         [classIBCreatorID release];
671         classIBCreatorID = [string retain];
672     }
673 }
674
675 + (NSString *)_IBCreatorID
676 {
677     return classIBCreatorID;
678 }
679
680 + (NSString *)_concatenateKeyWithIBCreatorID:(NSString *)key
681 {
682     NSString *IBCreatorID = [WebPreferences _IBCreatorID];
683     if (!IBCreatorID)
684         return key;
685     return [IBCreatorID stringByAppendingString:key];
686 }
687
688 @end
689
690 @implementation NSMutableDictionary (WebPrivate)
691 - (void)_web_checkLastReferenceForIdentifier:(NSString *)identifier
692 {
693     WebPreferences *instance = [webPreferencesInstances objectForKey:identifier];
694     if ([instance retainCount] == 1)
695         [webPreferencesInstances removeObjectForKey:identifier];
696 }
697 @end
698