12bde8e466a4451c7319e3a072d118917957d6554Steve Block/*
22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved.
32bde8e466a4451c7319e3a072d118917957d6554Steve Block *
42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Redistribution and use in source and binary forms, with or without
52bde8e466a4451c7319e3a072d118917957d6554Steve Block * modification, are permitted provided that the following conditions
62bde8e466a4451c7319e3a072d118917957d6554Steve Block * are met:
72bde8e466a4451c7319e3a072d118917957d6554Steve Block * 1. Redistributions of source code must retain the above copyright
82bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer.
92bde8e466a4451c7319e3a072d118917957d6554Steve Block * 2. Redistributions in binary form must reproduce the above copyright
102bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer in the
112bde8e466a4451c7319e3a072d118917957d6554Steve Block *    documentation and/or other materials provided with the distribution.
122bde8e466a4451c7319e3a072d118917957d6554Steve Block *
132bde8e466a4451c7319e3a072d118917957d6554Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
142bde8e466a4451c7319e3a072d118917957d6554Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
152bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162bde8e466a4451c7319e3a072d118917957d6554Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
172bde8e466a4451c7319e3a072d118917957d6554Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
182bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
192bde8e466a4451c7319e3a072d118917957d6554Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
202bde8e466a4451c7319e3a072d118917957d6554Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
212bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
222bde8e466a4451c7319e3a072d118917957d6554Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
232bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE POSSIBILITY OF SUCH DAMAGE.
242bde8e466a4451c7319e3a072d118917957d6554Steve Block */
252bde8e466a4451c7319e3a072d118917957d6554Steve Block
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DOM_STORAGE)
272bde8e466a4451c7319e3a072d118917957d6554Steve Block
282bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebSecurityOriginInternal.h"
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebStorageManagerPrivate.h"
302bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebStorageManagerInternal.h"
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebStorageTrackerClient.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#import <WebCore/SecurityOrigin.h>
342bde8e466a4451c7319e3a072d118917957d6554Steve Block#import <WebCore/StorageTracker.h>
352bde8e466a4451c7319e3a072d118917957d6554Steve Block
362bde8e466a4451c7319e3a072d118917957d6554Steve Blockusing namespace WebCore;
372bde8e466a4451c7319e3a072d118917957d6554Steve Block
382bde8e466a4451c7319e3a072d118917957d6554Steve BlockNSString * const WebStorageDirectoryDefaultsKey = @"WebKitLocalStorageDatabasePathPreferenceKey";
392bde8e466a4451c7319e3a072d118917957d6554Steve BlockNSString * const WebStorageDidModifyOriginNotification = @"WebStorageDidModifyOriginNotification";
402bde8e466a4451c7319e3a072d118917957d6554Steve Block
412bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic NSString *storageDirectoryPath();
422bde8e466a4451c7319e3a072d118917957d6554Steve Block
432bde8e466a4451c7319e3a072d118917957d6554Steve Block@implementation WebStorageManager
442bde8e466a4451c7319e3a072d118917957d6554Steve Block
452bde8e466a4451c7319e3a072d118917957d6554Steve Block+ (WebStorageManager *)sharedWebStorageManager
462bde8e466a4451c7319e3a072d118917957d6554Steve Block{
472bde8e466a4451c7319e3a072d118917957d6554Steve Block    static WebStorageManager *sharedManager = [[WebStorageManager alloc] init];
482bde8e466a4451c7319e3a072d118917957d6554Steve Block    return sharedManager;
492bde8e466a4451c7319e3a072d118917957d6554Steve Block}
502bde8e466a4451c7319e3a072d118917957d6554Steve Block
512bde8e466a4451c7319e3a072d118917957d6554Steve Block- (NSArray *)origins
522bde8e466a4451c7319e3a072d118917957d6554Steve Block{
532bde8e466a4451c7319e3a072d118917957d6554Steve Block    Vector<RefPtr<SecurityOrigin> > coreOrigins;
542bde8e466a4451c7319e3a072d118917957d6554Steve Block
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::tracker().origins(coreOrigins);
562bde8e466a4451c7319e3a072d118917957d6554Steve Block
572bde8e466a4451c7319e3a072d118917957d6554Steve Block    NSMutableArray *webOrigins = [[NSMutableArray alloc] initWithCapacity:coreOrigins.size()];
582bde8e466a4451c7319e3a072d118917957d6554Steve Block
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (size_t i = 0; i < coreOrigins.size(); ++i) {
602bde8e466a4451c7319e3a072d118917957d6554Steve Block        WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:coreOrigins[i].get()];
612bde8e466a4451c7319e3a072d118917957d6554Steve Block        [webOrigins addObject:webOrigin];
622bde8e466a4451c7319e3a072d118917957d6554Steve Block        [webOrigin release];
632bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
642bde8e466a4451c7319e3a072d118917957d6554Steve Block
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    return [webOrigins autorelease];
662bde8e466a4451c7319e3a072d118917957d6554Steve Block}
672bde8e466a4451c7319e3a072d118917957d6554Steve Block
682bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)deleteAllOrigins
692bde8e466a4451c7319e3a072d118917957d6554Steve Block{
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::tracker().deleteAllOrigins();
712bde8e466a4451c7319e3a072d118917957d6554Steve Block}
722bde8e466a4451c7319e3a072d118917957d6554Steve Block
732bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)deleteOrigin:(WebSecurityOrigin *)origin
742bde8e466a4451c7319e3a072d118917957d6554Steve Block{
752bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::tracker().deleteOrigin([origin _core]);
762bde8e466a4451c7319e3a072d118917957d6554Steve Block}
772bde8e466a4451c7319e3a072d118917957d6554Steve Block
782bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)syncLocalStorage
792bde8e466a4451c7319e3a072d118917957d6554Steve Block{
802bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::tracker().syncLocalStorage();
812bde8e466a4451c7319e3a072d118917957d6554Steve Block}
822bde8e466a4451c7319e3a072d118917957d6554Steve Block
832bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)syncFileSystemAndTrackerDatabase
842bde8e466a4451c7319e3a072d118917957d6554Steve Block{
852bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::tracker().syncFileSystemAndTrackerDatabase();
862bde8e466a4451c7319e3a072d118917957d6554Steve Block}
872bde8e466a4451c7319e3a072d118917957d6554Steve Block
882bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic NSString *storageDirectoryPath()
892bde8e466a4451c7319e3a072d118917957d6554Steve Block{
902bde8e466a4451c7319e3a072d118917957d6554Steve Block    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
912bde8e466a4451c7319e3a072d118917957d6554Steve Block    NSString *storageDirectory = [defaults objectForKey:WebStorageDirectoryDefaultsKey];
922bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!storageDirectory || ![storageDirectory isKindOfClass:[NSString class]])
932bde8e466a4451c7319e3a072d118917957d6554Steve Block        storageDirectory = @"~/Library/WebKit/LocalStorage";
942bde8e466a4451c7319e3a072d118917957d6554Steve Block
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    return [storageDirectory stringByStandardizingPath];
962bde8e466a4451c7319e3a072d118917957d6554Steve Block}
972bde8e466a4451c7319e3a072d118917957d6554Steve Block
982bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebKitInitializeStorageIfNecessary()
992bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block    static BOOL initialized = NO;
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (initialized)
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::initializeTracker(storageDirectoryPath());
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::tracker().setClient(WebStorageTrackerClient::sharedWebStorageTrackerClient());
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block    initialized = YES;
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block@end
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
114